MidТеория10 min

BPMN

Business Process Model and Notation: events, gateways, tasks и моделирование бизнес-процессов

BPMN (Business Process Model and Notation)

Что такое BPMN

BPMN -- стандартная нотация для моделирования бизнес-процессов. Разработана OMG (Object Management Group). Понятна как бизнес-аналитикам, так и разработчикам. Цель -- единый язык между бизнесом и IT.

Когда использовать BPMN

Ситуация Подходит
Описание бизнес-процесса для заказчика Да
Документация workflow для новых сотрудников Да
Автоматизация процесса (BPM engine) Да
Моделирование технической архитектуры Нет (используй C4/UML)
Алгоритм внутри кода Нет (используй Activity Diagram)

Основные элементы BPMN

Events (События)

Тип Символ Описание
Start Event Тонкий круг Начало процесса
End Event Жирный круг Завершение процесса
Intermediate Event Двойной круг Событие в процессе
Timer Event Круг с часами Триггер по времени
Message Event Круг с конвертом Получение/отправка сообщения
Error Event Круг с молнией Обработка ошибки
Signal Event Круг с треугольником Broadcast-сигнал

Activities (Задачи)

Тип Описание
Task Атомарная задача (одно действие)
User Task Задача для человека
Service Task Автоматизированная задача (API call)
Script Task Выполнение скрипта
Send Task Отправка сообщения
Receive Task Ожидание сообщения
Sub-Process Вложенный процесс
Call Activity Вызов переиспользуемого процесса

Gateways (Шлюзы)

Тип Символ Описание
Exclusive (XOR) Ромб с X Один путь из нескольких (if/else)
Parallel (AND) Ромб с + Все пути параллельно (fork/join)
Inclusive (OR) Ромб с O Один или несколько путей
Event-based Ромб с пятиугольником Путь определяется событием

Flows (Потоки)

Тип Стиль Описание
Sequence Flow Сплошная стрелка Порядок выполнения задач
Message Flow Пунктирная стрелка Обмен сообщениями между участниками
Association Точечная линия Связь с данными/аннотациями

Пример: Order Processing

Pool: E-Commerce System
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│ Lane: Customer                                                  │
│ ┌───────────────────────────────────────────────────────────┐   │
│ │ (●)──▶[Place Order]──▶(✉ Order Placed)                    │   │
│ │                                                           │   │
│ │                              (✉ Delivery)──▶[Receive]──▶(◉)│   │
│ └───────────────────────────────────────────────────────────┘   │
│                                                                 │
│ Lane: Order Service                                             │
│ ┌───────────────────────────────────────────────────────────┐   │
│ │         (✉)──▶[Validate]──▶◇──Yes──▶[Process Payment]     │   │
│ │                            │                    │          │   │
│ │                           No              ◇ success?       │   │
│ │                            │         Yes──┤──No           │   │
│ │                            ▼              │    │           │   │
│ │                     [Reject Order]        │   [Refund]    │   │
│ │                            │              ▼    │           │   │
│ │                           (◉)      [Ship Order]│           │   │
│ │                                          │    (◉)          │   │
│ │                                     (✉ send)              │   │
│ └───────────────────────────────────────────────────────────┘   │
│                                                                 │
│ Lane: Warehouse                                                 │
│ ┌───────────────────────────────────────────────────────────┐   │
│ │            (✉)──▶[Pick Items]──▶[Pack]──▶[Dispatch]──▶(◉) │   │
│ └───────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

Pools и Lanes

Элемент Описание Пример
Pool Отдельный участник/организация «Клиент», «Банк», «Магазин»
Lane Роль/отдел внутри Pool «Менеджер», «Бухгалтерия»

Правило: Message Flow используется только между Pools. Внутри Pool -- только Sequence Flow.

Паттерны BPMN

Exclusive Gateway (XOR)

         ┌──[Task A]──▶
──▶ ◇ ──┤                (только один путь)
         └──[Task B]──▶

Parallel Gateway (AND)

         ┌──[Task A]──┐
──▶ + ──┤             ├──▶ + ──▶
         └──[Task B]──┘    join
         fork              (ждём ОБА)

Timer Event

──▶[Task]──▶ ⏱(30 min) ──▶[Escalate]
                timeout: если задача не выполнена за 30 минут

Error Boundary Event

┌──────────────────┐
│ [Process Payment] │
│        ⚡         │──▶[Handle Error]──▶[Notify Customer]
└──────────────────┘
   error boundary:
   если Payment fails -- обработать ошибку

Моделирование BPMN-процесса

<?php

declare(strict_types=1);

namespace App\Workflow;

/**
 * State machine that models a BPMN process in code.
 * For production, use Symfony Workflow component or Camunda.
 */
enum ProcessState: string
{
    case OrderReceived = 'order_received';
    case Validating = 'validating';
    case PaymentProcessing = 'payment_processing';
    case PaymentFailed = 'payment_failed';
    case Picking = 'picking';
    case Packing = 'packing';
    case Shipped = 'shipped';
    case Delivered = 'delivered';
    case Rejected = 'rejected';
}

final class OrderWorkflow
{
    /** @var array<string, array<string, string>> */
    private const TRANSITIONS = [
        'order_received' => [
            'validate' => 'validating',
        ],
        'validating' => [
            'approve' => 'payment_processing',
            'reject' => 'rejected',
        ],
        'payment_processing' => [
            'payment_success' => 'picking',
            'payment_failure' => 'payment_failed',
        ],
        'payment_failed' => [
            'retry_payment' => 'payment_processing',
            'cancel' => 'rejected',
        ],
        'picking' => [
            'picked' => 'packing',
        ],
        'packing' => [
            'packed' => 'shipped',
        ],
        'shipped' => [
            'delivered' => 'delivered',
        ],
    ];

    /**
     * Execute a transition in the workflow.
     */
    public function transition(ProcessState $current, string $action): ProcessState
    {
        $allowed = self::TRANSITIONS[$current->value] ?? [];

        if (!isset($allowed[$action])) {
            throw new WorkflowException(
                sprintf(
                    'Action "%s" is not allowed in state "%s". Allowed: %s',
                    $action,
                    $current->value,
                    implode(', ', array_keys($allowed)),
                ),
            );
        }

        return ProcessState::from($allowed[$action]);
    }

    /**
     * Get all available transitions from current state.
     *
     * @return array<string, string> action => target state
     */
    public function getAvailableTransitions(ProcessState $current): array
    {
        return self::TRANSITIONS[$current->value] ?? [];
    }

    /**
     * Check if process is in a terminal state.
     */
    public function isTerminal(ProcessState $state): bool
    {
        return in_array($state, [ProcessState::Delivered, ProcessState::Rejected], true);
    }

    /**
     * Visualize workflow as text (for debugging).
     */
    public function describe(): string
    {
        $lines = [];

        foreach (self::TRANSITIONS as $from => $transitions) {
            foreach ($transitions as $action => $to) {
                $lines[] = sprintf('  [%s] --%s--> [%s]', $from, $action, $to);
            }
        }

        return "Workflow:\n" . implode("\n", $lines);
    }
}
### Symfony Workflow Integration
<?php

declare(strict_types=1);

namespace App\Workflow;

// config/packages/workflow.yaml concept:
// framework:
//     workflows:
//         order:
//             type: state_machine
//             marking_store:
//                 type: method
//                 property: status
//             supports: [App\Entity\Order]
//             places: [received, validating, processing_payment, picking, shipped, delivered, rejected]
//             transitions:
//                 validate: { from: received, to: validating }
//                 approve: { from: validating, to: processing_payment }
//                 reject: { from: validating, to: rejected }
//                 payment_ok: { from: processing_payment, to: picking }
//                 pick: { from: picking, to: shipped }
//                 deliver: { from: shipped, to: delivered }

use Symfony\Component\Workflow\WorkflowInterface;

final readonly class OrderWorkflowService
{
    public function __construct(
        private WorkflowInterface $orderStateMachine,
    ) {}

    /**
     * Apply transition with validation.
     */
    public function apply(Order $order, string $transition): void
    {
        if (!$this->orderStateMachine->can($order, $transition)) {
            $allowed = array_map(
                static fn($t) => $t->getName(),
                $this->orderStateMachine->getEnabledTransitions($order),
            );

            throw new WorkflowException(sprintf(
                'Cannot apply "%s". Allowed: %s',
                $transition,
                implode(', ', $allowed),
            ));
        }

        $this->orderStateMachine->apply($order, $transition);
    }
}
## Сравнение BPMN и Activity Diagram (UML)
Аспект BPMN Activity Diagram
Фокус Бизнес-процессы Алгоритмы, потоки
Аудитория Бизнес + IT IT
Events Богатая система событий Ограниченная
Pools/Lanes Да (участники процесса) Swimlanes
Стандарт ISO 19510 UML спецификация
Исполняемость Можно выполнить в BPM engine Только визуализация

Инструменты BPMN

Инструмент Тип Исполняемый
Camunda BPM platform Да
Bizagi Modeler Моделирование Нет (бесплатный)
BPMN.io Web-редактор Нет (open-source)
draw.io Универсальный Нет
Signavio Enterprise Да

Итоги

Концепция Суть
Events Начало, конец, промежуточные события процесса
Activities Задачи: user, service, script, sub-process
Gateways XOR (один), AND (все), OR (один+)
Pools/Lanes Участники и роли в процессе
Message Flow Коммуникация между участниками
BPM Engine Автоматическое исполнение BPMN-процессов

Совет: BPMN отлично подходит для документирования процессов при передаче знаний. Новый сотрудник прочитает BPMN-диаграмму быстрее, чем текстовое описание процесса.

Связанные темы