[Документация Yandex Cloud](../../../index.md) > [Yandex Serverless Integrations](../../index.md) > [Концепции](../index.md) > Workflows > Шаблонизация

# Шаблонизация

Для полей [спецификации YaWL](yawl/index.md), которые поддерживают шаблонизацию, значения могут генерироваться динамически с использованием данных, полученных из состояния рабочего процесса. Язык шаблонизации — `jq`. Подробнее в [документации jq](https://jqlang.github.io/jq/manual/).

По умолчанию шаблонизация не применяется для строковых значений полей — используйте [интерполяцию строк](https://jqlang.github.io/jq/manual/#string-interpolation).

## Входные данные для шаблонизатора {#input-data}

Входные данные для шаблонизатора различаются в зависимости от поля.

Поле | Входные данные
--- | ---
`input` | [Состояние рабочего процесса](workflow.md#state), которое было до начала выполнения шага. Например, если шаг верхнеуровневый — полное состояние рабочего процесса, если шаг внутри ветки выполнения шага [Parallel](yawl/management/parallel.md) — состояние рабочего процесса, отфильтрованное с помощью параметра `input` шага Parallel и измененное во время выполнения предыдущих шагов в ветке.
`output` | Выходные данные шага.
Другие поля, которые поддерживают шаблонизацию | JSON-объект, отфильтрованный с помощью `input`.

### Примеры использования шаблонизатора {#templator-examples}

Пример состояния рабочего процесса:

```json
{
  "data": [
    {
      "some_property_0": "value_0"
    },
    {
      "some_property_1": "value_1"
    }
  ],
  "a": {
    "b": {
      "c": "value_2"
    }
  }
}
```

Значение поля | Интерпретация шаблонизатора
--- | ---
`this is just a string` | Строка без применения шаблонизации
`this is a value from workflow state \(.data[1].some_property_1)` | `this is a value from workflow state value_1`
`\({x: 1, y: .a.b.c})` | `{“x”: 1, “y”: “value_2”}` 

## Расширения шаблонизатора {#extensions}

Расширения шаблонизатора позволяют вызывать jq-функции, реализующие нестандартную логику.

### Переменная $global {#global}

Переменная `$global` возвращает верхнеуровневое состояние рабочего процесса, которое было перед началом выполнения текущего верхнеуровнего шага. Например, в шаге [Foreach](yawl/management/foreach.md) фильтрация входных данных — обязательный атрибут, и переменную `$global` можно использовать при выполнении последовательности шагов, указанных в `do`, чтобы обратиться к верхнеуровневому состоянию рабочего процесса — состоянию рабочего процесса, которое было до начала выполнения шага Foreach.

### Переменная $counter {#counter}

Переменная `$counter` возвращает текущий индекс операции (индексация начинается с нуля). Переменную можно использовать внутри поля `condition` шага [While](yawl/management/while.md) и внутри полей `input` шагов, указанных в `do`, например:

```yaml
while:
  max_iterations: 5
  do:
    start: my_step
    steps:
      my_step:
        httpCall:
          input: |-
            {
              "url": "\("my-url-iter-" + ($counter | tostring))"
            }
          url: \(.url)
```

### Yandex Lockbox {#lockbox-extension}

Специальная jq-функция `lockboxPayload` позволяет получать значение [секрета Yandex Lockbox](../../../lockbox/concepts/secret.md) по его идентификатору, ключу и (опционально) [версии](../../../lockbox/concepts/secret.md#version). Чтобы расширение работало корректно, в настройках [рабочего процесса](workflow.md) должен быть указан [сервисный аккаунт](../../../iam/concepts/users/service-accounts.md), у которого есть права на просмотр содержимого секретов (например, с назначенной [ролью](../../../lockbox/security/index.md#lockbox-payloadViewer) `lockbox.payloadViewer`). Функция доступна для использования во всех полях интеграционных шагов, кроме поля `input`.

Описание аргументов jq-функции `lockboxPayload`:

Очередность аргумента | Тип | Обязательное | Описание
--- | --- | --- | ---
1 | `string` | Да | Идентификатор секрета.
2 | `string` | Да | Ключ секрета.
3 | `string` | Нет | Идентификатор версии секрета.

#### Примеры использования jq-функции `lockboxPayload` {#lockbox-examples}

* Получение последней версии секрета:

    ```text
    \(lockboxPayload("<идентификатор_секрета>"; "<ключ_секрета>"))
    ```
* Получение указанной версии секрета:

    ```text
    \(lockboxPayload("<идентификатор_секрета>"; "<ключ_секрета>"; "<идентификатор_версии_секрета>"))
    ```