[Документация Yandex Cloud](../../../index.md) > [Yandex Serverless Integrations](../../index.md) > [Концепции](../index.md) > Workflows > Рабочий процесс

# Рабочий процесс

_Рабочий процесс_ — событийно-ориентированное приложение, состоящее из [интеграционных](yawl/index.md#integration-steps) и [управляющих](yawl/index.md#management-steps) _шагов_ и переходов между ними. Возможные атрибуты шага:

* название и описание;
* фильтры для входных и выходных данных — jq-шаблоны, фильтрующие состояние рабочего процесса, которое передается в шаг или является результатом его работы;
* набор действий, которые нужно сделать во время выполнения шага;
* таймаут выполнения;
* политика повторных попыток, которая применяется, если шаг завершился с ошибкой. Если шаг не может быть выполнен из-за исчерпания квоты или его выполнение завершилось с ошибкой, Workflows будет пытаться повторно выполнить шаг согласно политике повторных попыток. В итоге шаг может выполниться успешно или завершиться с ошибкой, если последняя попытка запуска окажется неуспешной. При завершении шага с ошибкой весь [запуск](execution.md) переходит в статус `Ошибка` и все дальнейшие шаги не выполняются.

Шаги описываются:
* в [спецификации YaWL](yawl/index.md). В описании каждого шага, кроме последнего, должен быть указан следующий шаг.
* с помощью [конструктора спецификации](../../operations/workflows/constructor/index.md).

В настройках рабочего процесса можно:
* указать пользовательскую сеть, в которой он будет выполняться. Рабочий процесс при этом будет иметь доступ к ресурсам в этой сети.
* указать сервисный аккаунт, который будет использоваться для получения доступа к закрытым ресурсам, например потокам данных Yandex Data Streams.
* включить опцию **Публичный рабочий процесс**. Тогда рабочий процесс сможет запустить любой пользователь. Подробнее в [Запуск рабочего процесса](execution.md).

## Состояние рабочего процесса {#state}

Начальное _состояние рабочего процесса_ — это JSON-объект с ключом `input`, значение которого — входные данные рабочего процесса. Если входные данные являются JSON-объектом, дополнительно к ключу `input` добавляются все ключи из входных данных рабочего процесса.

{% cut "Примеры входных данных и начальных состояний рабочего процесса" %}

Входные данные | Состояние рабочего процесса
--- | ---
`{"a": "b", "c": 12}` | `{"input": {"a": "b", "c": 12}, "a": "b", "c": 12}`
`[1, 2, 3]` | `{"input": [1, 2, 3]}`

{% endcut %}

Во время выполнения запуска:
* состояние рабочего процесса передается в качестве входных данных (`input`) в шаг;
* выходные данные (`output`) шагов добавляются в состояние рабочего процесса в том порядке, в котором выполняются шаги.

Используя jq-шаблоны, можно фильтровать:
* состояние рабочего процесса, которое передается в качестве входных данных (`input`) в шаг;
* выходные данные (`output`), которые добавляются в состояние рабочего процесса.

{% note info %}

Состояние рабочего процесса в каждый момент времени является JSON-объектом.

{% endnote %}

Выходные данные каждого шага добавляются в состояние рабочего процесса путем слияния их с текущим состоянием по верхнеуровневым ключам. Поэтому возможна перезапись части данных состояния. Например, если перед запуском шага состояние было JSON-объектом вида `{“numbers“: [1,2,3,4], “strings”: [“a”, “b”, “c”]}`, а выходные данные шага — `{“strings”: [“d”, “e”]}`, новым состоянием станет JSON-объект вида `{“numbers“: [1,2,3,4], “strings”: [“d”, “e”]}`.

Результат выполнения рабочего процесса — выходные данные последнего шага, для которого возможно задать значение поля `output`. 

### Состояние рабочего процесса при выполнении шага Parallel {#state-for-Parallel}

Для шага [Parallel](yawl/management/parallel.md) состояние рабочего процесса копируется в каждую ветку и в рамках каждой ветки изменяется независимо. Выходными данными шага Parallel до фильтрации является объект, где ключи — уникальные имена веток выполнения, а значения — выходные данные последних шагов соответствующих веток.

### Состояние рабочего процесса при выполнении шага Foreach {#state-for-Foreach}

После фильтрации входных данных шаг [Foreach](yawl/management/foreach.md) принимает на вход JSON-массив, состоящий из JSON-объектов. После выполнения последовательности шагов в `do` для каждого элемента массива формируется результат. Результат представляет собой JSON-объект, который складывается в массив на ту же позицию, где находился исходный JSON-объект. Это значит, что для шага Foreach поля `input` и `output` обязательны:
* `input` — для преобразования состояния из JSON-объекта в массив;
* `output` — для преобразования результата выполнения шага из массива в JSON-объект, который можно добавить в состояние рабочего процесса.

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

* [Автоматическая загрузка данных в Yandex SpeechSense с помощью Yandex Workflows](../../tutorials/auto-upload.md)
* [Настройка рабочего процесса Workflows с интеграцией с Яндекс Трекер, Yandex AI Studio и Yandex Cloud Postbox](../../tutorials/tracker-yandexgpt-postbox-integrations.md)

## Полезные ссылки {#see-also}

* [Пример спецификации YaWL](yawl/index.md#spec-example)