BPMN 2.0 (Business Process Model and Notation) строит диаграммы из трёх классов связующих элементов — потоков, шлюзов и событий — и активностей (задач, подпроцессов), которые они соединяют. Для системного аналитика эта заметка — первый технический уровень ветки 06.02: семантика токенов, правила ветвления и триггеров. Порядок чтения: если вы заходите в BPMN только через ветку 06 — сначала 03.04.01 BPMN 2.0 - введение и основы (обзор нотации и виды задач), затем эта заметка; если уже прошли 03.04 — можно начинать здесь. Пулы, дорожки и артефакты данных — 06.02.02 Пулы, дорожки и артефакты; паттерны и исполнение — 06.02.03 Типовые паттерны BPMN и 06.02.04 Работа с Camunda. На исполняемых диаграммах message throw/catch — это семантика процесса, а не готовый контракт интеграции; детали API и очередей — 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf) и 06.02.04 Работа с Camunda.
1. Потоки (Flows)
В BPMN три типа соединительных линий нельзя путать: поток управления (Sequence Flow), поток сообщений (Message Flow) и ассоциация (Association). Поток управления связывает элементы потока — события, шлюзы и активности (Activities): задачи (user, service, manual и др.) и подпроцессы. К чему именно крепятся линии и граничные события, без знания активностей диаграмму не прочитать; перечень типов задач — в 03.04.01 BPMN 2.0 - введение и основы. Для сравнения с другой нотацией поведения — 03.02.02 Диаграмма деятельности (Activity Diagram).
1.1 Поток управления (Sequence Flow)
Поток управления задаёт порядок выполнения внутри одного пула. Это «рельсы», по которым движется токен — маркер активного элемента. При параллельном разветвлении (AND-split) токен клонируется: на каждый исходящий поток уходит свой экземпляр; AND-merge ждёт завершения всех веток и снова выпускает один токен.
- Изображение: сплошная линия со сплошной стрелкой.
- Правила: только внутри одного пула; не заменяет message flow между участниками. Пересекать границы дорожек (lanes) внутри пула можно — это один процесс; пересекать границу пула нельзя.
- Разветвление без шлюза (implicit divergence) в BPMN 2.0 формально возможно, но на практике не используйте: тип ветвления должен быть явным.
- Разновидности:
- Безусловный поток — обычная стрелка.
- Поток по умолчанию (default) — срабатывает, если ни одно другое условие на XOR не истинно; обозначается косой чертой у начала линии. Без default на XOR процесс может застрять, если все условия ложны.
- Условный поток — мини-ромбик у начала или условие в
[квадратных скобках]. Исходящий из задачи условный поток допустим по стандарту, но по Method & Style (Silver) предпочтительнее явный шлюз: так проще читать модель и проверять условия на ревью.
Sequence flow не проходит через границу подпроцесса как «сквозная» стрелка: вход и выход подпроцесса — отдельные точки на его контуре; внутренняя логика скрыта внутри блока.
1.2 Поток сообщений (Message Flow)
Поток сообщений — обмен информацией между разными участниками (пулами, внешними системами, «чёрными ящиками»).
- Изображение: пунктирная линия с пустой стрелкой.
- Правила: только между пулами (или от/к элементу одного пула и внешнему участнику). Запрещено соединять два элемента внутри одного пула message flow — для порядка работ внутри пула всегда sequence flow. Message flow не заменяет вызов API внутри системы: это модель межучастникового обмена, детали интеграции — в 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events).
1.3 Ассоциация и данные
- Ассоциация (пунктир без стрелки или с открытой стрелкой) связывает артефакты — объекты данных, аннотации — с элементами процесса без влияния на поток токена.
- Данные на диаграмме не двигают токен — они моделируются отдельно от sequence flow; полная модель артефактов и связь с 03.04.02 Диаграмма потоков данных (DFD) — в 06.02.02 Пулы, дорожки и артефакты.
На ревью проверяйте: разные роли/организации → message flow; порядок шагов внутри процесса → sequence flow; документ рядом с задачей → ассоциация.
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_flows_order" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_flows_order"><bpmn:participant id="buyer" name="Покупатель" processRef="process_buyer" /><bpmn:participant id="shop" name="Магазин" processRef="process_shop" /><bpmn:messageFlow id="Message_0" name="Заказ" sourceRef="b_send" targetRef="s_recv" /></bpmn:collaboration>
<bpmn:process id="process_buyer" name="Покупатель" isExecutable="false"><bpmn:laneSet id="LaneSet_buyer"><bpmn:lane id="buyer_lane" name="Покупатель"><bpmn:flowNodeRef>b_start</bpmn:flowNodeRef><bpmn:flowNodeRef>b_order</bpmn:flowNodeRef><bpmn:flowNodeRef>b_send</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:dataObject id="order_doc_obj" /><bpmn:startEvent id="b_start" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="b_order" name="1.2 Оформить заказ"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:sendTask id="b_send" name="1.3 Отправить заказ"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:sendTask><bpmn:dataObjectReference id="order_doc" name="Заказ" dataObjectRef="order_doc_obj" /><bpmn:sequenceFlow id="Flow_0" sourceRef="b_start" targetRef="b_order" /><bpmn:sequenceFlow id="Flow_1" sourceRef="b_order" targetRef="b_send" /><bpmn:association id="Assoc_0" sourceRef="b_order" targetRef="order_doc" associationDirection="None" /></bpmn:process><bpmn:process id="process_shop" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="shop_lane" name="1. Склад"><bpmn:flowNodeRef>s_recv</bpmn:flowNodeRef><bpmn:flowNodeRef>s_work</bpmn:flowNodeRef><bpmn:flowNodeRef>s_ship</bpmn:flowNodeRef><bpmn:flowNodeRef>s_end</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:receiveTask id="s_recv" name="1.1 Получить заказ"><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:receiveTask><bpmn:serviceTask id="s_work" name="1.2 Обработать заказ"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:serviceTask><bpmn:sendTask id="s_ship" name="1.3 Отправить товар"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="s_end" name="1.4"><bpmn:incoming>Flow_4</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_2" sourceRef="s_recv" targetRef="s_work" /><bpmn:sequenceFlow id="Flow_3" sourceRef="s_work" targetRef="s_ship" /><bpmn:sequenceFlow id="Flow_4" sourceRef="s_ship" targetRef="s_end" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_flows_order">
<bpmndi:BPMNPlane id="BPMNPlane_flows_order" bpmnElement="Collaboration_flows_order">
<bpmndi:BPMNShape id="buyer_di" bpmnElement="buyer" isHorizontal="true"><dc:Bounds x="80" y="40" width="1354" height="214" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="buyer_lane_di" bpmnElement="buyer_lane" isHorizontal="true"><dc:Bounds x="110" y="40" width="1324" height="214" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="344" width="1354" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shop_lane_di" bpmnElement="shop_lane" isHorizontal="true"><dc:Bounds x="110" y="344" width="1324" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="b_start_di" bpmnElement="b_start"><dc:Bounds x="153" y="148" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="158" y="192" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="b_order_di" bpmnElement="b_order"><dc:Bounds x="280" y="126" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="b_send_di" bpmnElement="b_send"><dc:Bounds x="544" y="126" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="order_doc_di" bpmnElement="order_doc"><dc:Bounds x="352" y="48" width="36" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="350" y="106" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="s_recv_di" bpmnElement="s_recv"><dc:Bounds x="544" y="390" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="s_work_di" bpmnElement="s_work"><dc:Bounds x="808" y="390" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="s_ship_di" bpmnElement="s_ship"><dc:Bounds x="1072" y="390" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="s_end_di" bpmnElement="s_end"><dc:Bounds x="1343" y="412" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1348" y="456" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0_di" bpmnElement="Flow_0"><di:waypoint x="189" y="166" /><di:waypoint x="280" y="166" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="460" y="166" /><di:waypoint x="544" y="166" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="724" y="430" /><di:waypoint x="808" y="430" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="988" y="430" /><di:waypoint x="1072" y="430" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="1252" y="430" /><di:waypoint x="1343" y="430" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Message_0_di" bpmnElement="Message_0"><di:waypoint x="634" y="206" /><di:waypoint x="634" y="242" /><di:waypoint x="634" y="390" /><bpmndi:BPMNLabel><dc:Bounds x="642" y="217" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Assoc_0_di" bpmnElement="Assoc_0"><di:waypoint x="370" y="126" /><di:waypoint x="370" y="98" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Сплошные стрелки внутри пулов — sequence flow; пунктир между пулами — message flow «Заказ». У покупателя задача отправки, у магазина — приёма.
2. Шлюзы (Gateways)
Шлюзы (ромбы с маркером) не выполняют работу — только направляют и синхронизируют токены. Split (разветвление) и merge (слияние) одного типа шлюза имеют согласованную семантику; у XOR маркер split и merge одинаков (пустой ромб или крестик).
2.1 Эксклюзивный шлюз (XOR)
- Маркер: пустой ромб или ромб с крестиком (X) — семантика split/merge одна.
- Split: токен уходит ровно по одному исходящему пути с истинным условием; иначе — default (если задан).
- Merge: первый пришедший токен сразу идёт дальше; ждать остальные ветки не нужно.
- Применение: «либо-либо» — проверка стока, маршрут по сумме заявки.
2.2 Неэксклюзивный / включающий шлюз (OR, Inclusive)
- Маркер: ромб с одним кружком внутри.
- Split: активируются все исходящие пути, чьи условия на sequence flow истинны; при нескольких истинных условиях создаётся несколько токенов. На split у каждого исходящего потока должно быть явное условие (или один поток, помеченный как default); OR-split без условий — дефект модели по Method & Style.
- Merge: ждёт токены только с тех веток, которые реально активировались при соответствующем split, затем выпускает один токен.
- Применение: независимые проверки — «если сумма > 1 млн → аудит; если валюта ≠ RUB → валютный контроль»; оба условия могут сработать одновременно.
- Не путать с AND: OR — «сколько условий истинно, столько веток»; AND — «всегда все ветки без условий».
2.3 Параллельный шлюз (AND)
- Маркер: ромб с плюсом (+).
- Split: по одному токену на каждый исходящий поток — все ветки стартуют параллельно.
- Merge: ждёт все входящие токены.
- Применение: после оплаты одновременно «Упаковка» и «Счёт-фактура», затем слияние перед «Отгрузка». Не ставьте AND, если ветки условные — для этого OR или XOR.
2.4 Событийный шлюз (Event-based Gateway)
- Маркер по BPMN 2.0.2: ромб с пятиугольником внутри круга — не путать с OR (просто кружок без пятиугольника). В редакторах возможны отличия от спецификации; в документе процесса опирайтесь на семантику и подпись, а не только на пиктограмму — см. 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io).
- Split: процесс останавливается и ждёт одно из перехватывающих промежуточных событий (catch) на исходящих линиях — message catch, timer catch, signal catch и т.д. Обычные задачи или throw-события сразу после шлюза недопустимы. Сработало одно catch — остальные пути отменяются.
- Merge: запрещён — event-based gateway только для разветвления.
- Применение: ожидание «ответ клиента / тайм-аут / отмена извне» без заранее известного условия на стрелке.
| Критерий | OR (Inclusive) | Event-based |
|---|---|---|
| Маркер | Кружок в ромбе | Пятиугольник в кружке |
| Исходящие линии | Sequence flow с условиями | Только catch events |
| Merge | Да | Нет |
| Когда выбирать | Условия известны и проверяемы на split | Ждём внешнее событие или время |
2.5 Комплексный шлюз (Complex)
- Маркер: ромб со звёздочкой.
- Семантика: задаётся выражением или правилом; на практике почти всегда заменяется декомпозицией на XOR/OR/AND — см. 06.02.03 Типовые паттерны BPMN.
Пример корректного XOR split → XOR merge (ветка «Нет» не блокирует слияние):
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_xor_stock" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_xor_stock"><bpmn:participant id="stock_shop" name="Магазин" processRef="process_stock" /></bpmn:collaboration>
<bpmn:process id="process_stock" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_stock_shop"><bpmn:lane id="wh" name="1. Склад"><bpmn:flowNodeRef>st</bpmn:flowNodeRef><bpmn:flowNodeRef>check</bpmn:flowNodeRef><bpmn:flowNodeRef>gx</bpmn:flowNodeRef><bpmn:flowNodeRef>pack</bpmn:flowNodeRef><bpmn:flowNodeRef>join</bpmn:flowNodeRef><bpmn:flowNodeRef>ship</bpmn:flowNodeRef><bpmn:flowNodeRef>en</bpmn:flowNodeRef></bpmn:lane><bpmn:lane id="buy" name="2. Закупки"><bpmn:flowNodeRef>reorder</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="st" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="check" name="1.2 Проверить остаток"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:exclusiveGateway id="gx" name="1.3 Есть товар?" default="Flow_3"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:manualTask id="pack" name="1.4 Упаковать"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:manualTask><bpmn:exclusiveGateway id="join" name="1.6"><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:incoming>Flow_5</bpmn:incoming><bpmn:outgoing>Flow_6</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:serviceTask id="ship" name="1.7 Отгрузить"><bpmn:incoming>Flow_6</bpmn:incoming><bpmn:outgoing>Flow_7</bpmn:outgoing></bpmn:serviceTask><bpmn:endEvent id="en" name="1.8"><bpmn:incoming>Flow_7</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="reorder" name="2.1 Заказать поставщику"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:userTask><bpmn:sequenceFlow id="Flow_0" sourceRef="st" targetRef="check" /><bpmn:sequenceFlow id="Flow_1" sourceRef="check" targetRef="gx" /><bpmn:sequenceFlow id="Flow_2" name="да" sourceRef="gx" targetRef="pack" /><bpmn:sequenceFlow id="Flow_3" name="нет" sourceRef="gx" targetRef="reorder" /><bpmn:sequenceFlow id="Flow_4" sourceRef="pack" targetRef="join" /><bpmn:sequenceFlow id="Flow_5" sourceRef="reorder" targetRef="join" /><bpmn:sequenceFlow id="Flow_6" sourceRef="join" targetRef="ship" /><bpmn:sequenceFlow id="Flow_7" sourceRef="ship" targetRef="en" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_xor_stock">
<bpmndi:BPMNPlane id="BPMNPlane_xor_stock" bpmnElement="Collaboration_xor_stock">
<bpmndi:BPMNShape id="stock_shop_di" bpmnElement="stock_shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="1358" height="332" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="wh_di" bpmnElement="wh" isHorizontal="true"><dc:Bounds x="110" y="40" width="1328" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="buy_di" bpmnElement="buy" isHorizontal="true"><dc:Bounds x="110" y="206" width="1328" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="st_di" bpmnElement="st"><dc:Bounds x="153" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="158" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="check_di" bpmnElement="check"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="gx_di" bpmnElement="gx" isMarkerVisible="true"><dc:Bounds x="544" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="540" y="55" width="59" height="28" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="pack_di" bpmnElement="pack"><dc:Bounds x="678" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="join_di" bpmnElement="join" isMarkerVisible="true"><dc:Bounds x="942" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="954" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ship_di" bpmnElement="ship"><dc:Bounds x="1076" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="en_di" bpmnElement="en"><dc:Bounds x="1347" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1352" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="reorder_di" bpmnElement="reorder"><dc:Bounds x="678" y="252" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0_di" bpmnElement="Flow_0"><di:waypoint x="189" y="126" /><di:waypoint x="280" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="460" y="126" /><di:waypoint x="544" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /><bpmndi:BPMNLabel><dc:Bounds x="602" y="108" width="24" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="569" y="151" /><di:waypoint x="569" y="292" /><di:waypoint x="678" y="292" /><bpmndi:BPMNLabel><dc:Bounds x="577" y="157" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="858" y="126" /><di:waypoint x="942" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="858" y="292" /><di:waypoint x="967" y="292" /><di:waypoint x="967" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="992" y="126" /><di:waypoint x="1076" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7"><di:waypoint x="1256" y="126" /><di:waypoint x="1347" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
После XOR выполняется одна ветка; XOR-merge пропускает первый пришедший токен. Параллельный merge (+) здесь был бы ошибкой: неактивная ветка никогда не завершится → deadlock.
3. События (Events)
События — круги на границе процесса или прикреплённые к задачам. Классификация по позиции (start / intermediate / end) и типу триггера (иконка внутри).
3.1 Позиция в процессе
| Позиция | Изображение | Смысл |
|---|---|---|
| Стартовое (Start Event) | Тонкий круг | Запускает процесс; может иметь триггер (none, message, timer…). |
| Промежуточное (Intermediate Event) | Двойной круг | Между началом и концом: catch (ожидание) или throw (генерация). |
| Конечное (End Event) | Толстый круг | Завершает ветку или весь процесс (terminate). |
Граничные события (boundary events) на контуре задачи: прерывающие (сплошная линия к кругу) отменяют задачу; непрерывающие (пунктир) запускают параллельную обработку, не останавливая основную.
3.2 Основные типы триггеров
| Тип | Иконка | Когда нужен аналитику |
|---|---|---|
| None | Пустой круг | Старт без внешнего триггера (в исполняемых моделях часто «запуск из приложения»); простое завершение. Не путать с user task: работу человека моделируют задачей, а не стартовым событием none. |
| Message | Конверт | Старт/приём/отправка сообщения между участниками. |
| Timer | Часы | Расписание, SLA, тайм-аут на задаче (boundary timer). |
| Error | Молния | Boundary на задаче; end error — в родительский процесс. |
| Escalation | Стрелка вверх | Некритичное отклонение, эскалация менеджеру. |
| Signal | Треугольник | Широковещательное событие в домене — см. 03.05.06 Event-Driven Architecture. |
| Conditional | Лист | Старт / catch по бизнес-правилу. |
| Link | Двойная стрелка | Связь фрагментов большой диаграммы (off-page). |
| Compensation | Две стрелки назад | Откат выполненных шагов — паттерны в 06.02.03 Типовые паттерны BPMN. |
| Cancel | Крестик в круге | Отмена транзакционного подпроцесса — см. 06.02.03 Типовые паттерны BPMN. |
| Multiple / Parallel Multiple | Пентагон (± плюс) | Несколько возможных или все обязательные триггеры — редко; чаще заменяют явными шлюзами. |
| Terminate | Закрашенный круг | Мгновенное завершение всех токенов процесса. |
3.3 Схема с граничным таймером
На реальной BPMN-диаграмме таймер SLA — граничное catch-событие на контуре задачи, а не отдельная стрелка sequence flow и не ассоциация:
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_timer_pick" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_timer_pick"><bpmn:participant id="pick_shop" name="Магазин" processRef="process_pick" /></bpmn:collaboration>
<bpmn:process id="process_pick" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_pick_shop"><bpmn:lane id="pick" name="1. Сборка"><bpmn:flowNodeRef>p_st</bpmn:flowNodeRef><bpmn:flowNodeRef>p_task</bpmn:flowNodeRef><bpmn:flowNodeRef>p_timer</bpmn:flowNodeRef><bpmn:flowNodeRef>p_go</bpmn:flowNodeRef><bpmn:flowNodeRef>p_send</bpmn:flowNodeRef><bpmn:flowNodeRef>p_end</bpmn:flowNodeRef><bpmn:flowNodeRef>p_cancel</bpmn:flowNodeRef><bpmn:flowNodeRef>p_cend</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="p_st" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="p_task" name="1.2 Собрать заказ"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:boundaryEvent id="p_timer" name="24 ч" attachedToRef="p_task" cancelActivity="true"><bpmn:outgoing>Flow_4</bpmn:outgoing><bpmn:timerEventDefinition id="p_timer_def" /></bpmn:boundaryEvent><bpmn:serviceTask id="p_go" name="1.3 Начать отгрузку"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:serviceTask><bpmn:sendTask id="p_send" name="1.4 Отправить"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="p_end" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="p_cancel" name="1.6 Отменить заказ"><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="p_cend" name="1.7"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="p_st" targetRef="p_task" /><bpmn:sequenceFlow id="Flow_1" sourceRef="p_task" targetRef="p_go" /><bpmn:sequenceFlow id="Flow_2" sourceRef="p_go" targetRef="p_send" /><bpmn:sequenceFlow id="Flow_3" sourceRef="p_send" targetRef="p_end" /><bpmn:sequenceFlow id="Flow_4" name="SLA" sourceRef="p_timer" targetRef="p_cancel" /><bpmn:sequenceFlow id="Flow_5" sourceRef="p_cancel" targetRef="p_cend" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_timer_pick">
<bpmndi:BPMNPlane id="BPMNPlane_timer_pick" bpmnElement="Collaboration_timer_pick">
<bpmndi:BPMNShape id="pick_shop_di" bpmnElement="pick_shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="1090" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="pick_di" bpmnElement="pick" isHorizontal="true"><dc:Bounds x="110" y="40" width="1060" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_st_di" bpmnElement="p_st"><dc:Bounds x="153" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="158" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_task_di" bpmnElement="p_task"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_timer_di" bpmnElement="p_timer"><dc:Bounds x="352" y="148" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="353" y="192" width="34" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_go_di" bpmnElement="p_go"><dc:Bounds x="544" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_send_di" bpmnElement="p_send"><dc:Bounds x="808" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_end_di" bpmnElement="p_end"><dc:Bounds x="1079" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1084" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_cancel_di" bpmnElement="p_cancel"><dc:Bounds x="544" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="p_cend_di" bpmnElement="p_cend"><dc:Bounds x="880" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="885" y="310" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0_di" bpmnElement="Flow_0"><di:waypoint x="189" y="126" /><di:waypoint x="280" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="460" y="126" /><di:waypoint x="544" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="724" y="126" /><di:waypoint x="808" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="988" y="126" /><di:waypoint x="1079" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="370" y="184" /><di:waypoint x="370" y="284" /><di:waypoint x="544" y="284" /><bpmndi:BPMNLabel><dc:Bounds x="398" y="192" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="724" y="284" /><di:waypoint x="880" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Таймер «24 ч» стоит на контуре user task и прерывает её: cancelActivity="true". Стрелка от таймера — sequence flow после срабатывания boundary event. Те же иконки в Camunda, Bizagi и draw.io — см. 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io) и 06.02.04 Работа с Camunda.
3.4 Практика для спецификации
- Message start — процесс от внешнего запроса (REST, Kafka, e-mail); конверт на диаграмме ≠ готовый контракт — детали message throw/catch: 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf), 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events).
- Boundary timer — SLA на шаг; формулируйте как проверяемое правило вместе с 02.04.02 Критерии приёмки (Acceptance Criteria).
- Условия на потоках после XOR/OR — бизнес-правила; трассируйте в критерии приёмки и тест-кейсы — 02.03.04 Трассировка требований (концепция), 08.03 Тестирование требований (статическое тестирование).
- Terminate end — только когда нужно оборвать все параллельные ветки сразу; иначе обычный end на каждой ветке.
- Сквозной процесс с потоками и шлюзами оформляйте по 10.01.08 Шаблон сквозной фичи (BPMN-процесс).
4. Типовые ошибки и ограничения
- Несогласованные split/merge — AND-split с XOR-merge (или наоборот) → deadlock или «висящие» токены. Парность типов обязательна: если split — XOR, то явный шлюз слияния (если рисуете) тоже XOR. Явный merge-шлюз после XOR-split не обязателен — ветки могут сходиться в одну задачу без ромба, потому что XOR-merge пропускает первый токен; но если merge рисуете, его тип должен совпадать с split.
- XOR + AND-merge после «либо-либо» — классическая ошибка на ревью (см. исправленный пример в разделе 2).
- Implicit merge (неявное слияние) — несколько входящих sequence flow в один элемент без шлюза: формально допустимо, но семантика зависит от типа элемента и движка исполнения. На ревью предпочитайте явный merge-шлюз того же типа, что split; нюансы — 06.02.03 Типовые паттерны BPMN.
- OR vs event-based — условия на стрелках vs catch-события; разные маркеры ромба.
- OR-split без условий — каждый исходящий поток должен иметь явное условие или default.
- AND вместо OR — параллельный шлюз, когда нужны независимые условия («аудит если крупный И валютный контроль если валютный»), заставляет выполнять обе ветки всегда.
- Нет default на XOR — процесс застревает, если ни одно условие не истинно.
- Message flow внутри пула — нарушение правила участников; внутри — только sequence flow.
- Условный поток из задачи без шлюза — допустимо по OMG, но ухудшает читаемость; на аналитическом уровне модели предпочитайте явный XOR.
- Event-based с задачами на исходящих или попытка merge event-based — нарушение стандарта.
- Implicit divergence — несколько исходящих sequence flow из одного элемента без шлюза; не используйте в согласованных моделях.
Связи с другими разделами базы
- 03.04.01 BPMN 2.0 - введение и основы — обзор нотации, виды задач и уровни моделирования (точка входа в BPMN для SA)
- 06.02.02 Пулы, дорожки и артефакты — организация диаграммы, объекты данных, message flow к границе пула
- 06.02.03 Типовые паттерны BPMN — развилка–слияние, implicit merge, компенсация, event sub-process
- 06.02.04 Работа с Camunda — исполнение моделей с потоками, шлюзами и событиями
- 10.01.08 Шаблон сквозной фичи (BPMN-процесс) — практический артефакт аналитика
- 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf) — контракты для message throw/catch
- 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events) — message start и межсистемный обмен
- 03.05.06 Event-Driven Architecture — signal events и широковещательные триггеры
- 02.03.04 Трассировка требований (концепция) — условия на потоках и бизнес-правила
- 08.03 Тестирование требований (статическое тестирование) — проверка правил ветвления в тест-кейсах
- 02.04.02 Критерии приёмки (Acceptance Criteria) — условия на потоках и SLA через boundary timer
- 03.04.02 Диаграмма потоков данных (DFD) — альтернатива для потоков данных
- 03.02.02 Диаграмма деятельности (Activity Diagram) — UML Activity vs BPMN
- 06.01.02 Поведенческие диаграммы (State, Activity, Use Case) — когда какую нотацию выбрать
- 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io) — построение BPMN-диаграмм
Источники и дополнительные материалы
Книги и стандарты
- OMG. Business Process Model and Notation (BPMN) Version 2.0.2 — официальная спецификация потоков, шлюзов и событий. https://www.omg.org/spec/BPMN/2.0.2
- Брюс Сильвер. BPMN в действии. Моделирование и анализ бизнес-процессов — Method & Style, парность шлюзов, читаемые модели. ДМК Пресс.
- Bruce Silver. BPMN Quick and Easy Using Method and Style — практики чистого моделирования.
- Томас Аллвейер. BPMN 2.0. Introduction to the Standard for Business Process Modeling — краткое введение в стандарт (англ.).
Справочники и инструменты
- Camunda BPMN Tutorial — разбор элементов с примерами. https://camunda.com/bpmn/
- Bizagi BPMN Guide — иллюстрированный справочник по нотации. https://help.bizagi.com/bpm-suite/en/
- bpmn.io / demo.bpmn.io — открытый редактор для проверки семантики элементов на живой диаграмме. https://demo.bpmn.io/