Документация / BPMN

Подпроцессы

Подпроцесс (sub-process) — действие, внутри которого свой процесс со своими событиями, задачами и шлюзами. Подпроцессы помогают декомпозировать модель: на верхнем уровне показывают крупные этапы, детали — внутри.

Свёрнутый и развёрнутый подпроцесс

  • Свёрнутый — выглядит как задача со знаком «+» внизу; детали скрыты (в редакторе их можно открыть на отдельном листе).
  • Развёрнутый — рамка, внутри которой видна вся логика.

Внутри подпроцесс начинается с начального события без триггера и заканчивается конечными событиями. Когда все ветви подпроцесса завершились, маркер выходит из подпроцесса по его исходящему потоку.

<bpmn:subProcess id="Delivery" name="Доставить заказ">
  <bpmn:startEvent id="DeliveryStart" />
  <bpmn:task id="Pack" name="Упаковать" />
  <bpmn:task id="Hand" name="Передать курьеру" />
  <bpmn:endEvent id="DeliveryEnd" />
  <bpmn:sequenceFlow id="D1" sourceRef="DeliveryStart" targetRef="Pack" />
  <bpmn:sequenceFlow id="D2" sourceRef="Pack" targetRef="Hand" />
  <bpmn:sequenceFlow id="D3" sourceRef="Hand" targetRef="DeliveryEnd" />
</bpmn:subProcess>

Вызов процесса

Вызывающее действие (call activity) — рамка с толстой границей. Оно запускает отдельный, повторно используемый процесс, который описан в другом месте: например, «Проверить контрагента» может вызываться из процессов закупки, продажи и аренды. В отличие от встроенного подпроцесса, вызываемый процесс ничего не знает о вызывающем и получает данные только через явные входы и выходы.

<bpmn:callActivity id="CheckPartner" name="Проверить контрагента" calledElement="Process_PartnerCheck" />

Событийный подпроцесс

Событийный подпроцесс (event sub-process, triggeredByEvent="true") рисуется пунктирной рамкой внутри процесса и не соединяется с ним потоками. Он запускается, когда в процессе происходит событие — приходит сообщение, срабатывает таймер, возникает ошибка. Его начальное событие может быть:

  • прерывающим (сплошная граница) — основной процесс останавливается, работает только подпроцесс;
  • непрерывающим (пунктирная граница) — подпроцесс работает параллельно с основным процессом.

Типичный пример — «Клиент отменил заказ»: в какой бы момент ни пришло сообщение об отмене, процесс её обработает.

<bpmn:subProcess id="OnCancel" name="Отмена заказа" triggeredByEvent="true">
  <bpmn:startEvent id="CancelReceived" name="Запрос отмены" isInterrupting="true">
    <bpmn:messageEventDefinition messageRef="Msg_Cancel" />
  </bpmn:startEvent>
  <!-- обработка отмены -->
</bpmn:subProcess>

Транзакция

Транзакция (transaction) — подпроцесс с двойной рамкой. Все её действия должны завершиться успешно вместе; если что-то пошло не так, выполненные шаги отменяются задачами компенсации, а процесс уходит по граничному событию отмены. Пример: бронирование тура — перелёт, отель и трансфер бронируются только вместе.

Произвольный подпроцесс

Произвольный подпроцесс (ad-hoc sub-process) помечается тильдой «~». Задачи внутри него выполняются в любом порядке и любое число раз — по решению исполнителя. Подходит для творческой или экспертной работы: «Подготовить коммерческое предложение» может включать расчёты, согласования и правки в произвольной последовательности.

<bpmn:adHocSubProcess id="Proposal" name="Подготовить предложение">
  <bpmn:task id="Calc" name="Рассчитать стоимость" />
  <bpmn:task id="Agree" name="Согласовать скидку" />
</bpmn:adHocSubProcess>

Обновлено: 30 сентября 2026 г.