BPMN-процессы

Облачный Pyrus
Безоблачный Pyrus

Если форма работает по BPMN-схеме, задачи по ней движутся не по этапам, а по блокам диаграммы. В API блоки схемы называются узлами (nodes), а стрелки между ними — переходами (flows).

Положение задачи в процессе описывают токены. Токен — это метка, которая стоит на узле схемы и показывает, где сейчас находится задача и чего от неё ждут. У задачи может быть несколько токенов одновременно — например, после шлюза AND на каждую параллельную ветку приходится свой токен. Когда ветки сходятся, их токены завершаются, а дальше идёт новый токен.

Методы API, описанные в этом разделе, позволяют:

  • узнать, на каких узлах находится задача и от кого она ждёт действий;
  • увидеть, как комментарий продвинул задачу по схеме;
  • согласовать задачу на конкретном узле, возобновить остановленный процесс или вручную перенести токен;
  • получить описание 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Массив объектов: какие токены и на какие узлы перенести вручную. Каждый объект содержит два обязательных поля:
  • token_id — идентификатор переносимого токена;
  • node_id — идентификатор узла, на который нужно перенести токен.

Согласование на конкретном узле

Если задача разошлась на параллельные ветки и пользователя ждут сразу на нескольких узлах, укажите в 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_suspendedtrue (или 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Массив версий диаграммы по убыванию номера, включая удалённые. Пустой массив, если версий нет. Каждая версия содержит поля:
  • bpmn_version — номер версии;
  • description — описание версии (может отсутствовать);
  • create_date — дата создания;
  • delete_date — дата удаления (только у удалённых версий);
  • author — автор версии (может отсутствовать).

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Массив условий видимости полей формы в этой версии. Каждый элемент содержит поля:
  • field_id — идентификатор поля формы, видимость которого задаётся;
  • condition — условие, при котором поле видно.
framesМассив текстовых рамок на диаграмме. Каждая рамка содержит поля:
  • id — идентификатор рамки;
  • description — текст рамки;
  • position — координаты рамки: x, y;
  • size — размер рамки: w (ширина), h (высота).

Элемент 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.

Была ли эта статья полезной?