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

6.07. Справочник по BPMN 2.0

Аналитику Архитектору Руководителю Техническому писателю

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

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

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

1.1 Events (События)

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

  • Границей: тонкая (start), жирная (end), пунктирная (intermediate)
  • Внутренней иконкой: указывает на триггер или результат
  • Заливкой: белая (catching), чёрная (throwing), двойная (non-interrupting)
Тип событияBPMN-классИконкаГраницаЗаполнениеСемантикаКлючевые атрибутыДопустимые значения / примечания
Start Eventbpmn:startEventотсутствует, timer, message, signal, error, escalation, conditional, link, multipleТонкаяБелоеИнициирует процесс или подпроцессisInterrupting (только для attached)true (по умолчанию для start), false (только у attached intermediate)
Message Startbpmn:startEventконвертТонкаяБелоеОжидает входящего сообщенияmessageRefСсылка на объявленный bpmn:message с указанием itemRef (структура данных)
Timer Startbpmn:startEventчасыТонкаяБелоеЗапускается по расписанию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:startEventтреугольник с восклицаниемТонкаяБелоеЗапускается при трансляции сигналаsignalRefСсылка на bpmn:signal (глобальное или локальное имя). Трансляция — throwEvent с signalEventDefinition
Error StartНе существует. Error Event не может быть стартовым.
Conditional Startbpmn:startEventшестиугольник («шестерёнка»)ТонкаяБелоеЗапускается при выполнении условияconditionExpressionВыражение в языке, поддерживаемом движком (FEEL, XPath, JUEL). Пример: ${systemStatus == "online"}
Intermediate Catch Eventbpmn:intermediateCatchEventсм. подтипыПунктирнаяБелоеОжидает внешнего или временного триггера в середине потока
Message Intermediate Catchbpmn:intermediateCatchEventконвертПунктирнаяБелоеОжидает входящего сообщения в потокеmessageRefКак у Message Start. Может иметь outputSet для маппинга входных данных
Timer Intermediate Catchbpmn:intermediateCatchEventчасыПунктирнаяБелоеПауза до наступления времениtimerEventDefinitionКак у Timer Start. Используется для задержки, таймаутов, SLA-контроля
Signal Intermediate Catchbpmn:intermediateCatchEventтреугольник с восклицаниемПунктирнаяБелоеОжидает широковещательного сигналаsignalRefПерехватывает сигнал по имени. Поддерживает eventDefinitions множественных типов в одном событии (multiple catch)
Conditional Intermediate Catchbpmn:intermediateCatchEventшестиугольникПунктирнаяБелоеОжидает выполнения условия в реальном времениconditionExpressionВыражение переоценивается периодически. Не блокируется — продолжает опрос. Используется редко, требует поддержки движком
Link Intermediate Catchbpmn:intermediateCatchEventстрелка в кругПунктирнаяБелоеПринимает управление от Link ThrownameСтроковый идентификатор. Пара (catch, throw) должна иметь одинаковое имя. Используется для визуального разрыва потока без семантики события
Intermediate Throw Eventbpmn:intermediateThrowEventсм. подтипыПунктирнаяЧёрноеГенерирует сигнал, сообщение, ошибку и др.
Message Throwbpmn:intermediateThrowEventконвертПунктирнаяЧёрноеОтправляет сообщениеmessageRef, inputSetУказывает получателя через participantRef в collaboration или через correlation keys. Может инициировать message start другого пула
Signal Throwbpmn:intermediateThrowEventтреугольник с восклицаниемПунктирнаяЧёрноеТранслирует сигнал всем заинтересованным процессамsignalRefГлобальная трансляция (если scope="global"). Локальная — только в рамках того же процесса (движки могут не поддерживать scope явно)
Escalation Throwbpmn:intermediateThrowEventперевёрнутый треугольникПунктирнаяЧёрноеИнициирует эскалацию (не прерывает текущий поток)escalationRefСсылка на bpmn:escalation. Перехватывается escalationEventDefinition в boundary или intermediate catch
Compensation Throwbpmn:intermediateThrowEventстрелка влево-вправо (↔)ПунктирнаяЧёрноеЗапускает компенсацию (откат) ранее выполненной активностиactivityRefУказывает bpmn:activity, для которой вызывается компенсационный обработчик (compensateEventDefinition в её boundary)
Link Throwbpmn:intermediateThrowEventстрелка из кругаПунктирнаяЧёрноеПередаёт управление на Link Catch с тем же именемnameПарный элемент. Используется для избежания пересечений линий. Не несёт семантики, только визуальный переход
End Eventbpmn:endEventсм. подтипыЖирнаяЧёрноеЗавершает поток выполнения (токен выбрасывается)
None Endbpmn:endEventотсутствуетЖирнаяЧёрноеНормальное завершение потока без результатаЕдинственный обязательный тип. Все процессы должны иметь хотя бы одно окончание
Message Endbpmn:endEventконвертЖирнаяЧёрноеОтправляет сообщение и завершает потокmessageRefАналогично Message Throw, но с немедленным завершением после отправки
Signal Endbpmn:endEventтреугольник с восклицаниемЖирнаяЧёрноеТранслирует сигнал и завершает потокsignalRefЧасто используется для оповещения о завершении (напр., processCompleted)
Error Endbpmn:endEvent«молния» (зигзаг)ЖирнаяЧёрноеЗавершает поток с ошибкойerrorRefСсылка на bpmn:error. Перехватывается boundary error event родительского подпроцесса. Если не перехвачен — ошибка процесса
Escalation Endbpmn:endEventперевёрнутый треугольникЖирнаяЧёрноеЗавершает поток с эскалациейescalationRefАналогично Error End, но означает управляемое исключение (не фатальную ошибку)
Cancel Endbpmn:endEvent«X» в кругеЖирнаяЧёрноеОтменяет транзакционный подпроцесс (transaction)Может существовать только внутри transaction. Приводит к выполнению компенсаций и переходу к cancel boundary event
Terminate Endbpmn:endEventкруг в кругеЖирнаяЧёрноеНемедленно завершает весь процесс (все токены, все пулы)Используется крайне редко. Эквивалент 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")
TimerОстанавливает активность по таймауту. Пример: SLA превышен → переход в escalationПозволяет активности продолжать работу, но запускает параллельную ветку. Пример: напоминание каждые 24ч
MessageРеагирует на входящее сообщение (напр., «отмена заявки») и останавливает активностьРеагирует на сообщение, не останавливая основную работу. Пример: уведомление о статусе
ErrorПерехватывает errorEndEvent или исключение из вызова сервисаНе поддерживается для error. Error — всегда interrupting
EscalationПерехватывает escalationThrow/EndEventПоддерживается. Запускает обработку, активность продолжает выполнение
SignalРеагирует на сигналПоддерживается. Часто используется для broadcast-управления (pause/resume)
CompensationТолько 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:serviceTaskшестерёнкаАвтоматическое выполнение через внешний сервисimplementation, operationRef, resultVariable, expression, class, delegateExpression, typeimplementation: – "##WebService" — вызов SOAP/WSDL-операции (operationRef обязателен) – "##unspecified" — вызов по контракту (рекомендуется указать operationRef) – "other" — кастомная реализация (движко-зависимо) class — полное имя Java-класса (Camunda, Flowable) expression — выражение (JUEL, FEEL), возвращающее результат resultVariable — имя переменной, куда сохранить результат
User Taskbpmn:userTaskсилуэт человекаРабота, выполняемая человеком через 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:scriptTask«<>» (скобки)Выполнение скрипта внутри движка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:sendTaskконверт с «→»Отправка сообщения без ожидания ответаimplementation, messageRef, operationRefАналог messageIntermediateThrowEvent, но в форме задачи. Может иметь inputSet для данных сообщения. Не блокирует поток — завершается сразу после отправки
Receive Taskbpmn:receiveTaskконверт с «←»Ожидание входящего сообщения до продолженияmessageRef, instantiate, operationRefБлокирует поток до получения сообщения через correlation. instantiate="true" — может инициировать процесс (устаревшее, лучше использовать message start). Часто заменяется messageIntermediateCatchEvent
Manual Taskbpmn:manualTaskрука с «+»Работа, выполняемая вручную вне ИТ-системыНет автоматизации. Просто маркер для документирования офлайн-операций (напр., «подписать бумажный документ»). Не создаёт задач в UI
Business Rule Taskbpmn:businessRuleTaskромб с «шестерёнкой»Применение правил (правил принятия решений)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"Прямая линия, без входящего sequence flowАктивируется при срабатывании стартового события внутри негоОбязательно содержит один start event (non-interrupting или interrupting). Может быть attached как к process, так и к activity. Если attached к activity — является non-interrupting по умолчанию, но может быть interrupting, если start event interrupting
Transactional Sub-Processbpmn:transactionДвойная линияГарантирует ACID-подобную семантику: все действия — или завершены успешно, или откаченыМожет содержать только bpmn:activity, sequenceFlow, boundaryEvent. Запрещены: gateways, events, call activities. Завершается через: none end → фиксация, error/cancel end → откат
Ad-Hoc Sub-Processbpmn:adHocSubProcessПрямая линия + надпись «Ad Hoc»Порядок выполнения действий не фиксирован — определяется во время выполненияАтрибуты: ordering"Parallel" (по умолчанию), "Sequential" completionCondition — выражение, при котором подпроцесс завершается cancelRemainingInstancestrue (останавливать оставшиеся при выполнении условия)

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

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

АтрибутНазначениеВозможные значения
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 — прерванные

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

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) или между пулом и внешней сущностью (data 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 (например, data 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 (группа, текстовая аннотация, data 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.

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)

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

5.2 Text Annotation (bpmn:textAnnotation)

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

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

АртефактВизуалСемантикаКлючевые атрибуты
Data ObjectПрямоугольник с «бумагой» и загнутым угломДанные, создаваемые/изменяемые в рамках одного экземпляра процессаid, name, itemSubjectRef (тип), isCollection
Data 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 tasks и choreography sub-processes, соединённые choreography flows.

6.2 Sub-Choreography (bpmn:subChoreography)

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

  • Может быть раскрыт (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 Tasks через 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 Именование

  • id: CamelCase с префиксом типа — 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") для долгих операций — предотвращает блокировку транзакции БД.