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

Шлюзы

Шлюз (gateway) — ромб, который управляет ветвлением и слиянием потоков. Шлюз ничего не делает сам: решение принимается раньше (в задаче), а шлюз лишь направляет маркер по одной или нескольким ветвям. Поэтому название шлюза — вопрос («Заявка одобрена?»), а названия исходящих потоков — ответы («Да», «Нет»).

Исключающий шлюз

Исключающий шлюз (exclusive gateway, «XOR») — пустой ромб или ромб с крестиком. При ветвлении маркер уходит ровно по одной ветви — первой, чьё условие выполнилось; если ни одно не выполнилось, — по потоку по умолчанию. При слиянии шлюз пропускает каждый пришедший маркер дальше, не дожидаясь остальных.

<bpmn:exclusiveGateway id="Approved" name="Заявка одобрена?" default="Flow_No" />
<bpmn:sequenceFlow id="Flow_Yes" name="Да" sourceRef="Approved" targetRef="Pay">
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">approved = true</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_No" name="Нет" sourceRef="Approved" targetRef="Notify" />

Параллельный шлюз

Параллельный шлюз (parallel gateway, «AND») — ромб с плюсом. При ветвлении маркер уходит по всем ветвям одновременно, условия не проверяются. При слиянии шлюз ждёт маркеры со всех входящих потоков и только потом пропускает процесс дальше.

<bpmn:parallelGateway id="Split" />
<bpmn:task id="Invoice" name="Выставить счёт" />
<bpmn:task id="Pack" name="Собрать заказ" />
<bpmn:parallelGateway id="Join" />

Включающий шлюз

Включающий шлюз (inclusive gateway, «OR») — ромб с кружком. При ветвлении маркер уходит по всем ветвям, чьи условия выполнились (одной или нескольким). При слиянии шлюз ждёт маркеры только с тех ветвей, которые реально были запущены. Пример: для заказа нужны «Доставка» и/или «Установка» — в зависимости от выбранных услуг.

Шлюз по событиям

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

<bpmn:eventBasedGateway id="WaitAnswer" />
<bpmn:intermediateCatchEvent id="Answer" name="Ответ клиента">
  <bpmn:messageEventDefinition messageRef="Msg_Answer" />
</bpmn:intermediateCatchEvent>
<bpmn:intermediateCatchEvent id="Timeout" name="3 дня">
  <bpmn:timerEventDefinition>
    <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">P3D</bpmn:timeDuration>
  </bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>

Шлюз по событиям может начинать процесс (instantiate="true"): процесс запускается первым из нескольких возможных событий. Его разновидность — параллельный шлюз по событиям: процесс запускается, когда произошли все события.

Сложный шлюз

Сложный шлюз (complex gateway) — ромб со звёздочкой. Условие слияния задаётся произвольным выражением: например, «продолжить, когда пришли ответы от двух экспертов из трёх». Используется редко; прежде чем применять его, проверьте, нельзя ли обойтись комбинацией простых шлюзов.

Частые ошибки

  • Слияние параллельных ветвей исключающим шлюзом. После параллельного ветвления XOR-слияние пропустит дальше каждый маркер — работа после слияния выполнится дважды. Сливайте параллельные ветви параллельным шлюзом.
  • Слияние исключающих ветвей параллельным шлюзом. Параллельный шлюз будет вечно ждать маркер из ветви, которая не запускалась, — процесс «зависнет».
  • Решение внутри шлюза. Шлюз не выполняет работу: «Проверить документы» — это задача перед шлюзом, а шлюз — «Документы в порядке?».
  • Непарные шлюзы. Хорошая практика — закрывать каждое ветвление шлюзом того же типа, так модель легче читать.

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