BPMN-процессы
Если форма работает по BPMN-схеме, задачи по ней движутся не по этапам, а по блокам диаграммы. В API блоки схемы называются узлами (nodes), а стрелки между ними — переходами (flows).
Положение задачи в процессе описывают токены. Токен — это метка, которая стоит на узле схемы и показывает, где сейчас находится задача и чего от неё ждут. У задачи может быть несколько токенов одновременно — например, после шлюза AND на каждую параллельную ветку приходится свой токен. Когда ветки сходятся, их токены завершаются, а дальше идёт новый токен.
Методы API, описанные в этом разделе, позволяют:
- узнать, на каких узлах находится задача и от кого она ждёт действий;
- увидеть, как комментарий продвинул задачу по схеме;
- согласовать задачу на конкретном узле, возобновить остановленный процесс или вручную перенести токен;
- получить описание BPMN-диаграммы формы и список её версий;
- найти в реестре задачи, стоящие на нужных узлах.
- GET/
forms/ {form-id}/ bpmnСписок версий BPMN-диаграммы формы - GET/
forms/ {form-id}/ bpmn/ {bpmn-version}Описание версии BPMN-диаграммы формы
BPMN-поля в описании формы
Методы GET /forms и GET /forms/{form-id} возвращают в описании формы два дополнительных поля:
| use_bpmn_for_new_tasks | Логическое значение. true — новые задачи по форме создаются и движутся по BPMN-схеме. |
| bpmn_version | Целое число. Номер версии диаграммы, по которой создаются новые задачи. Возвращается, только если use_bpmn_for_new_tasks = true. |
{
"id": 1204,
"name": "Payment request",
"use_bpmn_for_new_tasks": true,
"bpmn_version": 3
}
BPMN-поля задачи
Метод GET /tasks/{task-id} возвращает для задач по BPMN-схеме дополнительные поля. У задач, которые идут по обычной маршрутизации, этих полей нет.
| bpmn_version | Целое число. Номер версии диаграммы, по которой идёт задача. |
| bpmn_suspended | Логическое значение. true — в задаче есть токены, остановленные из-за ошибки. |
| bpmn_tokens | Массив токенов: на каких узлах сейчас находится задача. Не возвращается, если нет токенов. |
Элемент bpmn_tokens
| token_id | Целое число. Идентификатор токена. |
| node_id | Целое число. Идентификатор узла, на котором стоит токен. |
| node_name | Строка. Название узла. Может отсутствовать. |
| node_type | Строка. Тип узла. Может отсутствовать. |
| status | Строка. Состояние токена. |
| person | Объект пользователя, от которого ждут действия. Может отсутствовать. |
| event_type | Строка. Ожидаемое событие. Возвращается только для узлов ожидания. |
| event_time | Дата и время срабатывания события. Возвращается только для узлов типа Timer. |
GET https://api.pyrus.com/v4 /tasks /91827364
Тело ответа
{
"task": {
"id": 91827364,
"text": "Payment request for invoice No. 4417",
"form_id": 1204,
"bpmn_version": 3,
"bpmn_suspended": false,
"bpmn_tokens": [
{
"token_id": 1,
"node_id": 12,
"node_name": "Legal approval",
"node_type": "Activity",
"status": "Active",
"person": {
"id": 4471,
"first_name": "Mary",
"last_name": "Smith"
}
},
{
"token_id": 2,
"node_id": 18,
"node_name": "Wait 3 business days",
"node_type": "Timer",
"status": "Waiting",
"event_type": "Timer",
"event_time": "2026-09-05T09:00:00Z"
}
]
// ...
}
}
В этом примере задача находится одновременно в двух параллельных ветках: в одной ждёт согласования юриста, в другой — срабатывания таймера.
BPMN-поля в комментарии задачи
Если комментарий продвинул задачу по схеме, в нём возвращается массив bpmn_transitions. Если комментарий не двигал токены, поля нет.
Элемент bpmn_transitions
| token_id | Целое число. Идентификатор токена. |
| node_id | Целое число. Идентификатор узла, на который перешёл токен. Не возвращается, если токен завершился. |
| node_name | Строка. Название узла. Может отсутствовать. |
Если в элементе есть только token_id, значит, этот комментарий завершил токен и токена больше не существует. Токены, которые комментарий создал и тут же завершил, в массив не попадают.
{
"id": 55510293,
"text": "Approved",
"approval_choice": "approved",
"bpmn_transitions": [
{ "token_id": 1 },
{ "token_id": 2 },
{ "token_id": 7, "node_id": 24, "node_name": "Payment" }
]
}
В этом примере токены 1 и 2 завершились на шлюзе слияния, а вместо них по схеме пошёл токен 7.
Действия с задачей по BPMN-схеме
Метод POST /tasks/{task-id}/comments принимает дополнительные параметры для задач по BPMN-схеме. Все они необязательные.
| bpmn_node_id | Целое число. Идентификатор узла, на котором вы согласуете задачу. Передаётся вместе с параметром approval_choice. |
| bpmn_resume_processing | Логическое значение. true — возобновить обработку токенов, остановленных из-за ошибки. Значение false ни на что не влияет. |
| bpmn_token_moves | Массив объектов: какие токены и на какие узлы перенести вручную. Каждый объект содержит два обязательных поля:
|
Согласование на конкретном узле
Если задача разошлась на параллельные ветки и пользователя ждут сразу на нескольких узлах, укажите в bpmn_node_id, на каком узле вы выполняете действие.
POST https://api.pyrus.com/v4 /tasks /91827364 /comments
Тело запроса
{
"text": "No objections",
"approval_choice": "approved",
"bpmn_node_id": 12
}
Тело ответа
{
"task": {
"id": 91827364,
"bpmn_version": 3,
"bpmn_suspended": false,
"bpmn_tokens": [
{
"token_id": 1,
"node_id": 20,
"node_name": "Accounting review",
"node_type": "Activity",
"status": "Active",
"person": {
"id": 1731,
"first_name": "Bob",
"last_name": "Johnson"
}
},
{
"token_id": 2,
"node_id": 18,
"node_name": "Wait 3 business days",
"node_type": "Timer",
"status": "Waiting",
"event_type": "Timer",
"event_time": "2026-09-05T09:00:00Z"
}
],
"comments": [
// ...
{
"id": 55510294,
"text": "No objections",
"approval_choice": "approved",
"bpmn_transitions": [
{ "token_id": 1, "node_id": 20, "node_name": "Accounting review" }
]
}
]
// ...
}
}
Возобновление после ошибки
Если токен остановился из-за ошибки ("status": "Suspended", у задачи "bpmn_suspended": true), устраните причину и возобновите обработку. Токен продолжит выполнение с того же узла.
POST https://api.pyrus.com/v4 /tasks /91827364 /comments
Тело запроса
{
"text": "Bot access granted, resuming",
"bpmn_resume_processing": true
}
Тело ответа
{
"task": {
"id": 91827364,
"bpmn_version": 3,
"bpmn_suspended": false,
"bpmn_tokens": [
{
"token_id": 3,
"node_id": 15,
"node_name": "Upload invoice",
"node_type": "Activity",
"status": "Active"
}
],
"comments": [
// ...
{
"id": 55510295,
"text": "Bot access granted, resuming"
}
]
// ...
}
}
Ручной перенос токенов
Токен можно перенести на другой узел в обход условий маршрутизации. За один комментарий можно перенести несколько токенов.
POST https://api.pyrus.com/v4 /tasks /91827364 /comments
Тело запроса
{
"text": "Returning for revision",
"bpmn_token_moves": [
{ "token_id": 1, "node_id": 8 }
]
}
Тело ответа
{
"task": {
"id": 91827364,
"bpmn_version": 3,
"bpmn_suspended": false,
"bpmn_tokens": [
{
"token_id": 1,
"node_id": 8,
"node_name": "Prepare request",
"node_type": "Activity",
"status": "Active",
"person": {
"id": 1731,
"first_name": "Bob",
"last_name": "Johnson"
}
}
],
"comments": [
// ...
{
"id": 55510296,
"text": "Returning for revision",
"bpmn_transitions": [
{ "token_id": 1, "node_id": 8, "node_name": "Prepare request" }
]
}
]
// ...
}
}
curl
curl -X POST \
'https://api.pyrus.com/v4/tasks/91827364/comments' \
-H 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"text": "Returning for revision",
"bpmn_token_moves": [
{ "token_id": 1, "node_id": 8 }
]
}'
Обратите внимание: токен нельзя перенести на узел, где он уже стоит, и нельзя перенести из одной параллельной ветки в другую. Действия bpmn_resume_processing и bpmn_token_moves не выполняются в закрытой задаче — сначала переоткройте её.
Поиск задач в реестре по узлам схемы
Метод GET /forms/{form-id}/register принимает два дополнительных параметра для форм с BPMN-схемой. Их можно сочетать с остальными фильтрами реестра.
| bpmn_nodes | Идентификаторы узлов схемы. В результат попадут только задачи, у которых хотя бы один токен стоит на одном из указанных узлов. В GET-запросе идентификаторы передаются через запятую, в POST-запросе — массивом. Если параметр не указан или пуст, фильтр не применяется. |
| bpmn_suspended | true (или y) — только задачи с токенами, остановленными из-за ошибки; false (или n) — только задачи без таких токенов. Если параметр не указан, фильтр не применяется. |
Пример GET-запроса:
GET https://api.pyrus.com/v4/forms/1204/register?bpmn_nodes=12,18
То же в POST-запросе — параметры передаются в теле:
{
"bpmn_nodes": [12, 18],
"bpmn_suspended": false
}
Узлы из списка объединяются по условию ИЛИ: достаточно, чтобы токен стоял на любом из них. Если указать идентификатор несуществующего узла, ошибки не будет, но результат окажется пустым.
Подсказка: идентификаторы узлов можно узнать с помощью метода GET /forms/{form-id}/bpmn/{bpmn-version}.
GET /forms/{form-id}/bpmn
Метод возвращает список версий BPMN-диаграммы формы. Доступен всем, у кого есть доступ к форме.
GET https://api.pyrus.com/v4 /forms /1204 /bpmn
Тело ответа
{
"form_id": 1204,
"active_bpmn_version": 3,
"versions": [
{
"bpmn_version": 4,
"description": "Draft with legal review",
"create_date": "2026-09-20T08:15:00Z",
"author": {
"id": 4471,
"first_name": "Mary",
"last_name": "Smith",
"type": "user"
}
},
{
"bpmn_version": 3,
"create_date": "2026-08-01T10:00:00Z"
}
]
}
curl
curl -X GET \ 'https://api.pyrus.com/v4/forms/1204/bpmn' \ -H 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'
Поля ответа
| form_id | Целое число. Идентификатор формы. |
| active_bpmn_version | Целое число. Номер версии, по которой создаются новые задачи. Возвращается, только если у формы use_bpmn_for_new_tasks = true. |
| versions | Массив версий диаграммы по убыванию номера, включая удалённые. Пустой массив, если версий нет. Каждая версия содержит поля:
|
GET /forms/{form-id}/bpmn/{bpmn-version}
Метод возвращает описание указанной версии BPMN-диаграммы формы: узлы, переходы между ними, условия видимости полей и текстовые рамки. Доступен всем, у кого есть доступ к форме.
Версия 0 есть у формы всегда: пока её не сохранили, она возвращается пустой. Удалённая версия тоже возвращается — с полем delete_date. Пустые массивы в ответ не попадают.
GET https://api.pyrus.com/v4 /forms /1204 /bpmn /3
Тело ответа
{
"form_id": 1204,
"bpmn_version": 3,
"active_bpmn_version": 3,
"create_date": "2026-08-01T10:00:00Z",
"active_task_nodes": [12],
"nodes": [
{
"id": 1,
"node_type": "Start",
"position": { "x": 40, "y": 200 },
"flows": [ { "id": 1, "to_node_id": 12 } ]
},
{
"id": 12,
"node_type": "Activity",
"description": "Legal approval",
"participant": {
"person": {
"id": 4471,
"first_name": "Mary",
"last_name": "Smith",
"type": "user"
}
},
"actions": ["Approve", "Reject"],
"position": { "x": 240, "y": 200 },
"flows": [ { "id": 2, "to_node_id": 2 } ]
},
{
"id": 2,
"node_type": "Finish",
"position": { "x": 440, "y": 200 }
}
],
"field_visibility_conditions": [
{
"field_id": 7,
"condition": { "field_id": 5, "condition_type": 3 }
}
]
}
curl
curl -X GET \ 'https://api.pyrus.com/v4/forms/1204/bpmn/3' \ -H 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'
Поля ответа
| form_id | Целое число. Идентификатор формы. |
| bpmn_version | Целое число. Номер версии. |
| active_bpmn_version | Целое число. Номер версии, по которой создаются новые задачи. Возвращается, только если у формы use_bpmn_for_new_tasks = true. |
| description | Строка. Описание версии. Может отсутствовать. |
| create_date | Дата создания версии. Не возвращается для несохранённой версии 0. |
| delete_date | Дата удаления версии. Возвращается только для удалённых версий. |
| author | Объект пользователя — автор версии. Может отсутствовать. |
| active_task_nodes | Массив целых чисел. Идентификаторы узлов, на которых сейчас стоят токены задач. |
| nodes | Массив узлов диаграммы. |
| deleted_nodes | Массив удалённых узлов. По ним ещё могут идти задачи, на них могут ссылаться токены в bpmn_tokens. |
| field_visibility_conditions | Массив условий видимости полей формы в этой версии. Каждый элемент содержит поля:
|
| frames | Массив текстовых рамок на диаграмме. Каждая рамка содержит поля:
|
Элемент nodes
Формат одинаковый для массивов nodes и deleted_nodes.
| id | Целое число. Идентификатор узла. Совпадает с node_id в bpmn_tokens и bpmn_transitions. |
| node_type | Строка. Тип узла. |
| description | Строка. Название узла. Может отсутствовать. |
| participant | Объект: участник, от которого ждут действия. |
| subprocess_configuration | Объект: настройки подпроцесса. Возвращается только для узлов типа Subprocess. |
| timer | Объект: настройки таймера. Возвращается только для узлов типа Timer. |
| awaiting_statuses | Массив целых чисел. Статусы задачи, которых ждёт узел. Возвращается только для узлов типа AwaitingStatus. |
| task_status | Целое число. Статус, который получает задача, когда доходит до узла. |
| actions | Массив строк. Действия, доступные участнику: Approve (утвердить), Reject (отклонить), Acknowledge (ознакомиться), Complete (выполнить), Sign (подписать). |
| reference_node_id | Целое число. Связанный узел: для узла AND_Split — парный ему узел AND_Join. |
| flow_group_id | Целое число. Ветка шлюза AND, к которой относится узел. |
| position | Объект. Координаты узла на диаграмме: x, y. |
| flows | Массив исходящих переходов. |
| deleted_flows | Массив удалённых исходящих переходов. |
Элемент participant
| person | Объект: пользователь, роль или бот. Формат такой же, как у пользователя, тип указан в поле type. |
| contact_field_id | Целое число. Поле «Контакт», из которого берётся участник. |
| contact_field_form_field_id | Целое число. Поле связанной формы, если контакт берётся из неё. |
| queue_node_id | Целое число. Узел-очередь, из которого берётся участник. |
| workflow_catalog_column | Объект. Участник берётся из колонки справочника. Содержит поля catalog_id, column_id, column_name, field_id, is_manager. |
| workflow_by_department_column | Объект. Участник берётся из оргструктуры. Содержит поля catalog_id, column_id, column_name, а также apply_to_task_author или contact_field_id. |
Элемент flows
Формат одинаковый для массивов flows и deleted_flows.
| id | Целое число. Идентификатор перехода. |
| to_node_id | Целое число. Идентификатор узла, в который ведёт переход. |
| condition | Объект: условие перехода. Может отсутствовать. |
| is_default | Логическое значение. Переход по умолчанию у шлюза XOR. Возвращается, только если равно true. |
| vertex_no | Целое число. Вершина шлюза, из которой выходит переход. |
| to_vertex_no | Целое число. Вершина шлюза, в которую входит переход. |
| hint_position | Объект. Координаты подписи условия на диаграмме: x, y. |
Элемент timer
| mode | Строка. Как отсчитывается время: RelativeTime — календарное время, RelativeOrgWorkTime — рабочее время организации. |
| days | Целое число. Дни. |
| hours | Целое число. Часы. |
| minutes | Целое число. Минуты. |
Элемент subprocess_configuration
Формат такой же, как у настроек подпроцесса в описании формы.
| subprocess_form_id | Целое число. Идентификатор формы подпроцесса. |
| wait_until_subprocess_finished | Логическое значение. Ждать ли завершения подпроцесса. |
| field_mappings | Массив. Соответствие полей основной формы и формы подпроцесса. |
| update_main_fields_mode | Строка. Когда обновлять поля основной задачи. |
| update_main_fields_on_step | Целое число. Этап, на котором обновляются поля основной задачи. |
| finish_subprocess_tasks_when_main_is_finished | Логическое значение. Завершать ли задачи подпроцесса вместе с основной задачей. |
| subprocess_guid | Строка. Идентификатор настройки подпроцесса. |
| map_changes_only_on_subprocess_step | Логическое значение. Переносить изменения только на шаге подпроцесса. |
Элемент condition
Формат такой же, как у условий маршрутизации в описании формы.
| field_id | Целое число. Поле формы, по которому проверяется условие. |
| condition_type | Целое число. Тип условия. |
| value | Строка. Значение для сравнения. |
| values | Массив строк. Значения для сравнения. |
| catalog_column | Целое число. Колонка справочника. Только для полей типа catalog. |
| children | Массив вложенных условий. |
Значения перечислений
Состояние токена (status)
| Active | Токен ждёт действия пользователя. |
| Waiting | Токен ждёт события: срабатывания таймера или нужного статуса задачи. |
| Completed | Токен дошёл до конца процесса. |
| Suspended | Токен остановлен из-за ошибки. Чтобы продолжить, используйте параметр bpmn_resume_processing. |
| Terminated | Задача завершена принудительно. |
Тип узла (node_type)
| Start | Старт процесса. |
| Finish | Завершение процесса. |
| Activity | Действие. |
| XOR | Шлюз XOR. |
| AND_Split | Ветвящийся шлюз AND. |
| AND_Join | Шлюз слияния AND. |
| Subprocess | Подпроцесс. |
| Queue | Очередь. |
| Timer | Таймер ожидания времени. |
| AwaitingStatus | Таймер ожидания статуса. |
Подробнее о блоках схемы — в статье BPMN-маршрутизация.
Ожидаемое событие (event_type)
| Timer | Срабатывание таймера. |
| AwaitingStatus | Переход задачи в нужный статус. |
Коды ошибок
| Код | Описание |
|---|---|
| bpmn_token_not_found | Токен не найден в задаче, или на указанном узле нет действия, которое ждёт вашего согласования. Возникает, если в bpmn_token_moves указан несуществующий token_id или вместе с approval_choice передан bpmn_node_id узла, на котором у вас нет активного действия. |
| bpmn_node_not_found | В схеме процесса нет узла, на который нужно перенести токен. Возникает, если в bpmn_token_moves указан неверный node_id. |
| bpmn_invalid_token_move | Токен нельзя перенести: узел назначения совпадает с текущим, переход запрещён структурой схемы (например, из одной параллельной ветки в другую) или один и тот же token_id указан в запросе дважды. |
| bpmn_engine_failure | Не удалось обработать схему процесса задачи. Обычно это значит, что форма или схема удалены либо версия схемы недоступна. Может возникнуть при любом действии с задачей по BPMN-схеме. |
| bpmn_task_closed | Задача закрыта. Действия bpmn_resume_processing и bpmn_token_moves в закрытой задаче не выполняются — сначала переоткройте её. |
| bpmn_diagram_version_not_found | У формы нет указанной версии диаграммы. Возникает в методе GET /forms/{form-id}/bpmn/{bpmn-version}. |
| access_denied_form | Нет доступа к форме (HTTP 403). Возникает в методах GET /forms/{form-id}/bpmn и GET /forms/{form-id}/bpmn/{bpmn-version}. |
Обратите внимание: приложения, которые используют библиотеку PyrusApiClient версии 2.1.11.1 и ниже, вместо этих кодов получат ошибку server_error.