После освоения атомов нотации — потоков, шлюзов, событий (06.02.01 Потоки, шлюзы, события) и организационного слоя (06.02.02 Пулы, дорожки и артефакты) — на проекте нужно собирать из них целостные процессы. Здесь — композиционные схемы BPMN (idioms): повторяющиеся конструкции для согласования, тайм-аутов, параллелизма, межучастникового обмена. Это не 01.06 Принципы и паттерны проектирования решений в смысле архитектуры ПО, а готовые фрагменты потока управления. Полная семантика шлюзов и событий — в 06.02.01 Потоки, шлюзы, события; обзор нотации для SA — в 03.04.01 BPMN 2.0 - введение и основы. Схемы ниже — BPMN 2.0: у задач указан тип, прерывающее граничное событие помечено cancelActivity="true", непрерывающее — false. Линия от граничного события в обоих случаях sequence flow; прерывание задаёт атрибут события, а не стиль стрелки. Семантика — в 06.02.01 Потоки, шлюзы, события.
1. Суть темы
Эта заметка — третий уровень ветки 06.02: не «что такое XOR», а как из элементов собрать типовой процесс. Порядок чтения: 03.04.01 BPMN 2.0 - введение и основы (если BPMN новый) → 06.02.01 Потоки, шлюзы, события → 06.02.02 Пулы, дорожки и артефакты → эта статья → 06.02.04 Работа с Camunda для исполнения.
Для SA достаточно 03.04.01 BPMN 2.0 - введение и основы, если нужен обзор нотации на уровне BRD и collaboration-диаграмм без исполнения в движке. Ветку 06.02.* имеет смысл проходить, когда модель должна быть исполняемой, проходит строгое ревью по Method & Style или уходит в 06.02.04 Работа с Camunda.
| Уровень | Где | Что даёт |
|---|---|---|
| Обзор нотации, виды задач | 03.04.01 BPMN 2.0 - введение и основы | Точка входа SA, общая карта BPMN |
| Семантика потоков, шлюзов, событий | 06.02.01 Потоки, шлюзы, события | Правила токенов, маркеры, boundary events |
| Пулы, дорожки, данные | 06.02.02 Пулы, дорожки и артефакты | Collaboration, message flow, артефакты |
| Типовые схемы сборки | эта заметка | Каталог паттернов и anti-patterns |
| Исполнение в движке | 06.02.04 Работа с Camunda | Job workers, incidents, таймеры в runtime |
Паттерны ниже согласованы с Workflow Patterns Initiative (WPI): control-flow idioms BPMN имеют прямые аналоги в каталоге WCP. Каталог WPI шире нотации — не каждый WCP рисуется одним элементом BPMN.
| Паттерн статьи | WCP | Элемент BPMN |
|---|---|---|
| 2.1 Sequence | WCP1 | sequence flow между задачами |
| 2.2 XOR-split / join | WCP4, WCP5 | exclusive gateway |
| 2.3 AND-split / join | WCP2, WCP3 | parallel gateway |
| 2.4 OR-split / join | WCP6, WCP7 | inclusive gateway |
| 2.5 Standard loop | WCP21 | loop characteristics на задаче |
| 2.5 Цикл через шлюз | WCP22 | обратный sequence flow |
| 2.6 Timeout, 2.8 Error | WCP19 | boundary interrupting event |
| 2.9 Compensation | WCP27 | transaction subprocess + compensation events |
| 2.13 Event-based gateway | WCP38 | deferred choice через catch-события |
| 2.15 MI parallel / sequential | WCP12, WCP13 | multi-instance task |
| 2.17 Terminate | WCP43 | terminate end event |
WCP9 (structured discriminator) в BPMN реализуется обходными путями — XOR-merge после parallel split; прямого элемента нет. Подробная семантика discriminator — на workflowpatterns.com.
2. Ключевые понятия
Ниже — наиболее частые схемы на enterprise-проектах. Контекст данных (data object, input/output на задаче) — 06.02.02 Пулы, дорожки и артефакты; здесь не повторяем.
П. 2.1–2.4 — базовые шлюзы; полная семантика токенов и таблицы сравнения — в 06.02.01 Потоки, шлюзы, события. Здесь — компактные напоминания для каталога; составной пример комбинации — в п. 2.4a.
2.1 Последовательный процесс (Sequence)
Линейная цепочка без ветвлений. Семантика — 06.02.01 Потоки, шлюзы, события.
<?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_seq" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_seq"><bpmn:participant id="shop" name="Магазин" processRef="process_seq" /></bpmn:collaboration>
<bpmn:process id="process_seq" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>q_s</bpmn:flowNodeRef><bpmn:flowNodeRef>q_a</bpmn:flowNodeRef><bpmn:flowNodeRef>q_b</bpmn:flowNodeRef><bpmn:flowNodeRef>q_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="q_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="q_a" name="1.2 Принять заявку"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:serviceTask id="q_b" name="1.3 Записать в реестр"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:serviceTask><bpmn:endEvent id="q_e" name="1.4"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="q_s" targetRef="q_a" /><bpmn:sequenceFlow id="Flow_1" sourceRef="q_a" targetRef="q_b" /><bpmn:sequenceFlow id="Flow_2" sourceRef="q_b" targetRef="q_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_seq">
<bpmndi:BPMNPlane id="BPMNPlane_seq" bpmnElement="Collaboration_seq">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="826" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="796" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="q_s_di" bpmnElement="q_s"><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="q_a_di" bpmnElement="q_a"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="q_b_di" bpmnElement="q_b"><dc:Bounds x="544" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="q_e_di" bpmnElement="q_e"><dc:Bounds x="815" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="820" y="152" 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="815" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.2 Простое ветвление (XOR-split / XOR-join)
Один путь из нескольких по условию.
<?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" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_xor"><bpmn:participant id="shop" name="Магазин" processRef="process_xor" /></bpmn:collaboration>
<bpmn:process id="process_xor" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>x_s</bpmn:flowNodeRef><bpmn:flowNodeRef>x_g</bpmn:flowNodeRef><bpmn:flowNodeRef>x_ok</bpmn:flowNodeRef><bpmn:flowNodeRef>x_ask</bpmn:flowNodeRef><bpmn:flowNodeRef>x_j</bpmn:flowNodeRef><bpmn:flowNodeRef>x_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="x_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:exclusiveGateway id="x_g" name="1.2 Сумма выше лимита?"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:serviceTask id="x_ok" name="1.3 Провести"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:serviceTask><bpmn:userTask id="x_ask" name="1.4 Согласовать"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:userTask><bpmn:exclusiveGateway id="x_j" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:endEvent id="x_e" name="1.6"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="x_s" targetRef="x_g" /><bpmn:sequenceFlow id="Flow_1" name="нет" sourceRef="x_g" targetRef="x_ok" /><bpmn:sequenceFlow id="Flow_2" name="да" sourceRef="x_g" targetRef="x_ask" /><bpmn:sequenceFlow id="Flow_3" sourceRef="x_ok" targetRef="x_j" /><bpmn:sequenceFlow id="Flow_4" sourceRef="x_ask" targetRef="x_j" /><bpmn:sequenceFlow id="Flow_5" sourceRef="x_j" targetRef="x_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_xor">
<bpmndi:BPMNPlane id="BPMNPlane_xor" bpmnElement="Collaboration_xor">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="830" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="800" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="x_s_di" bpmnElement="x_s"><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="x_g_di" bpmnElement="x_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="263" y="55" width="85" height="28" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="x_ok_di" bpmnElement="x_ok"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="x_ask_di" bpmnElement="x_ask"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="x_j_di" bpmnElement="x_j" isMarkerVisible="true"><dc:Bounds x="678" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="x_e_di" bpmnElement="x_e"><dc:Bounds x="819" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="824" y="152" 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="330" y="126" /><di:waypoint x="414" y="126" /><bpmndi:BPMNLabel><dc:Bounds x="338" y="108" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /><bpmndi:BPMNLabel><dc:Bounds x="313" y="157" width="24" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="703" y="284" /><di:waypoint x="703" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="819" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Слияние XOR: после split выполняется ровно одна ветка — неявное слияние в одну задачу допустимо в симметричных structured-диаграммах; на исполняемых моделях — явный XOR-merge, как на схеме.
2.3 Параллельное выполнение (AND-split / AND-join)
Split и merge — оба параллельные (+). Без AND-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_and" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_and"><bpmn:participant id="shop" name="Магазин" processRef="process_and" /></bpmn:collaboration>
<bpmn:process id="process_and" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Исполнение"><bpmn:flowNodeRef>n_s</bpmn:flowNodeRef><bpmn:flowNodeRef>n_g</bpmn:flowNodeRef><bpmn:flowNodeRef>n_a</bpmn:flowNodeRef><bpmn:flowNodeRef>n_b</bpmn:flowNodeRef><bpmn:flowNodeRef>n_j</bpmn:flowNodeRef><bpmn:flowNodeRef>n_c</bpmn:flowNodeRef><bpmn:flowNodeRef>n_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="n_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:parallelGateway id="n_g" name="1.2"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:parallelGateway><bpmn:manualTask id="n_a" name="1.3 Упаковать"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:manualTask><bpmn:serviceTask id="n_b" name="1.4 Выставить счёт"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:serviceTask><bpmn:parallelGateway id="n_j" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:parallelGateway><bpmn:sendTask id="n_c" name="1.6 Отгрузить"><bpmn:incoming>Flow_5</bpmn:incoming><bpmn:outgoing>Flow_6</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="n_e" name="1.7"><bpmn:incoming>Flow_6</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="n_s" targetRef="n_g" /><bpmn:sequenceFlow id="Flow_1" sourceRef="n_g" targetRef="n_a" /><bpmn:sequenceFlow id="Flow_2" sourceRef="n_g" targetRef="n_b" /><bpmn:sequenceFlow id="Flow_3" sourceRef="n_a" targetRef="n_j" /><bpmn:sequenceFlow id="Flow_4" sourceRef="n_b" targetRef="n_j" /><bpmn:sequenceFlow id="Flow_5" sourceRef="n_j" targetRef="n_c" /><bpmn:sequenceFlow id="Flow_6" sourceRef="n_c" targetRef="n_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_and">
<bpmndi:BPMNPlane id="BPMNPlane_and" bpmnElement="Collaboration_and">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="1094" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="1064" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_s_di" bpmnElement="n_s"><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="n_g_di" bpmnElement="n_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="292" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_a_di" bpmnElement="n_a"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_b_di" bpmnElement="n_b"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_j_di" bpmnElement="n_j" isMarkerVisible="true"><dc:Bounds x="678" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_c_di" bpmnElement="n_c"><dc:Bounds x="812" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="n_e_di" bpmnElement="n_e"><dc:Bounds x="1083" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1088" y="152" 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="330" y="126" /><di:waypoint x="414" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="703" y="284" /><di:waypoint x="703" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="812" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="992" y="126" /><di:waypoint x="1083" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.4 Условный параллелизм (OR-split / OR-join)
OR активирует подмножество исходящих путей по условиям на sequence flow. OR-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_or" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_or"><bpmn:participant id="shop" name="Магазин" processRef="process_or" /></bpmn:collaboration>
<bpmn:process id="process_or" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Контроль"><bpmn:flowNodeRef>o_s</bpmn:flowNodeRef><bpmn:flowNodeRef>o_g</bpmn:flowNodeRef><bpmn:flowNodeRef>o_a</bpmn:flowNodeRef><bpmn:flowNodeRef>o_b</bpmn:flowNodeRef><bpmn:flowNodeRef>o_j</bpmn:flowNodeRef><bpmn:flowNodeRef>o_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="o_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:inclusiveGateway id="o_g" name="1.2 Какие проверки?"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:inclusiveGateway><bpmn:userTask id="o_a" name="1.3 Аудит суммы"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:userTask><bpmn:serviceTask id="o_b" name="1.4 Валютный контроль"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:serviceTask><bpmn:inclusiveGateway id="o_j" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:inclusiveGateway><bpmn:endEvent id="o_e" name="1.6"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="o_s" targetRef="o_g" /><bpmn:sequenceFlow id="Flow_1" name="сумма" sourceRef="o_g" targetRef="o_a" /><bpmn:sequenceFlow id="Flow_2" name="валюта" sourceRef="o_g" targetRef="o_b" /><bpmn:sequenceFlow id="Flow_3" sourceRef="o_a" targetRef="o_j" /><bpmn:sequenceFlow id="Flow_4" sourceRef="o_b" targetRef="o_j" /><bpmn:sequenceFlow id="Flow_5" sourceRef="o_j" targetRef="o_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_or">
<bpmndi:BPMNPlane id="BPMNPlane_or" bpmnElement="Collaboration_or">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="830" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="800" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="o_s_di" bpmnElement="o_s"><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="o_g_di" bpmnElement="o_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="272" y="55" width="66" height="28" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="o_a_di" bpmnElement="o_a"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="o_b_di" bpmnElement="o_b"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="o_j_di" bpmnElement="o_j" isMarkerVisible="true"><dc:Bounds x="678" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="o_e_di" bpmnElement="o_e"><dc:Bounds x="819" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="824" y="152" 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="330" y="126" /><di:waypoint x="414" y="126" /><bpmndi:BPMNLabel><dc:Bounds x="338" y="108" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /><bpmndi:BPMNLabel><dc:Bounds x="313" y="157" width="46" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="703" y="284" /><di:waypoint x="703" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="819" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.4a Составной пример: OR + AND + timeout
Типичная enterprise-сборка: часть веток параллельно, часть — по условию, SLA на ожидании.
<?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_mix" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_mix"><bpmn:participant id="shop" name="Магазин" processRef="process_mix" /></bpmn:collaboration>
<bpmn:process id="process_mix" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Исполнение"><bpmn:flowNodeRef>m_s</bpmn:flowNodeRef><bpmn:flowNodeRef>m_or</bpmn:flowNodeRef><bpmn:flowNodeRef>m_a</bpmn:flowNodeRef><bpmn:flowNodeRef>m_b</bpmn:flowNodeRef><bpmn:flowNodeRef>m_t</bpmn:flowNodeRef><bpmn:flowNodeRef>m_and</bpmn:flowNodeRef><bpmn:flowNodeRef>m_c</bpmn:flowNodeRef><bpmn:flowNodeRef>m_e</bpmn:flowNodeRef><bpmn:flowNodeRef>m_late</bpmn:flowNodeRef><bpmn:flowNodeRef>m_end2</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="m_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:inclusiveGateway id="m_or" name="1.2 Что запускать?"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:inclusiveGateway><bpmn:serviceTask id="m_a" name="1.3 Проверить лимит"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:serviceTask><bpmn:userTask id="m_b" name="1.4 Запросить документы"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:userTask><bpmn:boundaryEvent id="m_t" name="2 дня" attachedToRef="m_b" cancelActivity="true"><bpmn:outgoing>Flow_7</bpmn:outgoing><bpmn:timerEventDefinition id="m_t_def" /></bpmn:boundaryEvent><bpmn:parallelGateway id="m_and" name="1.6"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:parallelGateway><bpmn:sendTask id="m_c" name="1.7 Уведомить"><bpmn:incoming>Flow_5</bpmn:incoming><bpmn:outgoing>Flow_6</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="m_e" name="1.8"><bpmn:incoming>Flow_6</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="m_late" name="1.5 Эскалировать просрочку"><bpmn:incoming>Flow_7</bpmn:incoming><bpmn:outgoing>Flow_8</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="m_end2" name="1.9"><bpmn:incoming>Flow_8</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="m_s" targetRef="m_or" /><bpmn:sequenceFlow id="Flow_1" name="лимит" sourceRef="m_or" targetRef="m_a" /><bpmn:sequenceFlow id="Flow_2" name="документы" sourceRef="m_or" targetRef="m_b" /><bpmn:sequenceFlow id="Flow_3" sourceRef="m_a" targetRef="m_and" /><bpmn:sequenceFlow id="Flow_4" sourceRef="m_b" targetRef="m_and" /><bpmn:sequenceFlow id="Flow_5" sourceRef="m_and" targetRef="m_c" /><bpmn:sequenceFlow id="Flow_6" sourceRef="m_c" targetRef="m_e" /><bpmn:sequenceFlow id="Flow_7" name="SLA" sourceRef="m_t" targetRef="m_late" /><bpmn:sequenceFlow id="Flow_8" sourceRef="m_late" targetRef="m_end2" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_mix">
<bpmndi:BPMNPlane id="BPMNPlane_mix" bpmnElement="Collaboration_mix">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="1094" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="1064" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_s_di" bpmnElement="m_s"><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="m_or_di" bpmnElement="m_or" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="269" y="55" width="72" height="28" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_a_di" bpmnElement="m_a"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_b_di" bpmnElement="m_b"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_t_di" bpmnElement="m_t"><dc:Bounds x="486" y="306" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="484" y="350" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_and_di" bpmnElement="m_and" isMarkerVisible="true"><dc:Bounds x="678" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_c_di" bpmnElement="m_c"><dc:Bounds x="812" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_e_di" bpmnElement="m_e"><dc:Bounds x="1083" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1088" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_late_di" bpmnElement="m_late"><dc:Bounds x="812" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="m_end2_di" bpmnElement="m_end2"><dc:Bounds x="1083" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1088" 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="330" y="126" /><di:waypoint x="414" y="126" /><bpmndi:BPMNLabel><dc:Bounds x="338" y="108" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /><bpmndi:BPMNLabel><dc:Bounds x="313" y="157" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="703" y="284" /><di:waypoint x="703" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="812" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="992" y="126" /><di:waypoint x="1083" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7"><di:waypoint x="522" y="324" /><di:waypoint x="902" y="324" /><bpmndi:BPMNLabel><dc:Bounds x="532" y="350" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_8_di" bpmnElement="Flow_8"><di:waypoint x="992" y="284" /><di:waypoint x="1083" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.5 Цикл (Loop)
Два механизма BPMN — не смешивайте на одной задаче без необходимости:
| Механизм | Как рисовать в BPMN | Когда |
|---|---|---|
| Standard loop | Маркер петли на нижней границе задачи | Повтор одной задачи по loopCondition в loop characteristics |
| Цикл через XOR-шлюз | Обратный sequence flow через шлюз | Повтор блока из нескольких шагов |
Standard loop — итерация внутри задачи; исходящий поток только после выхода из цикла. Нет обратной стрелки 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_loop1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_loop1"><bpmn:participant id="shop" name="Магазин" processRef="process_loop1" /></bpmn:collaboration>
<bpmn:process id="process_loop1" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>lp_s</bpmn:flowNodeRef><bpmn:flowNodeRef>lp_t</bpmn:flowNodeRef><bpmn:flowNodeRef>lp_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="lp_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="lp_t" name="1.2 Уточнить заявку"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:standardLoopCharacteristics /></bpmn:userTask><bpmn:endEvent id="lp_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="lp_s" targetRef="lp_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="lp_t" targetRef="lp_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_loop1">
<bpmndi:BPMNPlane id="BPMNPlane_loop1" bpmnElement="Collaboration_loop1">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lp_s_di" bpmnElement="lp_s"><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="lp_t_di" bpmnElement="lp_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lp_e_di" bpmnElement="lp_e"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" 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="551" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Цикл через шлюз — повтор блока; здесь обратный поток уместен:
<?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_loop2" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_loop2"><bpmn:participant id="shop" name="Магазин" processRef="process_loop2" /></bpmn:collaboration>
<bpmn:process id="process_loop2" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>lg_s</bpmn:flowNodeRef><bpmn:flowNodeRef>lg_t</bpmn:flowNodeRef><bpmn:flowNodeRef>lg_g</bpmn:flowNodeRef><bpmn:flowNodeRef>lg_e</bpmn:flowNodeRef><bpmn:flowNodeRef>lg_fix</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="lg_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="lg_t" name="1.2 Проверить комплект"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:exclusiveGateway id="lg_g" name="1.3 Принято?"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:endEvent id="lg_e" name="1.4"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:manualTask id="lg_fix" name="1.5 Исправить"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:manualTask><bpmn:sequenceFlow id="Flow_0" sourceRef="lg_s" targetRef="lg_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="lg_t" targetRef="lg_g" /><bpmn:sequenceFlow id="Flow_2" name="да" sourceRef="lg_g" targetRef="lg_e" /><bpmn:sequenceFlow id="Flow_3" name="нет" sourceRef="lg_g" targetRef="lg_fix" /><bpmn:sequenceFlow id="Flow_4" sourceRef="lg_fix" targetRef="lg_t" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_loop2">
<bpmndi:BPMNPlane id="BPMNPlane_loop2" bpmnElement="Collaboration_loop2">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="696" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="666" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lg_s_di" bpmnElement="lg_s"><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="lg_t_di" bpmnElement="lg_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lg_g_di" bpmnElement="lg_g" isMarkerVisible="true"><dc:Bounds x="544" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="527" y="69" width="85" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lg_e_di" bpmnElement="lg_e"><dc:Bounds x="685" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lg_fix_di" bpmnElement="lg_fix"><dc:Bounds x="280" y="244" 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="685" 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="284" /><di:waypoint x="460" y="284" /><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="370" y="244" /><di:waypoint x="370" y="166" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Повторение задаёт маркер на задаче (standardLoopCharacteristics), а не обратный sequence flow.
2.6 Обработка тайм-аута (Timeout)
Граничное timer catch на контуре задачи. Прерывающий таймер отменяет задачу; непрерывающий запускает параллельную ветку, задача продолжается.
<?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_timeout" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_timeout"><bpmn:participant id="shop" name="Магазин" processRef="process_timeout" /></bpmn:collaboration>
<bpmn:process id="process_timeout" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Поддержка"><bpmn:flowNodeRef>to_s</bpmn:flowNodeRef><bpmn:flowNodeRef>to_t</bpmn:flowNodeRef><bpmn:flowNodeRef>to_b</bpmn:flowNodeRef><bpmn:flowNodeRef>to_e</bpmn:flowNodeRef><bpmn:flowNodeRef>to_esc</bpmn:flowNodeRef><bpmn:flowNodeRef>to_end</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="to_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="to_t" name="1.2 Ответить клиенту"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:boundaryEvent id="to_b" name="4 ч" attachedToRef="to_t" cancelActivity="true"><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:timerEventDefinition id="to_b_def" /></bpmn:boundaryEvent><bpmn:endEvent id="to_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="to_esc" name="1.4 Передать старшему"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="to_end" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="to_s" targetRef="to_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="to_t" targetRef="to_e" /><bpmn:sequenceFlow id="Flow_2" name="SLA" sourceRef="to_b" targetRef="to_esc" /><bpmn:sequenceFlow id="Flow_3" sourceRef="to_esc" targetRef="to_end" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_timeout">
<bpmndi:BPMNPlane id="BPMNPlane_timeout" bpmnElement="Collaboration_timeout">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="826" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="796" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="to_s_di" bpmnElement="to_s"><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="to_t_di" bpmnElement="to_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="to_b_di" bpmnElement="to_b"><dc:Bounds x="352" y="148" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="357" y="192" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="to_e_di" bpmnElement="to_e"><dc:Bounds x="616" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="621" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="to_esc_di" bpmnElement="to_esc"><dc:Bounds x="544" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="to_end_di" bpmnElement="to_end"><dc:Bounds x="815" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="820" 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="616" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="388" y="166" /><di:waypoint x="634" y="166" /><di:waypoint x="634" y="244" /><bpmndi:BPMNLabel><dc:Bounds x="398" y="192" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="724" y="284" /><di:waypoint x="815" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
SLA формулируйте проверяемо — 02.04.02 Критерии приёмки (Acceptance Criteria).
2.7 Эскалация (Escalation)
Граничное escalation-событие. Часто непрерывающее: основная задача не отменяется, параллельно уведомляется вышестоящий уровень. Две параллельные ветки сходятся в AND-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_esc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_esc"><bpmn:participant id="shop" name="Магазин" processRef="process_esc" /></bpmn:collaboration>
<bpmn:process id="process_esc" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Исполнение"><bpmn:flowNodeRef>es_s</bpmn:flowNodeRef><bpmn:flowNodeRef>es_t</bpmn:flowNodeRef><bpmn:flowNodeRef>es_b</bpmn:flowNodeRef><bpmn:flowNodeRef>es_j</bpmn:flowNodeRef><bpmn:flowNodeRef>es_e</bpmn:flowNodeRef><bpmn:flowNodeRef>es_boss</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="es_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="es_t" name="1.2 Согласовать скидку"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:boundaryEvent id="es_b" name="эскалация" attachedToRef="es_t" cancelActivity="false"><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:escalationEventDefinition id="es_b_def" /></bpmn:boundaryEvent><bpmn:parallelGateway id="es_j" name="1.5"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:parallelGateway><bpmn:endEvent id="es_e" name="1.6"><bpmn:incoming>Flow_4</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="es_boss" name="1.4 Решить у руководителя"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:userTask><bpmn:sequenceFlow id="Flow_0" sourceRef="es_s" targetRef="es_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="es_t" targetRef="es_j" /><bpmn:sequenceFlow id="Flow_2" sourceRef="es_b" targetRef="es_boss" /><bpmn:sequenceFlow id="Flow_3" sourceRef="es_boss" targetRef="es_j" /><bpmn:sequenceFlow id="Flow_4" sourceRef="es_j" targetRef="es_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_esc">
<bpmndi:BPMNPlane id="BPMNPlane_esc" bpmnElement="Collaboration_esc">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="826" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="796" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="es_s_di" bpmnElement="es_s"><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="es_t_di" bpmnElement="es_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="es_b_di" bpmnElement="es_b"><dc:Bounds x="352" y="148" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="337" y="192" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="es_j_di" bpmnElement="es_j" isMarkerVisible="true"><dc:Bounds x="609" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="621" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="es_e_di" bpmnElement="es_e"><dc:Bounds x="815" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="820" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="es_boss_di" bpmnElement="es_boss"><dc:Bounds x="544" y="244" 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="609" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="388" y="166" /><di:waypoint x="634" y="166" /><di:waypoint x="634" y="244" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="724" y="284" /><di:waypoint x="752" y="284" /><di:waypoint x="752" y="151" /><di:waypoint x="634" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="659" y="126" /><di:waypoint x="815" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Всплытие (bubbling): если задача в подпроцессе, прерывающая эскалация может передать управление родительскому процессу — на верхнем уровне нужен escalation handler.
2.8 Обработка ошибки (Error Boundary Event)
Граничное error catch — прерывающее: задача отменяется, поток идёт на обработчик.
<?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_err" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_err"><bpmn:participant id="shop" name="Магазин" processRef="process_err" /></bpmn:collaboration>
<bpmn:process id="process_err" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оплата"><bpmn:flowNodeRef>er_s</bpmn:flowNodeRef><bpmn:flowNodeRef>er_t</bpmn:flowNodeRef><bpmn:flowNodeRef>er_b</bpmn:flowNodeRef><bpmn:flowNodeRef>er_e</bpmn:flowNodeRef><bpmn:flowNodeRef>er_h</bpmn:flowNodeRef><bpmn:flowNodeRef>er_end</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="er_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:serviceTask id="er_t" name="1.2 Списать оплату"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:serviceTask><bpmn:boundaryEvent id="er_b" name="ошибка" attachedToRef="er_t" cancelActivity="true"><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:errorEventDefinition id="er_b_def" /></bpmn:boundaryEvent><bpmn:endEvent id="er_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="er_h" name="1.4 Разобрать ошибку"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="er_end" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:errorEventDefinition id="er_end_def" /></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="er_s" targetRef="er_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="er_t" targetRef="er_e" /><bpmn:sequenceFlow id="Flow_2" sourceRef="er_b" targetRef="er_h" /><bpmn:sequenceFlow id="Flow_3" sourceRef="er_h" targetRef="er_end" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_err">
<bpmndi:BPMNPlane id="BPMNPlane_err" bpmnElement="Collaboration_err">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="826" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="796" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="er_s_di" bpmnElement="er_s"><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="er_t_di" bpmnElement="er_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="er_b_di" bpmnElement="er_b"><dc:Bounds x="352" y="148" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="347" y="192" width="46" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="er_e_di" bpmnElement="er_e"><dc:Bounds x="616" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="621" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="er_h_di" bpmnElement="er_h"><dc:Bounds x="544" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="er_end_di" bpmnElement="er_end"><dc:Bounds x="815" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="820" 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="616" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="388" y="166" /><di:waypoint x="634" y="166" /><di:waypoint x="634" y="244" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="724" y="284" /><di:waypoint x="815" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.9 Компенсация BPMN (Compensation) — vs упрощённый откат
Настоящий паттерн компенсации BPMN: транзакционный подпроцесс, задачи с compensation marker (⚙), compensation boundary на контур подпроцесса и compensation throw при cancel/error — откат уже завершённых шагов. Детали транзакций — 03.04.01 BPMN 2.0 - введение и основы.
<?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_comp" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_comp"><bpmn:participant id="shop" name="Магазин" processRef="process_comp" /></bpmn:collaboration>
<bpmn:process id="process_comp" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="pay" name="1. Финансы"><bpmn:flowNodeRef>c_s</bpmn:flowNodeRef><bpmn:flowNodeRef>c_t</bpmn:flowNodeRef><bpmn:flowNodeRef>c_b</bpmn:flowNodeRef><bpmn:flowNodeRef>c_e</bpmn:flowNodeRef><bpmn:flowNodeRef>c_r</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="c_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:serviceTask id="c_t" name="1.2 Списать оплату"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:serviceTask><bpmn:boundaryEvent id="c_b" attachedToRef="c_t" cancelActivity="true"><bpmn:compensateEventDefinition id="c_b_def" /></bpmn:boundaryEvent><bpmn:endEvent id="c_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:serviceTask id="c_r" name="1.4 Вернуть оплату" isForCompensation="true"></bpmn:serviceTask><bpmn:sequenceFlow id="Flow_0" sourceRef="c_s" targetRef="c_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="c_t" targetRef="c_e" /><bpmn:association id="Assoc_0" sourceRef="c_b" targetRef="c_r" associationDirection="None" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_comp">
<bpmndi:BPMNPlane id="BPMNPlane_comp" bpmnElement="Collaboration_comp">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="pay_di" bpmnElement="pay" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="c_s_di" bpmnElement="c_s"><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="c_t_di" bpmnElement="c_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="c_b_di" bpmnElement="c_b"><dc:Bounds x="352" y="148" width="36" height="36" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="c_e_di" bpmnElement="c_e"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="c_r_di" bpmnElement="c_r"><dc:Bounds x="280" y="244" 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="551" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Assoc_0_di" bpmnElement="Assoc_0"><di:waypoint x="370" y="184" /><di:waypoint x="370" y="244" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Не путать с XOR-веткой «если не успешно — откатить вручную»:
<?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_fakecomp" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_fakecomp"><bpmn:participant id="shop" name="Магазин" processRef="process_fakecomp" /></bpmn:collaboration>
<bpmn:process id="process_fakecomp" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>f_s</bpmn:flowNodeRef><bpmn:flowNodeRef>f_t</bpmn:flowNodeRef><bpmn:flowNodeRef>f_g</bpmn:flowNodeRef><bpmn:flowNodeRef>f_e</bpmn:flowNodeRef><bpmn:flowNodeRef>f_u</bpmn:flowNodeRef><bpmn:flowNodeRef>f_end</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="f_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:serviceTask id="f_t" name="1.2 Провести операцию"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:serviceTask><bpmn:exclusiveGateway id="f_g" name="1.3 Успех?"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:endEvent id="f_e" name="1.4"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:userTask id="f_u" name="1.5 Откатить вручную"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="f_end" name="1.6"><bpmn:incoming>Flow_4</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="f_s" targetRef="f_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="f_t" targetRef="f_g" /><bpmn:sequenceFlow id="Flow_2" name="да" sourceRef="f_g" targetRef="f_e" /><bpmn:sequenceFlow id="Flow_3" name="нет" sourceRef="f_g" targetRef="f_u" /><bpmn:sequenceFlow id="Flow_4" sourceRef="f_u" targetRef="f_end" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_fakecomp">
<bpmndi:BPMNPlane id="BPMNPlane_fakecomp" bpmnElement="Collaboration_fakecomp">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="960" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="930" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="f_s_di" bpmnElement="f_s"><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="f_t_di" bpmnElement="f_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="f_g_di" bpmnElement="f_g" isMarkerVisible="true"><dc:Bounds x="544" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="533" y="69" width="72" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="f_e_di" bpmnElement="f_e"><dc:Bounds x="750" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="755" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="f_u_di" bpmnElement="f_u"><dc:Bounds x="678" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="f_end_di" bpmnElement="f_end"><dc:Bounds x="949" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="954" 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="594" y="126" /><di:waypoint x="750" 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="284" /><di:waypoint x="678" y="284" /><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="284" /><di:waypoint x="949" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
На ревью исполняемой модели требуйте compensation markers или фиксируйте откат в 10.01.08 Шаблон сквозной фичи (BPMN-процесс).
2.10 Паттерн «Согласование» (Approval)
Один пул, несколько дорожек — sequence flow между lanes (не message 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_approve" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_approve"><bpmn:participant id="hr" name="Заявка" processRef="process_approve" /></bpmn:collaboration>
<bpmn:process id="process_approve" name="Заявка" isExecutable="false"><bpmn:laneSet id="LaneSet_hr"><bpmn:lane id="emp" name="1. Сотрудник"><bpmn:flowNodeRef>ap_s</bpmn:flowNodeRef><bpmn:flowNodeRef>ap_u</bpmn:flowNodeRef></bpmn:lane><bpmn:lane id="boss" name="2. Руководитель"><bpmn:flowNodeRef>ap_r</bpmn:flowNodeRef><bpmn:flowNodeRef>ap_g</bpmn:flowNodeRef></bpmn:lane><bpmn:lane id="sys" name="3. Портал"><bpmn:flowNodeRef>ap_ok</bpmn:flowNodeRef><bpmn:flowNodeRef>ap_no</bpmn:flowNodeRef><bpmn:flowNodeRef>ap_e1</bpmn:flowNodeRef><bpmn:flowNodeRef>ap_e2</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="ap_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="ap_u" name="1.2 Подать заявку"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:userTask id="ap_r" name="2.1 Проверить заявку"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:userTask><bpmn:exclusiveGateway id="ap_g" name="2.2 Согласовано?"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:serviceTask id="ap_ok" name="3.1 Зафиксировать согласие"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:serviceTask><bpmn:sendTask id="ap_no" name="3.2 Сообщить об отказе"><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_6</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="ap_e1" name="3.3"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:endEvent id="ap_e2" name="3.4"><bpmn:incoming>Flow_6</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="ap_s" targetRef="ap_u" /><bpmn:sequenceFlow id="Flow_1" sourceRef="ap_u" targetRef="ap_r" /><bpmn:sequenceFlow id="Flow_2" sourceRef="ap_r" targetRef="ap_g" /><bpmn:sequenceFlow id="Flow_3" name="да" sourceRef="ap_g" targetRef="ap_ok" /><bpmn:sequenceFlow id="Flow_4" name="нет" sourceRef="ap_g" targetRef="ap_no" /><bpmn:sequenceFlow id="Flow_5" sourceRef="ap_ok" targetRef="ap_e1" /><bpmn:sequenceFlow id="Flow_6" sourceRef="ap_no" targetRef="ap_e2" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_approve">
<bpmndi:BPMNPlane id="BPMNPlane_approve" bpmnElement="Collaboration_approve">
<bpmndi:BPMNShape id="hr_di" bpmnElement="hr" isHorizontal="true"><dc:Bounds x="80" y="40" width="1224" height="656" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="emp_di" bpmnElement="emp" isHorizontal="true"><dc:Bounds x="110" y="40" width="1194" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="boss_di" bpmnElement="boss" isHorizontal="true"><dc:Bounds x="110" y="206" width="1194" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="sys_di" bpmnElement="sys" isHorizontal="true"><dc:Bounds x="110" y="372" width="1194" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_s_di" bpmnElement="ap_s"><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="ap_u_di" bpmnElement="ap_u"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_r_di" bpmnElement="ap_r"><dc:Bounds x="544" y="252" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_g_di" bpmnElement="ap_g" isMarkerVisible="true"><dc:Bounds x="808" y="267" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="778" y="235" width="110" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_ok_di" bpmnElement="ap_ok"><dc:Bounds x="942" y="418" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_no_di" bpmnElement="ap_no"><dc:Bounds x="942" y="576" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_e1_di" bpmnElement="ap_e1"><dc:Bounds x="1213" y="440" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1218" y="484" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ap_e2_di" bpmnElement="ap_e2"><dc:Bounds x="1213" y="598" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="1218" y="642" 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="634" y="126" /><di:waypoint x="634" y="252" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="724" y="292" /><di:waypoint x="808" y="292" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="858" y="292" /><di:waypoint x="1032" y="292" /><di:waypoint x="1032" y="418" /><bpmndi:BPMNLabel><dc:Bounds x="866" y="274" width="24" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="833" y="317" /><di:waypoint x="833" y="616" /><di:waypoint x="942" y="616" /><bpmndi:BPMNLabel><dc:Bounds x="841" y="323" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="1122" y="458" /><di:waypoint x="1213" y="458" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="1122" y="616" /><di:waypoint x="1213" y="616" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Таймеры просрочки, матрица согласующих — 10.01.08 Шаблон сквозной фичи (BPMN-процесс).
2.11 Межпуловое взаимодействие (Message между участниками)
Между разными пулами — только message flow (пунктир); sequence flow не пересекает границу пула — 06.02.02 Пулы, дорожки и артефакты. Процесс участника-получателя стартует по message start или перехватывает message catch после своего start event.
<?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_messages" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_messages"><bpmn:participant id="msg_buyer" name="Покупатель" processRef="process_msg_buyer" /><bpmn:participant id="msg_shop" name="Магазин" processRef="process_msg_shop" /><bpmn:messageFlow id="Message_0" name="Заказ" sourceRef="mb_send" targetRef="ms_s" /><bpmn:messageFlow id="Message_1" name="Статус" sourceRef="ms_send" targetRef="mb_wait" /></bpmn:collaboration>
<bpmn:process id="process_msg_buyer" name="Покупатель" isExecutable="false"><bpmn:laneSet id="LaneSet_msg_buyer"><bpmn:lane id="msg_b" name="Покупатель"><bpmn:flowNodeRef>mb_s</bpmn:flowNodeRef><bpmn:flowNodeRef>mb_send</bpmn:flowNodeRef><bpmn:flowNodeRef>mb_wait</bpmn:flowNodeRef><bpmn:flowNodeRef>mb_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="mb_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:sendTask id="mb_send" name="1.2 Отправить заказ"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:sendTask><bpmn:receiveTask id="mb_wait" name="1.3 Получить ответ"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:receiveTask><bpmn:endEvent id="mb_e" name="1.4"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="mb_s" targetRef="mb_send" /><bpmn:sequenceFlow id="Flow_1" sourceRef="mb_send" targetRef="mb_wait" /><bpmn:sequenceFlow id="Flow_2" sourceRef="mb_wait" targetRef="mb_e" /></bpmn:process><bpmn:process id="process_msg_shop" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_msg_shop"><bpmn:lane id="msg_s" name="1. Продажи"><bpmn:flowNodeRef>ms_s</bpmn:flowNodeRef><bpmn:flowNodeRef>ms_do</bpmn:flowNodeRef><bpmn:flowNodeRef>ms_send</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="ms_s" name="1.1"><bpmn:outgoing>Flow_3</bpmn:outgoing><bpmn:messageEventDefinition id="ms_s_def" /></bpmn:startEvent><bpmn:serviceTask id="ms_do" name="1.2 Принять заказ"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:serviceTask><bpmn:sendTask id="ms_send" name="1.3 Сообщить статус"><bpmn:incoming>Flow_4</bpmn:incoming></bpmn:sendTask><bpmn:sequenceFlow id="Flow_3" sourceRef="ms_s" targetRef="ms_do" /><bpmn:sequenceFlow id="Flow_4" sourceRef="ms_do" targetRef="ms_send" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_messages">
<bpmndi:BPMNPlane id="BPMNPlane_messages" bpmnElement="Collaboration_messages">
<bpmndi:BPMNShape id="msg_buyer_di" bpmnElement="msg_buyer" isHorizontal="true"><dc:Bounds x="80" y="40" width="956" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="msg_b_di" bpmnElement="msg_b" isHorizontal="true"><dc:Bounds x="110" y="40" width="926" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="msg_shop_di" bpmnElement="msg_shop" isHorizontal="true"><dc:Bounds x="80" y="296" width="956" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="msg_s_di" bpmnElement="msg_s" isHorizontal="true"><dc:Bounds x="110" y="296" width="926" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="mb_s_di" bpmnElement="mb_s"><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="mb_send_di" bpmnElement="mb_send"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="mb_wait_di" bpmnElement="mb_wait"><dc:Bounds x="544" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="mb_e_di" bpmnElement="mb_e"><dc:Bounds x="880" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="885" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ms_s_di" bpmnElement="ms_s"><dc:Bounds x="352" y="364" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="357" y="408" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ms_do_di" bpmnElement="ms_do"><dc:Bounds x="544" y="342" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ms_send_di" bpmnElement="ms_send"><dc:Bounds x="808" y="342" 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="724" y="126" /><di:waypoint x="880" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="388" y="382" /><di:waypoint x="544" y="382" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="724" y="382" /><di:waypoint x="808" y="382" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Message_0_di" bpmnElement="Message_0"><di:waypoint x="370" y="166" /><di:waypoint x="370" y="202" /><di:waypoint x="370" y="364" /><bpmndi:BPMNLabel><dc:Bounds x="378" y="177" width="40" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Message_1_di" bpmnElement="Message_1"><di:waypoint x="898" y="342" /><di:waypoint x="898" y="202" /><di:waypoint x="634" y="202" /><di:waypoint x="634" y="166" /><bpmndi:BPMNLabel><dc:Bounds x="906" y="265" width="46" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Именуйте сообщения (message name) для 02.03.04 Трассировка требований (концепция), 03.01.04 Интерфейсы и интеграционные взаимодействия и 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf). Асинхронная доставка между системами — 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events).
2.12 Подпроцесс и вызов (Subprocess / Call Activity)
Embedded subprocess — сворачивает блок в одном пуле; Call Activity — переиспользует отдельный процесс по ссылке.
<?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_sub" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_sub"><bpmn:participant id="shop" name="Магазин" processRef="process_sub" /></bpmn:collaboration>
<bpmn:process id="process_sub" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>su_s</bpmn:flowNodeRef><bpmn:flowNodeRef>su_sub</bpmn:flowNodeRef><bpmn:flowNodeRef>su_call</bpmn:flowNodeRef><bpmn:flowNodeRef>su_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="su_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:subProcess id="su_sub" name="1.2 Собрать заказ"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:subProcess><bpmn:callActivity id="su_call" name="1.3 Согласовать скидку" calledElement="process_discount"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:callActivity><bpmn:endEvent id="su_e" name="1.4"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="su_s" targetRef="su_sub" /><bpmn:sequenceFlow id="Flow_1" sourceRef="su_sub" targetRef="su_call" /><bpmn:sequenceFlow id="Flow_2" sourceRef="su_call" targetRef="su_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_sub">
<bpmndi:BPMNPlane id="BPMNPlane_sub" bpmnElement="Collaboration_sub">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="826" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="796" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="su_s_di" bpmnElement="su_s"><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="su_sub_di" bpmnElement="su_sub" isExpanded="false"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="su_call_di" bpmnElement="su_call"><dc:Bounds x="544" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="su_e_di" bpmnElement="su_e"><dc:Bounds x="815" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="820" y="152" 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="815" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.13 Ожидание одного из событий (Event-based Gateway)
После event-based gateway — только catch-события, не задачи. Сработало одно — остальные пути отменяются; 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_evgw" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_evgw"><bpmn:participant id="shop" name="Магазин" processRef="process_evgw" /></bpmn:collaboration>
<bpmn:process id="process_evgw" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Ожидание"><bpmn:flowNodeRef>ev_s</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_g</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_m</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_t</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_ok</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_stop</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_e1</bpmn:flowNodeRef><bpmn:flowNodeRef>ev_e2</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="ev_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:eventBasedGateway id="ev_g" name="1.2 Чем ответят?"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:eventBasedGateway><bpmn:intermediateCatchEvent id="ev_m" name="1.3 ответ"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing><bpmn:messageEventDefinition id="ev_m_def" /></bpmn:intermediateCatchEvent><bpmn:intermediateCatchEvent id="ev_t" name="1.4 2 дня"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing><bpmn:timerEventDefinition id="ev_t_def" /></bpmn:intermediateCatchEvent><bpmn:userTask id="ev_ok" name="1.5 Продолжить"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:userTask><bpmn:sendTask id="ev_stop" name="1.6 Закрыть по таймеру"><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_6</bpmn:outgoing></bpmn:sendTask><bpmn:endEvent id="ev_e1" name="1.7"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:endEvent id="ev_e2" name="1.8"><bpmn:incoming>Flow_6</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="ev_s" targetRef="ev_g" /><bpmn:sequenceFlow id="Flow_1" sourceRef="ev_g" targetRef="ev_m" /><bpmn:sequenceFlow id="Flow_2" sourceRef="ev_g" targetRef="ev_t" /><bpmn:sequenceFlow id="Flow_3" sourceRef="ev_m" targetRef="ev_ok" /><bpmn:sequenceFlow id="Flow_4" sourceRef="ev_t" targetRef="ev_stop" /><bpmn:sequenceFlow id="Flow_5" sourceRef="ev_ok" targetRef="ev_e1" /><bpmn:sequenceFlow id="Flow_6" sourceRef="ev_stop" targetRef="ev_e2" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_evgw">
<bpmndi:BPMNPlane id="BPMNPlane_evgw" bpmnElement="Collaboration_evgw">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="830" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="800" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_s_di" bpmnElement="ev_s"><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="ev_g_di" bpmnElement="ev_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="276" y="55" width="59" height="28" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_m_di" bpmnElement="ev_m"><dc:Bounds x="421" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="406" y="152" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_t_di" bpmnElement="ev_t"><dc:Bounds x="421" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="406" y="310" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_ok_di" bpmnElement="ev_ok"><dc:Bounds x="548" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_stop_di" bpmnElement="ev_stop"><dc:Bounds x="548" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_e1_di" bpmnElement="ev_e1"><dc:Bounds x="819" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="824" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_e2_di" bpmnElement="ev_e2"><dc:Bounds x="819" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="824" 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="330" y="126" /><di:waypoint x="421" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="421" y="284" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="457" y="126" /><di:waypoint x="548" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="457" y="284" /><di:waypoint x="548" y="284" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="819" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="728" y="284" /><di:waypoint x="819" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Сравнение OR vs event-based — 06.02.01 Потоки, шлюзы, события.
2.14 Подпроцесс событий (Event Subprocess)
Обработчик на уровне процесса: стартует по catch-событию, пока процесс активен.
<?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_evsub" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_evsub"><bpmn:participant id="shop" name="Магазин" processRef="process_evsub" /></bpmn:collaboration>
<bpmn:process id="process_evsub" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Заказ"><bpmn:flowNodeRef>esu_s</bpmn:flowNodeRef><bpmn:flowNodeRef>esu_t</bpmn:flowNodeRef><bpmn:flowNodeRef>esu_e</bpmn:flowNodeRef><bpmn:flowNodeRef>esu_sub</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="esu_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="esu_t" name="1.2 Вести заказ"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="esu_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:subProcess id="esu_sub" name="Отмена по сообщению" triggeredByEvent="true"></bpmn:subProcess><bpmn:sequenceFlow id="Flow_0" sourceRef="esu_s" targetRef="esu_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="esu_t" targetRef="esu_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_evsub">
<bpmndi:BPMNPlane id="BPMNPlane_evsub" bpmnElement="Collaboration_evsub">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="esu_s_di" bpmnElement="esu_s"><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="esu_t_di" bpmnElement="esu_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="esu_e_di" bpmnElement="esu_e"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="esu_sub_di" bpmnElement="esu_sub" isExpanded="false"><dc:Bounds x="280" y="244" 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="551" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.15 Множественные экземпляры (Multiple Instances)
Одна задача для каждого элемента набора. Маркер MI — три линии внизу задачи.
| Режим | Поведение | Пример |
|---|---|---|
| Parallel MI | Все экземпляры одновременно | Проверить каждую строку заказа |
| Sequential MI | По очереди | Согласование по цепочке департаментов |
Completion condition задаётся в loop characteristics, не на шлюзе.
Parallel MI:
<?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_mip" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_mip"><bpmn:participant id="shop" name="Магазин" processRef="process_mip" /></bpmn:collaboration>
<bpmn:process id="process_mip" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Склад"><bpmn:flowNodeRef>mi_s</bpmn:flowNodeRef><bpmn:flowNodeRef>mi_t</bpmn:flowNodeRef><bpmn:flowNodeRef>mi_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="mi_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="mi_t" name="1.2 Проверить строку заказа"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:multiInstanceLoopCharacteristics isSequential="false" /></bpmn:userTask><bpmn:endEvent id="mi_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="mi_s" targetRef="mi_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="mi_t" targetRef="mi_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_mip">
<bpmndi:BPMNPlane id="BPMNPlane_mip" bpmnElement="Collaboration_mip">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="mi_s_di" bpmnElement="mi_s"><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="mi_t_di" bpmnElement="mi_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="mi_e_di" bpmnElement="mi_e"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" 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="551" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Sequential MI — типичный паттерн «цепочка согласующих» в одной задаче:
<?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_mis" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_mis"><bpmn:participant id="shop" name="Магазин" processRef="process_mis" /></bpmn:collaboration>
<bpmn:process id="process_mis" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Согласование"><bpmn:flowNodeRef>ms_s</bpmn:flowNodeRef><bpmn:flowNodeRef>ms_t</bpmn:flowNodeRef><bpmn:flowNodeRef>ms_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="ms_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="ms_t" name="1.2 Согласовать в отделе"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:multiInstanceLoopCharacteristics isSequential="true" /></bpmn:userTask><bpmn:endEvent id="ms_e" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="ms_s" targetRef="ms_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="ms_t" targetRef="ms_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_mis">
<bpmndi:BPMNPlane id="BPMNPlane_mis" bpmnElement="Collaboration_mis">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="166" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ms_s_di" bpmnElement="ms_s"><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="ms_t_di" bpmnElement="ms_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ms_e_di" bpmnElement="ms_e"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" 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="551" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.16 Связующие события (Link Events)
Link throw / link catch — off-page connector: пара событий с одним именем связывает фрагменты одной диаграммы без подпроцесса.
<?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_link" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_link"><bpmn:participant id="shop" name="Магазин" processRef="process_link" /></bpmn:collaboration>
<bpmn:process id="process_link" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Оператор"><bpmn:flowNodeRef>lk_s</bpmn:flowNodeRef><bpmn:flowNodeRef>lk_t</bpmn:flowNodeRef><bpmn:flowNodeRef>lk_throw</bpmn:flowNodeRef><bpmn:flowNodeRef>lk_catch</bpmn:flowNodeRef><bpmn:flowNodeRef>lk_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="lk_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:userTask id="lk_t" name="1.2 Повторить запрос"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing></bpmn:userTask><bpmn:intermediateThrowEvent id="lk_throw" name="1.3"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:linkEventDefinition id="lk_throw_def" name="ещё раз" /></bpmn:intermediateThrowEvent><bpmn:intermediateCatchEvent id="lk_catch" name="1.4"><bpmn:outgoing>Flow_2</bpmn:outgoing><bpmn:linkEventDefinition id="lk_catch_def" name="ещё раз" /></bpmn:intermediateCatchEvent><bpmn:endEvent id="lk_e" name="1.5"><bpmn:incoming>Flow_2</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="lk_s" targetRef="lk_t" /><bpmn:sequenceFlow id="Flow_1" sourceRef="lk_t" targetRef="lk_throw" /><bpmn:sequenceFlow id="Flow_2" sourceRef="lk_catch" targetRef="lk_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_link">
<bpmndi:BPMNPlane id="BPMNPlane_link" bpmnElement="Collaboration_link">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="562" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="532" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lk_s_di" bpmnElement="lk_s"><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="lk_t_di" bpmnElement="lk_t"><dc:Bounds x="280" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lk_throw_di" bpmnElement="lk_throw"><dc:Bounds x="551" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="556" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lk_catch_di" bpmnElement="lk_catch"><dc:Bounds x="153" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="158" y="310" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lk_e_di" bpmnElement="lk_e"><dc:Bounds x="352" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="357" 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="551" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="189" y="284" /><di:waypoint x="352" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
2.17 Terminate End Event
Terminate end event мгновенно завершает все активные токены процесса. Только когда бизнес требует «остановить всё»; иначе — обычный end на каждой ветке.
<?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_term" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_term"><bpmn:participant id="shop" name="Магазин" processRef="process_term" /></bpmn:collaboration>
<bpmn:process id="process_term" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Исполнение"><bpmn:flowNodeRef>tm_s</bpmn:flowNodeRef><bpmn:flowNodeRef>tm_g</bpmn:flowNodeRef><bpmn:flowNodeRef>tm_a</bpmn:flowNodeRef><bpmn:flowNodeRef>tm_b</bpmn:flowNodeRef><bpmn:flowNodeRef>tm_e</bpmn:flowNodeRef><bpmn:flowNodeRef>tm_t</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="tm_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:parallelGateway id="tm_g" name="1.2"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:parallelGateway><bpmn:userTask id="tm_a" name="1.3 Готовить отчёт"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:userTask><bpmn:receiveTask id="tm_b" name="1.4 Ждать отмену"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:receiveTask><bpmn:endEvent id="tm_e" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming></bpmn:endEvent><bpmn:endEvent id="tm_t" name="1.6"><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:terminateEventDefinition id="tm_t_def" /></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="tm_s" targetRef="tm_g" /><bpmn:sequenceFlow id="Flow_1" sourceRef="tm_g" targetRef="tm_a" /><bpmn:sequenceFlow id="Flow_2" sourceRef="tm_g" targetRef="tm_b" /><bpmn:sequenceFlow id="Flow_3" sourceRef="tm_a" targetRef="tm_e" /><bpmn:sequenceFlow id="Flow_4" sourceRef="tm_b" targetRef="tm_t" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_term">
<bpmndi:BPMNPlane id="BPMNPlane_term" bpmnElement="Collaboration_term">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="696" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="666" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="tm_s_di" bpmnElement="tm_s"><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="tm_g_di" bpmnElement="tm_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="292" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="tm_a_di" bpmnElement="tm_a"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="tm_b_di" bpmnElement="tm_b"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="tm_e_di" bpmnElement="tm_e"><dc:Bounds x="685" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="152" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="tm_t_di" bpmnElement="tm_t"><dc:Bounds x="685" y="266" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="690" 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="330" y="126" /><di:waypoint x="414" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="685" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="685" y="284" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
3. Как применяется в работе аналитика
- Начинайте с последовательности — не добавляйте шлюзы «на будущее».
- Шлюзы парные по типу — AND-split → AND-merge; OR-split → OR-merge. XOR-merge опционален в structured XOR, но при сомнении рисуйте явный XOR-join.
- Не смешивайте AND и XOR на слиянии — см. anti-pattern в разделе 4.
- Граничные события — для SLA, ошибок, эскалаций; не дублируйте логику условными стрелками из середины задачи.
- Инкапсулируйте — subprocess / call activity; шаблон — 10.01.08 Шаблон сквозной фичи (BPMN-процесс).
- Сверяйтесь со стандартом и WPI — ревью по 08.04 Рецензирование и инспекции (техники Фейгана); исполняемость — 06.02.04 Работа с Camunda.
UML Activity vs BPMN: Activity Diagram подходит для алгоритма внутри сервиса или метода; BPMN — для сквозного процесса с участниками, SLA и исполнением в движке. Подробнее — 06.01.02 Поведенческие диаграммы (State, Activity, Use Case).
Выбор паттерна (кратко):
| Задача | Паттерн |
|---|---|
| Один из путей по условию | XOR |
| Все ветки параллельно | AND |
| Несколько путей по независимым условиям | OR |
| Ждём внешнее событие или время | Event-based gateway + catch |
| SLA на задаче | Boundary timer |
| Участники в разных организациях | Пулы + message flow + message start |
| Повтор использования блока | Call activity |
| N обработчиков одной задачи | MI parallel / sequential |
| Большая диаграмма, разрыв без subprocess | Link throw / catch |
4. Типовые ошибки и ограничения
Anti-pattern: AND-split → XOR-merge
Параллельные ветки сходятся в XOR — merge «висит», пока не придут все ветки, хотя XOR ждёт одну.
<?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_bad" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:collaboration id="Collaboration_bad"><bpmn:participant id="shop" name="Магазин" processRef="process_bad" /></bpmn:collaboration>
<bpmn:process id="process_bad" name="Магазин" isExecutable="false"><bpmn:laneSet id="LaneSet_shop"><bpmn:lane id="ops" name="1. Исполнение"><bpmn:flowNodeRef>bd_s</bpmn:flowNodeRef><bpmn:flowNodeRef>bd_g</bpmn:flowNodeRef><bpmn:flowNodeRef>bd_a</bpmn:flowNodeRef><bpmn:flowNodeRef>bd_b</bpmn:flowNodeRef><bpmn:flowNodeRef>bd_j</bpmn:flowNodeRef><bpmn:flowNodeRef>bd_e</bpmn:flowNodeRef></bpmn:lane></bpmn:laneSet><bpmn:startEvent id="bd_s" name="1.1"><bpmn:outgoing>Flow_0</bpmn:outgoing></bpmn:startEvent><bpmn:parallelGateway id="bd_g" name="1.2"><bpmn:incoming>Flow_0</bpmn:incoming><bpmn:outgoing>Flow_1</bpmn:outgoing><bpmn:outgoing>Flow_2</bpmn:outgoing></bpmn:parallelGateway><bpmn:manualTask id="bd_a" name="1.3 Упаковать"><bpmn:incoming>Flow_1</bpmn:incoming><bpmn:outgoing>Flow_3</bpmn:outgoing></bpmn:manualTask><bpmn:serviceTask id="bd_b" name="1.4 Выставить счёт"><bpmn:incoming>Flow_2</bpmn:incoming><bpmn:outgoing>Flow_4</bpmn:outgoing></bpmn:serviceTask><bpmn:exclusiveGateway id="bd_j" name="1.5"><bpmn:incoming>Flow_3</bpmn:incoming><bpmn:incoming>Flow_4</bpmn:incoming><bpmn:outgoing>Flow_5</bpmn:outgoing></bpmn:exclusiveGateway><bpmn:endEvent id="bd_e" name="1.6"><bpmn:incoming>Flow_5</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0" sourceRef="bd_s" targetRef="bd_g" /><bpmn:sequenceFlow id="Flow_1" sourceRef="bd_g" targetRef="bd_a" /><bpmn:sequenceFlow id="Flow_2" sourceRef="bd_g" targetRef="bd_b" /><bpmn:sequenceFlow id="Flow_3" sourceRef="bd_a" targetRef="bd_j" /><bpmn:sequenceFlow id="Flow_4" sourceRef="bd_b" targetRef="bd_j" /><bpmn:sequenceFlow id="Flow_5" sourceRef="bd_j" targetRef="bd_e" /></bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_bad">
<bpmndi:BPMNPlane id="BPMNPlane_bad" bpmnElement="Collaboration_bad">
<bpmndi:BPMNShape id="shop_di" bpmnElement="shop" isHorizontal="true"><dc:Bounds x="80" y="40" width="830" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ops_di" bpmnElement="ops" isHorizontal="true"><dc:Bounds x="110" y="40" width="800" height="324" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="bd_s_di" bpmnElement="bd_s"><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="bd_g_di" bpmnElement="bd_g" isMarkerVisible="true"><dc:Bounds x="280" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="292" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="bd_a_di" bpmnElement="bd_a"><dc:Bounds x="414" y="86" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="bd_b_di" bpmnElement="bd_b"><dc:Bounds x="414" y="244" width="180" height="80" /></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="bd_j_di" bpmnElement="bd_j" isMarkerVisible="true"><dc:Bounds x="678" y="101" width="50" height="50" /><bpmndi:BPMNLabel><dc:Bounds x="690" y="69" width="27" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="bd_e_di" bpmnElement="bd_e"><dc:Bounds x="819" y="108" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="824" y="152" 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="330" y="126" /><di:waypoint x="414" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="305" y="151" /><di:waypoint x="305" y="284" /><di:waypoint x="414" y="284" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="594" y="126" /><di:waypoint x="678" y="126" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="594" y="284" /><di:waypoint x="703" y="284" /><di:waypoint x="703" y="151" /></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="728" y="126" /><di:waypoint x="819" y="126" /></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Исправление: AND-merge (+) перед «Отгрузить», как в п. 2.3.
Anti-pattern: OR-merge как AND
OR-merge ждёт завершения только активированных на OR-split веток. Ошибка — требовать завершения всех исходящих веток split, включая неактивированные: процесс блокируется навсегда.
Исправление: OR-merge в паре с тем же OR-split; условия на исходящих потоках явные; в спецификации зафиксируйте, какие ветки активировались.
Anti-pattern: неявное слияние после AND-split
Несколько потоков после AND-split сходятся в одну задачу без AND-merge — движок может пропустить шаг до завершения всех веток.
Исправление: явный AND-merge (+), как в п. 2.3 и 2.7.
Другие частые ошибки
| Ошибка | Почему плохо | Что делать |
|---|---|---|
| Event-based → сразу задачи | Нарушение BPMN 2.0 | Catch-события, затем задачи |
| OR как XOR | Пропуск параллельных веток | OR активирует все истинные условия |
| Standard loop как XOR-стрелка | Неверная семантика | Маркер петли на задаче, без обратного flow |
| Message flow внутри пула | Смешение collaboration и process | Sequence flow между дорожками |
| Пул без message start/catch | Процесс «висящий» без триггера | Message start или catch после start — п. 2.11 |
| «Compensation» через XOR | Не откат по стандарту | Compensation marker или явная спецификация |
| N non-interrupting без AND-merge | Две параллельные ветки без синхронизации | AND-merge перед общим шагом — п. 2.7 |
| Terminate без необходимости | Обрывает весь процесс | Только при явном требовании |
| Схема не в BPMN XML | Нет типов задач, маркеров MI и boundary | Финальная модель — файл .bpmn и 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io) |
Связи с другими разделами базы
- 06.02.01 Потоки, шлюзы, события — семантика шлюзов, событий и потоков; база для всех паттернов
- 06.02.02 Пулы, дорожки и артефакты — collaboration, message flow, message start
- 06.02.04 Работа с Camunda — исполнение паттернов (таймеры, MI, incidents)
- 03.04.01 BPMN 2.0 - введение и основы — обзор нотации SA; транзакции и compensation
- 10.01.08 Шаблон сквозной фичи (BPMN-процесс) — документирование полного процесса
- 02.03.04 Трассировка требований (концепция) — message name и correlation между пулами
- 03.01.04 Интерфейсы и интеграционные взаимодействия — message flow и контракты
- 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf) — детализация message throw/catch
- 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events) — event-based и межсистемный обмен
- 02.04.02 Критерии приёмки (Acceptance Criteria) — SLA и условия на шлюзах
- 08.04 Рецензирование и инспекции (техники Фейгана) — ревью диаграмм процессов
- 06.01.02 Поведенческие диаграммы (State, Activity, Use Case) — UML Activity vs BPMN
- 01.06 Принципы и паттерны проектирования решений — «паттерн» в смысле проектирования, не BPMN-idiom
- 07.04 Инструменты моделирования (Sparx EA, Lucidchart, draw.io) — нативная отрисовка BPMN
Источники и дополнительные материалы
Книги и стандарты
- OMG. Business Process Model and Notation (BPMN) Version 2.0.2 — норматив по шлюзам, boundary events, MI, event subprocess, compensation. https://www.omg.org/spec/BPMN/2.0.2
- Брюс Сильвер. «BPMN в действии. Моделирование и анализ бизнес-процессов» — Method & Style, structured models, парность шлюзов. ДМК Пресс.
- Томас Аллвейер. «BPMN 2.0. Introduction to the Standard for Business Process Modeling» — распространённые шаблоны потоков.
- Stephen A. White. «BPMN 2.0 and Workflow Patterns» — соответствие элементов BPMN паттернам WPI. https://www.omg.org/bpmn/Documents/Notations_and_Workflow_Patterns.pdf
Каталоги паттернов
- Workflow Patterns Initiative — control-flow patterns (WCP), таблица соответствия BPMN. http://www.workflowpatterns.com/evaluations/standard/bpmn.php
Справочники по моделированию
- Camunda — BPMN 2.0 Reference — elements из статьи (events, gateways, multi-instance, event subprocess). https://docs.camunda.org/manual/latest/reference/bpmn20/
- Bizagi — документация BPM Suite — иллюстрированный справочник по нотации. https://help.bizagi.com/bpm-suite/en/