Перейти к основному содержимому

Справочник по нотации BPMN 2.0

Теория данных (раздел 3)

ERD — Entity Relationship; SQL — SQL для аналитики, SQL; миграции — Пакетная работа. Полная таблица — о разделе.


Назначение

Элементы нотации нотации BPMN 2.0 и правила применения на диаграммах. Учебный курс: раздел.


Краткое пояснение

Крупный справочник по важнейшей системе моделирования. Ниже — интерактивный поиск по элементам и мини-редактор процесса; таблицы в статье дополняют справочник детальной семантикой. Графические символы — SVG в it-encyclopedia-media (public/encyclopedia/_shared/img/bpmn/, пересборка: npm run docs:bpmn-icons в KB).

События

  • Стартовое событиеСтарт
  • Timer CatchПромежуточное
  • Конечное событиеКонец
  • Message StartСообщение
  • Timer StartТаймер
  • Error EndОшибка

Задачи

  • ЗадачаЗадача
  • User TaskПользователь
  • Service TaskСервис
  • Script TaskСкрипт
  • ПодпроцессПодпроцесс
  • Call ActivityВызов

Шлюзы и потоки

  • Exclusive GatewayXOR
  • Parallel GatewayAND
  • Inclusive GatewayOR
  • Sequence FlowПоток
  • Message FlowСообщение
  • ПулПул / дорожка

Артефакты

  • Data ObjectДанные
  • Data StoreХранилище
  • Text AnnotationАннотация
  • GroupГруппа

Play ITЗагрузка интерактивного демо…

Примеры составных диаграмм

Ниже — учебные процессы, собранные из тех же SVG-иконок (_shared/img/bpmn/). Их можно вставлять в статьи компонентом <BpmnProcessDiagram id="…" />; определения — в src/data/bpmn/processDiagrams.js.

Обработка заказа (описательный уровень)
Клиент
Message StartЗаявка
Receive TaskОформить заказ
Менеджер
User TaskПроверить
Exclusive GatewayДанные верны?
Send TaskУточнить
Система
Service TaskИсполнить
Конечное событиеЗакрыт

Три роли: клиент оформляет заявку, менеджер проверяет, система исполняет. Шлюз «данные верны?» ветвит поток.

Согласование документа
Стартовое событиеДокумент готов
User TaskСогласовать
Exclusive GatewayУтвердить?
Да
Конечное событиеУтверждено
Нет
User TaskДоработать

Руководитель утверждает или возвращает на доработку.

Реакция на инцидент
Timer StartАлерт
Service TaskКлассифицировать
Exclusive GatewayКритично?
Да
User TaskЭскалация
Конечное событиеЗакрыт
Нет
Script TaskАвто-ремедиация
Конечное событиеЗакрыт

Алерт запускает классификацию; критичные инциденты эскалируются вручную.


Справочные таблицы

Содержание справочника


1. Flow Objects (Объекты потока)

Flow Objects — основные узлы поведенческой модели. Определяют события, действия и решения в потоке управления.


1.1 Events (События)

События инициируют, изменяют или завершают процесс. В BPMN 2.0 все события визуально — круги. Тип события определяется:

  • Границей — тонкая (start), жирная (end), пунктирная (intermediate)
  • Внутренней иконкой: указывает на триггер или результат
  • Заливкой — белая (catching), чёрная (throwing), двойная (non-interrupting)
Тип событияBPMN-классИконкаГраницаЗаполнениеСемантикаКлючевые атрибутыДопустимые значения / примечания
Start Eventbpmn:startEventСтартовое событие Timer Start Message Start Signal Start Conditional StartТонкаяБелоеИнициирует процесс или подпроцессisInterrupting (только для attached)true (по умолчанию для start), false (только у attached intermediate)
Message Startbpmn:startEventMessage StartТонкаяБелоеОжидает входящего сообщенияmessageRefСсылка на объявленный bpmn:message с указанием itemRef (структура данных)
Timer Startbpmn:startEventTimer StartТонкаяБелоеЗапускается по расписаниюtimerEventDefinitiontimeDate, timeDuration, timeCycletimeDate: ISO 8601 (напр., 2025-12-18T12:00:00+03:00) timeDuration: PT30M (30 минут) timeCycle: R5/PT1H (5 раз по часу) или cron-подобный 0 0 12 * * ? (если поддерживается движком)
Signal Startbpmn:startEventSignal StartТонкаяБелоеЗапускается при трансляции сигналаsignalRefСсылка на bpmn:signal (глобальное или локальное имя). Трансляция — throwEvent с signalEventDefinition
Error StartНе существует. Error Event не может быть стартовым.
Conditional Startbpmn:startEventConditional StartТонкаяБелоеЗапускается при выполнении условияconditionExpressionВыражение в языке, поддерживаемом движком (FEEL, XPath, JUEL). Пример: ${systemStatus == "online"}
Intermediate Catch Eventbpmn:intermediateCatchEventсм. подтипы нижеПунктирнаяБелоеОжидает внешнего или временного триггера в середине потока
Message Intermediate Catchbpmn:intermediateCatchEventMessage CatchПунктирнаяБелоеОжидает входящего сообщения в потокеmessageRefКак у Message Start. Может иметь outputSet для маппинга входных данных
Timer Intermediate Catchbpmn:intermediateCatchEventTimer CatchПунктирнаяБелоеПауза до наступления времениtimerEventDefinitionКак у Timer Start. Используется для задержки, таймаутов, SLA-контроля
Signal Intermediate Catchbpmn:intermediateCatchEventSignal CatchПунктирнаяБелоеОжидает широковещательного сигналаsignalRefПерехватывает сигнал по имени. Поддерживает eventDefinitions множественных типов в одном событии (multiple catch)
Conditional Intermediate Catchbpmn:intermediateCatchEventConditional CatchПунктирнаяБелоеОжидает выполнения условия в реальном времениconditionExpressionВыражение переоценивается периодически. Не блокируется — продолжает опрос. Используется редко, требует поддержки движком
Link Intermediate Catchbpmn:intermediateCatchEventLink CatchПунктирнаяБелоеПринимает управление от Link ThrownameСтроковый идентификатор. Пара (catch, throw) должна иметь одинаковое имя. Используется для визуального разрыва потока без семантики события
Intermediate Throw Eventbpmn:intermediateThrowEventсм. подтипы нижеПунктирнаяЧёрноеГенерирует сигнал, сообщение, ошибку и др.
Message Throwbpmn:intermediateThrowEventMessage ThrowПунктирнаяЧёрноеОтправляет сообщениеmessageRef, inputSetУказывает получателя через participantRef в collaboration или через correlation keys. Может инициировать message start другого пула
Signal Throwbpmn:intermediateThrowEventSignal ThrowПунктирнаяЧёрноеТранслирует сигнал всем заинтересованным процессамsignalRefГлобальная трансляция (если scope="global"). Локальная — только в рамках того же процесса (движки могут не поддерживать scope явно)
Escalation Throwbpmn:intermediateThrowEventEscalation ThrowПунктирнаяЧёрноеИнициирует эскалацию (не прерывает текущий поток)escalationRefСсылка на bpmn:escalation. Перехватывается escalationEventDefinition в boundary или intermediate catch
Compensation Throwbpmn:intermediateThrowEventCompensation ThrowПунктирнаяЧёрноеЗапускает компенсацию (откат) ранее выполненной активностиactivityRefУказывает bpmn:activity, для которой вызывается компенсационный обработчик (compensateEventDefinition в её boundary)
Link Throwbpmn:intermediateThrowEventLink ThrowПунктирнаяЧёрноеПередаёт управление на Link Catch с тем же именемnameПарный элемент. Используется для избежания пересечений линий. Не несёт семантики, только визуальный переход
End Eventbpmn:endEventсм. подтипы нижеЖирнаяЧёрноеЗавершает поток выполнения (токен выбрасывается)
None Endbpmn:endEventКонечное событиеЖирнаяЧёрноеНормальное завершение потока без результатаЕдинственный обязательный тип. Все процессы должны иметь хотя бы одно окончание
Message Endbpmn:endEventMessage EndЖирнаяЧёрноеОтправляет сообщение и завершает потокmessageRefАналогично Message Throw, но с немедленным завершением после отправки
Signal Endbpmn:endEventSignal EndЖирнаяЧёрноеТранслирует сигнал и завершает потокsignalRefЧасто используется для оповещения о завершении (напр., processCompleted)
Error Endbpmn:endEventError EndЖирнаяЧёрноеЗавершает поток с ошибкойerrorRefСсылка на bpmn:error. Перехватывается boundary error event родительского подпроцесса. Если не перехвачен — ошибка процесса
Escalation Endbpmn:endEventEscalation EndЖирнаяЧёрноеЗавершает поток с эскалациейescalationRefАналогично Error End, но означает управляемое исключение (не фатальную ошибку)
Cancel Endbpmn:endEventCancel EndЖирнаяЧёрноеОтменяет транзакционный подпроцесс (transaction)Может существовать только внутри transaction. Приводит к выполнению компенсаций и переходу к cancel boundary event
Terminate Endbpmn:endEventTerminate EndЖирнаяЧёрноеНемедленно завершает весь процесс (все токены, все пулы)Используется крайне редко. Эквивалент System.exit() — нет graceful shutdown

Особые события — Boundary Events (Прикреплённые)

Boundary Event — bpmn:boundaryEvent, дочерний элемент bpmn:activity.
Атрибуты:

  • attachedToRef — ссылка на bpmn:activity
  • cancelActivitytrue (прерывающий, interrupting), false (non-interrupting)
ТипИконкаПрерывающий (cancelActivity="true")Non-interrupting (cancelActivity="false")
TimerBoundary TimerОстанавливает активность по таймауту. Пример: SLA превышен → переход в escalationПозволяет активности продолжать работу, но запускает параллельную ветку. Пример: напоминание каждые 24ч
MessageBoundary MessageРеагирует на входящее сообщение (напр., "отмена заявки") и останавливает активностьРеагирует на сообщение, не останавливая основную работу. Пример: уведомление о статусе
ErrorBoundary ErrorПерехватывает errorEndEvent или исключение из вызова сервисаНе поддерживается для error. Error — всегда interrupting
EscalationEscalation ThrowПерехватывает escalationThrow/EndEventПоддерживается. Запускает обработку, активность продолжает выполнение
SignalSignal CatchРеагирует на сигналПоддерживается. Часто используется для broadcast-управления (pause/resume)
CompensationCompensation ThrowТолько non-interrupting. cancelActivity игнорируется. Всегда вызывается при компенсации

Boundary Event не может быть стартовым или конечным — только промежуточным.
Один элемент активности может иметь множество boundary events разных типов.


2. Activities (Действия)

Activity — элемент, потребляющий время и/или ресурсы. В BPMN все действия прямоугольные. Углы определяют тип:

  • Прямые углы — Task (атомарное действие)
  • Скошенные углы — Sub-Process (группа действий)
  • Двойная обводка — Transaction или Call Activity (зависимо от контекста)

Действия делятся на:

  • Task — неделимая работа
  • Sub-Process — составное действие, разворачиваемое в диаграмме или свёрнутое
  • Call Activity — вызов глобального процесса или глобального подпроцесса по ссылке

Общие атрибуты всех bpmn:activity:

  • id — уникальный идентификатор в области видимости (обязательный)
  • name — человекочитаемое имя (необязательный, но рекомендован)
  • isForCompensationtrue, если действие участвует в компенсации (например, откатывает изменения при ошибке)
  • startQuantity, completionQuantity — устаревшие, не используются в BPMN 2.0 (игнорируются движками)
  • default — ссылка на исходящий sequence flow по умолчанию (если условия на других потоках не выполнились)
  • ioSpecification — декларация входных/выходных данных (см. ниже)
  • dataInputAssociation, dataOutputAssociation — маппинг данных между окружением и задачей
  • property — локальные переменные активности (внутреннее состояние)
  • extensionElements — расширения (движко-специфичные параметры, например, camunda:asyncBefore, flowable:candidateUsers)

2.1 Task (Задача)

bpmn:task — базовый тип действия. Специализируется через атрибут implementation или через специализированные подтипы.

Тип задачиBPMN-классИконкаСемантикаКлючевые атрибутыДопустимые значения / примечания
None Taskbpmn:taskЗадачаАбстрактное действие, не имеющее специфики реализацииИспользуется на ранних этапах моделирования. В исполнимой модели заменяется на конкретный тип
Service Taskbpmn:serviceTaskService TaskАвтоматическое выполнение через внешний сервисimplementation, operationRef, resultVariable, expression, class, delegateExpression, typeimplementation: – "##WebService" — вызов SOAP/WSDL-операции (operationRef обязателен) – "##unspecified" — вызов по контракту (рекомендуется указать operationRef) – "other" — кастомная реализация (движко-зависимо) class — полное имя Java-класса (Camunda, Flowable) expression — выражение (JUEL, FEEL), возвращающее результат resultVariable — имя переменной, куда сохранить результат
User Taskbpmn:userTaskUser TaskРабота, выполняемая человеком через UIimplementation, renderer, candidateUsers, candidateGroups, assignee, priority, dueDate, formKeyimplementation: – "##unspecified" (по умолчанию) – "##taskForm" — форма встроенная в движок assignee — конкретный исполнитель (строка, может быть выражением ${manager}) candidateUsers, candidateGroups — списки потенциальных исполнителей (через запятую или выражение) formKey — идентификатор формы (URL, BPMN ID, шаблон) priority — целое число (1–100, зависит от движка) dueDate — ISO 8601 или выражение ${now() + PT24H}
Script Taskbpmn:scriptTaskScript TaskВыполнение скрипта внутри движкаscript, scriptFormat, resultVariablescriptFormat: – "http://www.java.com/java" (Groovy, если движок поддерживает) – "http://www.groovy.org/groovy""http://www.ecmascript.org" (JavaScript, напр., Nashorn) – "FEEL" (Friendly Enough Expression Language — DMN-совместимый) script — тело скрипта (в XML CData или атрибуте) resultVariable — имя переменной результата, если скрипт возвращает значение
Send Taskbpmn:sendTaskSend TaskОтправка сообщения без ожидания ответаimplementation, messageRef, operationRefАналог messageIntermediateThrowEvent, но в форме задачи. Может иметь inputSet для данных сообщения. Не блокирует поток — завершается сразу после отправки
Receive Taskbpmn:receiveTaskReceive TaskОжидание входящего сообщения до продолженияmessageRef, instantiate, operationRefБлокирует поток до получения сообщения через correlation. instantiate="true" — может инициировать процесс (устаревшее, лучше использовать message start). Часто заменяется messageIntermediateCatchEvent
Manual Taskbpmn:manualTaskManual TaskРабота, выполняемая вручную вне ИТ-системыНет автоматизации. Просто маркер для документирования офлайн-операций (напр., "подписать бумажный документ"). Не создаёт задач в UI
Business Rule Taskbpmn:businessRuleTaskBusiness Rule TaskПрименение правил (правил принятия решений)implementation, resultVariable, ruleFlowGroup, decisionRef, decisionRefBinding, mapDecisionResultimplementation: – "##DRL" — Drools Rule Language (jBPM) – "##DMN" — вызов DMN-решения (рекомендуется) decisionRef — ID bpmn:decision (DMN) decisionRefBinding"latest", "deployment", "version" mapDecisionResult"resultList", "singleEntry", "singleResult" (Camunda)
Decision TaskНе существует как отдельный тип. Реализуется через businessRuleTask с implementation="##DMN"В BPMN 2.0 Decision Task — не самостоятельный элемент. Диаграммы решений (DMN) вызываются из businessRuleTask или через callActivity к bpmn:decisionTask (но decisionTask — устаревшее понятие, не входит в BPMN 2.0)

2.2 Sub-Process (Подпроцесс)

Группирует действия. Имеет собственное пространство имён, переменные, события.

Общие атрибуты bpmn:subProcess:

  • triggeredByEventtrue, если это Event Sub-Process (срабатывает от события, а не по sequence flow)
  • completionCondition — выражение для завершения мультиинстанса (см. ниже)

Типы Sub-Process
ТипBPMN-классИконкаСемантикаОсобенности
Embedded Sub-Processbpmn:subProcessПодпроцессРаскрывается в том же пуле, имеет вход/выход через sequence flowСодержит свои элементы. Может иметь boundary events. Внутренние потоки не выходят за границы без explicit end/start
Event Sub-Processbpmn:subProcess + triggeredByEvent="true"Event Sub-ProcessАктивируется при срабатывании стартового события внутри негоОбязательно содержит один start event (non-interrupting или interrupting). Может быть attached как к process, так и к activity. Если attached к activity — является non-interrupting по умолчанию, но может быть interrupting, если start event interrupting
Transactional Sub-Processbpmn:transactionTransactionГарантирует ACID-подобную семантику: все действия — или завершены успешно, или откаченыМожет содержать только bpmn:activity, sequenceFlow, boundaryEvent. Запрещены: gateways, events, call activities. Завершается через: none end → фиксация, error/cancel end → откат
Ad-Hoc Sub-Processbpmn:adHocSubProcessПодпроцессПорядок выполнения действий не фиксирован — определяется во время выполненияАтрибуты: ordering"Parallel" (по умолчанию), "Sequential" completionCondition — выражение, при котором подпроцесс завершается cancelRemainingInstancestrue (останавливать оставшиеся при выполнении условия)

2.3 Call Activity (Вызов активности)

bpmn:callActivity — ссылка на глобальный элемент. Двойная обводка — Call Activity.

АтрибутНазначениеВозможные значения
calledElementСсылка на bpmn:process или bpmn:callableElement (глобальный подпроцесс)ID процесса/подпроцесса (например, "Process_ApplicationReview")
calledElementBindingВерсия вызываемого элемента"latest" (по умолчанию), "deployment", "version", "versionTag"
calledElementVersionКонкретная версия (число)Целое число (если поддерживается движком)
calledElementVersionTagТег версииСтрока (напр., "stable", "v2.1")
inheritBusinessKeyНаследовать businessKey родителяtrue/false (Camunda)
caseRef, caseBinding, caseVersionВызов CMMN-кейса (если движок поддерживает CMMN)Аналогично calledElement*

Call Activity синхронный: поток ожидает завершения вызванного процесса.
Вход/выход данных — через dataInputAssociation / dataOutputAssociation к ioSpecification вызываемого процесса.


2.4 Параметризация данных в действиях

ioSpecification (Input/Output Specification)

Декларирует, какие данные принимает/возвращает действие.

  • dataInput — входной параметр
    • id, name, isCollection, itemSubjectRef (ссылка на bpmn:itemDefinition)
  • dataOutput — выходной параметр
    • аналогично
  • inputSet, outputSet — группировка данных (редко используется)

Пример:

<ioSpecification>
<dataInput id="di_applicant" name="applicant" itemSubjectRef="Item_Applicant"/>
<dataOutput id="do_decision" name="approvalResult" itemSubjectRef="Item_Boolean"/>
<inputSet>
<dataInputRefs>di_applicant</dataInputRefs>
</inputSet>
<outputSet>
<dataOutputRefs>do_decision</dataOutputRefs>
</outputSet>
</ioSpecification>

dataInputAssociation / dataOutputAssociation

Связывают внешние данные (переменные процесса) с dataInput/dataOutput.

  • sourceRef — переменная/выражение (для input — источник; для output — цель)
  • targetRefdataInput или dataOutput
  • assignment — маппинг полей (если структуры)

Пример маппинга:

<dataInputAssociation>
<sourceRef>processApplicant</sourceRef>
<targetRef>di_applicant</targetRef>
<assignment>
<from>${processApplicant.name}</from>
<to>${di_applicant.fullName}</to>
</assignment>
</dataInputAssociation>

property

Локальные переменные действия (не видны за пределами).
Используются для временных расчётов.

<property id="prop_tempScore" name="score" itemSubjectRef="Item_Integer"/>

Доступ в скриптах/выражениях: ${score} или execution.setVariableLocal("score", 90).


2.5 Multi-Instance (Множественное выполнение)

Любое действие может быть выполнено n раз — параллельно или последовательно.

Активируется через multiInstanceLoopCharacteristics.

АтрибутНазначениеДопустимые значения
isSequentialПоследовательное выполнениеtrue / false
loopCardinalityКоличество итерацийВыражение: ${users.size()} или число 5
loopDataInputRefКоллекция для итерацииПеременная-список: users
loopDataOutputRefРезультирующая коллекцияПеременная: results
inputDataItemПеременная текущего элементаuser (внутри итерации — ${user.name})
outputDataItemРезультат текущей итерацииresult (добавляется в loopDataOutputRef)
completionConditionУсловие досрочного завершения${nrOfCompletedInstances >= 3} или ${someResult == true}

Пример: User Task "Утвердить" → 3 менеджера утверждают параллельно.
isSequential="false", loopDataInputRef="approvers", inputDataItem="approver", completionCondition="${nrOfCompletedInstances/nrOfInstances >= 0.67}" (2 из 3).

Встроенные переменные в multi-instance:

  • nrOfInstances — общее количество
  • nrOfActiveInstances — активные сейчас
  • nrOfCompletedInstances — завершённые
  • nrOfTerminatedInstances — прерванные

2.6 Gateways (Шлюзы)

bpmn:gateway — ромб, управляющий ветвлением и слиянием потоков.

ТипBPMN-классИконкаСемантика
Exclusive (XOR)bpmn:exclusiveGatewayExclusive GatewayОдин исходящий путь по условию
Parallel (AND)bpmn:parallelGatewayParallel GatewayВсе исходящие ветки одновременно
Inclusive (OR)bpmn:inclusiveGatewayInclusive GatewayОдин или несколько путей по условиям
Event-basedbpmn:eventBasedGatewayEvent-based GatewayВыбор по первому наступившему событию
Complexbpmn:complexGatewayComplex GatewayНестандартная логика ветвления (редко)

3. Connecting Objects (Соединяющие объекты)

ЭлементBPMN-классИконкаНазначение
Sequence Flowbpmn:sequenceFlowSequence FlowПорядок выполнения внутри пула
Message Flowbpmn:messageFlowMessage FlowОбмен сообщениями между пулами
Associationbpmn:associationAssociationСвязь с артефактами (данные, аннотации)

3.1 Sequence Flow (bpmn:sequenceFlow)

Определяет порядок выполнения внутри одного пула (process или participant). Представляет поток управления (control flow) или поток объектов (object flow), хотя объектные потоки редко используются в исполнимых моделях.


Обязательные атрибуты
  • id — уникальный идентификатор
  • sourceRef — ссылка на элемент-источник (должен быть Flow Object или Activity)
  • targetRef — ссылка на элемент-назначение (должен быть Flow Object или Activity)

Опциональные атрибуты
АтрибутНазначениеЗначения / примечания
nameЧеловекочитаемая метка на линииОтображается на диаграмме. Может быть пустой.
conditionExpressionУсловие переходаВыражение в поддерживаемом языке (FEEL, JUEL, XPath). Пример: ${score >= 75}. Тип выражения указывается через language: – http://www.omg.org/spec/FEEL/20140401http://www.jboss.org/jbpm/expressionshttp://www.w3.org/1999/XPath
isImmediateНемедленное выполнение без оценки условийtrue / false. Устаревшее. Проигнорировано большинством движков.
defaultПризнак default-переходаДолжен быть true только у одного исходящего sequence flow у шлюза или задачи. Срабатывает, если ни одно другое условие не выполнилось.

Правила использования
  • Sequence Flow не может пересекать границы пулов (pools). Внутри lane — разрешён.
  • Источник — любой Flow Object или Activity, кроме End Event.
  • Назначение — любой Flow Object или Activity, кроме Start Event.
  • У шлюза (gateway) все исходящие потоки, кроме одного, должны иметь conditionExpression, либо один — default="true".
  • У задачи (task) может быть несколько исходящих потоков. В этом случае все, кроме одного, должны иметь условия или один — default.

Специальные случаи
  • Implicit Join — несколько входящих sequence flow в элемент без шлюза. Означает синхронизацию (AND-join): выполнение начинается только после прибытия всех токенов.
    Пример: две параллельные ветки → одна задача. Задача стартует после завершения обеих.
  • Implicit Split — несколько исходящих sequence flow из элемента без шлюза. Означает разветвление (AND-split): создаётся по одному токену на каждый поток.
    Пример: задача → две задачи параллельно.

⚠️ Неявные split/join не рекомендуются в сложных моделях — лучше использовать явные шлюзы (parallelGateway).


3.2 Message Flow (bpmn:messageFlow)

Определяет обмен сообщениями между разными пулами (participants) или между пулом и внешней сущностью (Данные store, participant в collaboration).


Обязательные атрибуты
  • id
  • sourceRef — элемент в одном пуле (должен быть Flow Object или Activity, способный отправлять сообщение — send task, message throw, message intermediate, message end)
  • targetRef — элемент в другом пуле (должен быть способен принимать — receive task, message catch, message start)

Опциональные атрибуты
АтрибутНазначение
nameПодпись на линии (например, "Запрос одобрения")
messageRefСсылка на bpmn:message — описывает структуру данных сообщения

Ограничения
  • Message Flow не может начинаться или заканчиваться внутри одного пула.
  • Message Flow не может соединять Flow Object с Artifact (например, Данные store) напрямую — требуется промежуточное действие (receive/send task).
  • Message Flow не управляет порядком выполнения внутри пула — только передаёт сигнал/данные. Внутри пула дальнейшее поведение определяется sequence flow.

Correlation (Корреляция сообщений)

Для сопоставления входящего сообщения с конкретным экземпляром процесса используется correlation key.

  • В messageEventDefinition или operation указывается correlationKey:
<messageEventDefinition messageRef="Msg_Request">
<correlationKey name="requestId">
<correlationPropertyRef>Prop_RequestId</correlationPropertyRef>
</correlationKey>
</messageEventDefinition>
  • correlationProperty объявляется на уровне process/collaboration:
<correlationProperty id="Prop_RequestId" name="requestId" type="string"/>
  • Значение берётся из переменной процесса или выражения.

Без корреляции движок не сможет определить, какой экземпляр процесса должен обработать сообщение — возможна ошибка или создание нового экземпляра (если start event).


3.3 Association (bpmn:association)

Соединяет Flow Object или Activity с Artifact (группа, текстовая аннотация, Данные store) для пояснения. Не влияет на выполнение.


Атрибуты
  • id
  • sourceRef — любой элемент (включая artifact)
  • targetRef — любой элемент
  • associationDirection — направление стрелки:
    • None (по умолчанию) — линия без стрелок
    • One — стрелка к targetRef
    • Both — стрелки в обе стороны

Типичные применения
ИсточникНазначениеСемантика
Task / EventText AnnotationПояснение к действию (например, SLA, примечание по безопасности)
TaskGroupУказание, что действие принадлежит группе (логическая, не исполнительная)
EventData StoreУказание, что событие читает/пишет в хранилище (неформально)
ActivityData ObjectСвязь с объектом данных (например, "формирует отчёт")

Association не имеет поведенческой семантики. Не сериализуется в execution context. Используется только для документирования.


4. Swimlanes (Дорожки)

Swimlanes организуют ответственность — кто выполняет действие. Два типа: Pool и Lane.

ЭлементИконкаНазначение
PoolПулУчастник взаимодействия (организация, система)
LaneДорожкаРоль или подразделение внутри пула

4.1 Pool (bpmn:participant в collaboration / bpmn:process в standalone diagram)

  • Представляет отдельный участника взаимодействия (организацию, систему, роль).
  • В collaboration diagram — прямоугольник с именем наверху. Может содержать внутреннюю диаграмму (expanded) или быть свёрнутым (collapsed).
  • В standalone process — не отображается явно (подразумевается один pool).

Атрибуты bpmn:participant
АтрибутНазначение
idУникальный идентификатор участника
nameИмя (напр., "Служба безопасности")
processRefСсылка на bpmn:process, реализующий поведение пула
multiplicityМин/макс количество экземпляров (minimum, maximum) — устаревшее, почти не поддерживается
interfaceRefСсылка на bpmn:interface (для описания контракта взаимодействия)

Collaboration (bpmn:collaboration)

Контейнер для нескольких participant и messageFlow.

  • Должен быть ровно один collaboration на файл BPMN, если есть взаимодействие.
  • Атрибуты — id, name, isClosed (публичный интерфейс или внутренний).

4.2 Lane (bpmn:lane)

Дочерний элемент bpmn:laneSetbpmn:process или другого lane.

  • Определяет зону ответственности внутри пула (отдел, роль, система).
  • Может быть вложенным (многоуровневые дорожки).

Атрибуты
АтрибутНазначение
idУникальный идентификатор
nameИмя дорожки (напр., "Аналитик", "СУБД")
partitionElementRefСсылка на bpmn:resourceRole или bpmn:performer (опционально — для RACI)
childLaneSetВложенные дорожки

Правила
  • Элемент (task, event, sub-process) может принадлежать только одной конечной lane (листе иерархии).
  • Lane не влияет на выполнение — только визуальная/организационная группировка.
  • В движках lane может использоваться для маршрутизации задач (например, candidateGroups = имя lane).

5. Artifacts (Артефакты)

Элементы, не влияющие на поток выполнения, но дополняющие модель информацией.


5.1 Group (bpmn:group)

Group — визуальная рамка (пунктирная, с закруглёнными углами).

  • Объединяет элементы по смыслу (не по ответственности — для этого lane).
  • Атрибуты — id, name, categoryValueRef (для кастомной классификации).
  • Примеры использования: "Этап проверки", "Блок с повышенными рисками".

5.2 Text Annotation (bpmn:textAnnotation)

Text Annotation — блок текста, прикреплённый через association.

  • Содержит text (CDATA, поддерживает переносы).
  • Часто используется для:
    • описания бизнес-правил,
    • указания SLA,
    • ссылок на нормативные документы,
    • пояснения неочевидных решений.

5.3 Data Object (bpmn:dataObjectReference) и Data Store (bpmn:dataStoreReference)

АртефактИконкаСемантикаКлючевые атрибуты
Data ObjectData ObjectДанные, создаваемые/изменяемые в рамках одного экземпляра процессаid, name, itemSubjectRef (тип), isCollection
Data StoreData StoreПостоянное хранилище, общее для всех экземпляров (БД, файловый сервер)id, name, capacity, isUnlimited

Оба могут иметь dataState — "состояние" объекта (например, "черновик", "утверждено"), но это редко поддерживается движками.


6. Choreography Diagram (Хореография)

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

Основной элемент — bpmn:choreographyActivity, объединяющий отправку и приём в одном шаге.


6.1 Choreography Task (bpmn:choreographyTask)

Прямоугольник с двойной вертикальной линией по центру. Обозначает один акт обмена: один участник отправляет, другой(ие) получают.


Атрибуты
АтрибутНазначениеПримечания
initiatingParticipantRefУчастник, инициирующий обменОбязательный. Должен быть одним из participantRef
participantRefСписок участников, участвующих в обменеМинимум два: инициатор + как минимум один получатель
messageFlowRefСсылки на bpmn:messageFlow внутри choreographyДолжны соответствовать направлению: от initiating к другим

Пример
[Клиент] ———→ [Система]
initiatingParticipantRef = "Participant_Client"
participantRef = ["Participant_Client", "Participant_System"]

Семантика: Клиент отправляет запрос Системе.

Внутри choreography diagram запрещены:

  • sequence flow,
  • gateways,
  • события,
  • sub-processes. Только choreography Задачи и choreography sub-processes, соединённые choreography flows.

6.2 Sub-Choreography (bpmn:subChoreography)

Группирует choreography Задачи. Визуально — прямоугольник со скошенными углами и двойной линией слева.

  • Может быть раскрыт (expanded) или свёрнут (collapsed).
  • Имеет собственные participantRef.
  • Поддерживает вложенность.

6.3 Choreography Flow (bpmn:choreographyActivitybpmn:choreographyActivity)

Сплошная стрелка с ромбом у начала (не путать с sequence flow).
Обозначает порядок выполнения актов обмена.

  • Источник и цель — только choreography activity.
  • Не может пересекать границы пулов (в choreography пулы отсутствуют — участники объявлены в collaboration).

6.4 Call Choreography (bpmn:callChoreography)

Вызов глобально определённой choreography по ссылке (calledChoreographyRef).
Аналог callActivity, но для хореографий.


7. Conversation Diagram (Диаграмма бесед)

Уровень агрегации выше choreography — фокус на бизнес-взаимодействиях, а не технических сообщениях.

Элементы:

  • bpmn:conversationNode — узел взаимодействия (округлый прямоугольник)
  • bpmn:callConversation — вызов глобальной conversation
  • bpmn:subConversation — вложенная беседа
  • bpmn:conversationLink — связь между узлами (стрелка с пунктиром)

Атрибуты conversationNode
  • participantRef — участники взаимодействия
  • messageFlowRef — связанные message flows (необязательно)
  • correlationKeyRef — ключ корреляции

Семантика — "Юрлицо подаёт заявку" — это conversation node, включающий несколько сообщений (запрос, подтверждение, документы).

Conversation Diagram не предназначен для исполнения. Используется для архитектурного моделирования и согласования между доменами.


8. Extensibility Mechanisms (Механизмы расширения)

BPMN 2.0 предоставляет стандартные способы расширения без нарушения валидности модели.


8.1 Extension Elements (bpmn:extensionElements)

Контейнер для кастомных элементов. Располагается внутри любого BPMN-элемента.

Структура:

<serviceTask id="Task_1" name="Validate">
<extensionElements>
<my:custom xmlns:my="http://example.com/bpmn-ext">
<my:timeout unit="seconds">30</my:timeout>
<my:retry max="3" delay="PT5S"/>
</my:custom>
<!-- Camunda-специфичное -->
<camunda:failedJobRetryTimeCycle xmlns:camunda="http://camunda.org/schema/1.0/bpmn">
R3/PT1M
</camunda:failedJobRetryTimeCycle>
</extensionElements>
</serviceTask>

Правила:

  • Расширения не влияют на стандартную семантику BPMN.
  • Движок может игнорировать неизвестные расширения.
  • Рекомендуется использовать уникальные XML-namespace.

8.2 Extension Attributes

Произвольные атрибуты с префиксом, зарегистрированным в namespace.

Пример:

<userTask id="Task_Approve"
camunda:assignee="manager"
flowable:dueDate="${now() + P2D}"
my:slaLevel="premium" />

8.3 Custom Задачи через implementation

Для serviceTask, businessRuleTask и др. можно указать:

<serviceTask implementation="com.example.MyCustomHandler" />

Движок вызывает обработчик по классу или имени, зарегистрированному в реестре.


8.4 Global Definitions (Глобальные объявления)

Общие сущности, используемые в нескольких местах:

ЭлементНазначениеКонтейнер
bpmn:itemDefinitionТип данных (структура)definitions
bpmn:messageСообщение (имя + itemRef)definitions
bpmn:signalГлобальный сигнал (имя)definitions
bpmn:escalationЭскалация (код + structureRef)definitions
bpmn:errorОшибка (код + errorCode + structureRef)definitions
bpmn:interface / bpmn:operationКонтракт вызова сервисаdefinitions
bpmn:resource / bpmn:resourceParameterРесурс и его параметры (не путать с lane)definitions

Пример itemDefinition:

<itemDefinition id="Item_Applicant" structureRef="tns:ApplicantType" />
<itemDefinition id="Item_Boolean" isCollection="false" structureRef="xsd:boolean" />

structureRef может ссылаться на:

  • XSD-тип (xsd:string),
  • XML-схему (tns:ApplicantType),
  • Java-класс (движко-зависимо, например, java.lang.String).

9. Execution Semantics (Семантика выполнения)

Краткий справочник по тому, как BPMN-модель интерпретируется во время исполнения.


9.1 Token Semantics (Семантика токенов)

  • Выполнение моделируется продвижением токенов по sequence flow.
  • Токен — лёгкая сущность, представляющая единицу работы.
  • Условия оцениваются при прибытии токена к шлюзу.
  • AND-разветвление (parallelGateway) клонирует токен.
  • XOR-слияние (exclusiveGateway) поглощает один токен (остальные уничтожаются).
  • OR-слияние (inclusiveGateway) ждёт все прибывшие токены, соответствующие условию входа.

9.2 Состояния экземпляра процесса

СостояниеУсловие перехода
ACTIVEЭкземпляр создан, есть хотя бы один активный токен
COMPLETEDВсе токены достигли end event, нет активных задач/таймеров
TERMINATEDВыполнен terminateEndEvent или вызван terminate() API
SUSPENDEDВызван suspend() — приостановка вручную или по условию
ABORTED / FAILEDОшибка, не перехваченная boundary error event

9.3 Жизненный цикл задачи (User Task)

  1. CREATE — задача создана
  2. ASSIGN — назначена исполнителю
  3. COMPLETE — исполнена (переменные обновлены, токен движется дальше)
  4. DELETE — отменена/удалена (напр., при компенсации)

Дополнительные события (движко-зависимо):

  • UPDATE, TIMEOUT, ESCALATION

9.4 Transaction и компенсация

  • В transaction подпроцессе все действия выполняются в рамках логической транзакции.
  • Если срабатывает errorEndEvent или cancelEndEvent:
    1. Все активные задачи внутри отменяются.
    2. Выполняются компенсационные обработчики (compensateEventDefinition в boundary events активностей с isForCompensation="true").
    3. Управление передаётся на cancelBoundaryEvent родителя.

Компенсация — не откат, а выполнение бизнес-логики отмены (напр., "отозвать начисление", "удалить временный файл").


10. Best Practices для исполнимых BPMN-моделей

10.1 Валидность и соответствие

  • Используйте валидаторы (Camunda Modeler, bpmnlint).
  • Все messageRef, signalRef, errorRef должны иметь соответствующие глобальные объявления.
  • У исключающего шлюза (exclusiveGateway) должен быть один default flow или все исходящие — с условиями.

10.2 Именование

  • idCamelCase с префиксом типа — Task_Validate, Gateway_SplitRisk, Event_Timer_SLA
  • name — человекочитаемо, глагол + объект — "Проверить кредитную историю", "Дождаться ответа МСК"
  • Переменные: camelCaseapplicantData, approvalThreshold

10.3 Инкапсуляция

  • Логика принятия решений — в DMN, вызываемом через businessRuleTask.
  • Сложная обработка — в serviceTask с ссылкой на внешний микросервис или скрипт.
  • Повторяющиеся фрагменты — в callActivity к глобальным подпроцессам.

10.4 Обработка ошибок

  • Каждый serviceTask, вызывающий внешний сервис, должен иметь boundaryErrorEvent.
  • Используйте escalation для бизнес-исключений ("клиент не найден"), error — для системных ("таймаут соединения").
  • Ограничьте глубину вложенности подпроцессов (рекомендуется ≤ 3).

10.5 Производительность

  • Избегайте conditionalEvent — он создаёт polling-нагрузку.
  • Для множественных задач используйте multiInstance, а не ручное клонирование.
  • Асинхронное выполнение (asyncBefore="true") для долгих операций — предотвращает блокировку транзакции БД.

Ошибки

СитуацияЧто проверить
Команда не найденаPATH, установка пакета, alias
Permission deniedпользователь, группа, sudo, ACL
Неверная версиясм. "Совместимость", --version

В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

СправочникиСправочник по языку С, Справочник по Terraform, Справочник по ассемблеру, Справочник по Ansible, Справочник по visual-basic, Справочник по Nginx.