Чтобы ответить на вопрос зачем всё это нужно, предлагаю рассмотреть следующую очень упрощённую схему взаимодействия между несколькими информационными системами.
Клиент оформляет заказ на сайте Интернет-магазина компании.
Сайт стартует процесс обработки заказа при помощи Camunda BPM, отправляя сообщение и данные заказа на сервер.
Далее сервер BPM вызывает http-сервис отдела продаж и переходит в режим ожидания подтверждения того, что заказ принят в обработку.
После получения такого сообщения вызывается http-сервис складской системы WMS, чтобы сформировать задание на сборку заказа.
Как только заказ собран и готов для доставки клиенту, WMS сообщает серверу BPM об этом, что становится триггером для вызова http-сервиса службы доставки и так далее.
При подобной схеме взаимодействия ни одна из информационных систем ничего не знает друг о друге. Это даёт гибкость в управлении процессом. Системы могут быть достаточно легко заменены или добавлены новые. Они становятся слабосвязанными. Весь процесс становится наглядным, а при помощи соответствующих средств мониторинга всегда можно сказать где и какой из процессов обработки заказа "застрял".
Преимущества Camunda BPM:
1. Отличная реализация BPMN 2.
2. Бесплатная версия Camunda Comunity Platform (сервер выполнения бизнес-процессов).
3. Бесплатная версия Camunda Modeler (дизайнер диаграмм и их публикация на сервере).
4. Очень богатый интерфейс REST API для управления сервером и опубликованными на нём бизнес-процессами.
5. Возможно запускать в контейнерах Docker.
6. Проверенное и надёжное решение.
7. Отличная документация и поддержка сообщества.
8. Возможно разрабатывать плагины на Java.
9. Улучшение взаимодействия между бизнес-аналитиками и программистами компании.
Имеется реализация сервера и дизайнера на JavaScript.
Дизайнер на JavaScript: https://bpmn.io/
Сервер на Node.js: https://www.npmjs.com/package/bpmn-engine
Недостатки Camunda BPM:
1. Платная техническая поддержка.
2. Документация на английском языке.
3. Потребуется изменение образа мышления программистов 1С и методики разработки.
Применение в контексте 1С:
1. Продвинутое управление бизнес-процессами, основанное на международном стандарте BPMN 2, ставшим де-факто рабочим инструментом бизнес-аналитиков по всему миру.
2. Оркестрация и мониторинг взаимодействия http-сервисов 1С между собой.
3. Сквозное управление процессами, проходящими через любое количество информационных баз 1С, в том числе в сочетании со сторонними информационными системами.
Использование Camunda BPM далеко не ограничивается перечнем выше =)
1. Установка Camunda BPM и подготовка к работе
Официальная документация по установке: https://docs.camunda.org/get-started/quick-start/install/
- Установить Java Runtime Environment 8 https://www.java.com/ru/download/
- Распаковать Camunda Platform 7.12 https://camunda.com/download/
- Установить Camunda Modeler 3.7.3 https://camunda.com/download/modeler/
- Запустить сервер Camunda BPM из папки куда распаковали Camunda Platform при помощи файла start-camunda.bat
- Зайти в админку сервера, чтобы убедиться что всё работает http://localhost:8080/camunda-welcome/index.html
- Разработать диаграмму BPMN при помощи Camunda Modeler и опубликовать её из дизайнера на установленный и запущенный ранее сервер Camunda
- Использовать REST API для работы с Camunda из 1С или другой информационной системы
2. Старт нового экземпляра процесса
На диаграмме BPMN непосредственный старт процесса отображается пустым кружком.
Для того, чтобы стартовать такой процесс, нужно задать ему идентификатор.
Затем вызвать из 1С следующий REST API метод:
ИмяПроцесса = "Process_CustomerOrderDemo";
АдресWebСервера = "http://localhost:8080/engine-rest";
СтрокаЗапроса = АдресWebСервера + "/process-definition/key/{key}/start";
СтрокаЗапроса = СтрЗаменить(СтрокаЗапроса, "{key}", ИмяПроцесса);
Результат = ОтправитьWebЗапрос("POST", СтрокаЗапроса, ТелоСообщения);
В результате вызова этого метода на сервере BPM будет создан новый экземпляр бизнес-процесса и он начнёт выполняться.
3. Старт нового экземпляра процесса при помощи сообщения
На диаграмме BPMN старт процесса по сообщению отображается кружком с конвертом внутри.
Для старта такого бизнес-процесса требуется настроить идентификатор сообщения.
Затем вызвать следующий метод REST API. На этот раз приведу пример для Postman:
Здесь всё вполне очевидно, кроме параметра "businessKey". Этот идентификатор бизнес-процесса, который назначается новому процессу управляющим приложением, то есть его генерирует вызывающая сторона для того, чтобы иметь возможность обращаться к своему бизнес-процессу по этому идентификатору в последующем. Для этих целей можно конечно же использовать и идентификаторы процессов, которые генерирует сервер Camunda, но я предпочитаю именно способ с использованием businessKey.
4. Старт нового экземпляра процесса с параметрами
При старте процесса на сервере Camunda можно инициализировать переменную уровня процесса, например, документом в формает JSON.
Для этого необходимо создать такую переменную в дизайнере диаграмм. Значение этой переменной можно оставить пустым — оно будет инициализироваться вызывающей стороной.
Код 1С для старта бизнес-процесса по сообщению может выглядеть следующим образом:
СтрокаЗапроса = АдресСервераCamunda() + "/message";
businessKey = "CustomerOrder_0987654321";
ИмяСообщения = "ProcessCustomerOrderMessage";
// Формируем структуру заказа для сериализации в JSON
СтруктураЗаказаКлиента = Новый Структура();
// Сериализуем заказ клиента в JSON
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗаказаКлиента);
СтруктураДанныхJSON = ЗаписьJSON.Закрыть();
// Создаём параметр для Camunda
СтруктураПараметра = Новый Структура();
СтруктураПараметра.Вставить("type", "String");
СтруктураПараметра.Вставить("value", СтруктураДанныхJSON);
// Добавляем параметр в коллекцию параметров для Camunda
processVariables = Новый Структура();
processVariables.Вставить("CustomerOrderMessage", СтруктураПараметра);
// Формируем тело сообщения
ТелоСообщения = Новый Структура();
ТелоСообщения.Вставить("messageName", ИмяСообщения);
ТелоСообщения.Вставить("businessKey", businessKey);
ТелоСообщения.Вставить("processVariables", processVariables);
// Отправляем сообщение на сервер Camunda
Результат = ОтправитьWebЗапрос("POST", СтрокаЗапроса, ТелоСообщения);
Вариант для Postman:
В случае успешного вызова сервера будет создан новый бизнес-процесс с инициализированной в его контексте переменной "CustomerOrderMessage". Значением этой переменной будет являться наш заказ в формате JSON. Эта переменная будет доступна всем задачам, которые находятся в контексте процесса и формируют его модель выполнения.
Как передать значение этой переменной из бизнеса-процесса в http-сервисы внешней информационной системы будет рассказано в разделе "Вызов http-сервиса 1С из бизнес-процесса сервера".
5. Вызов http-сервиса 1С из бизнес-процесса сервера
Для вызова http-сервиса 1С или любой другой системы мы можем, например, использовать операции бизнес-процесса, которые на диаграмме BPMN отображаются следующим образом:
или
И в том и в другом случае настройки подключения к http-сервису будут одинаковыми.
Сначала выбираем вид реализации операции.
Затем настраиваем http-коннектор и URL, по которому будет вызываться http-сервис.
Настраиваем метод POST для http-запроса.
Настраиваем заголовки http-запроса.
Настраиваем тело для http-запроса. Вот здесь мы как раз настраиваем передачу нашего заказа клиента в формате JSON, который мы сохранили при старте бизнес-процесса в переменной "CustomerOrderMessage".
После этого сохраняем диаграмму и публикуем её на сервере Camunda BPM. Когда выполнение бизнес-процесса дойдёт до этой задачи, сервер автоматически сам выполнит вызов http-сервиса.
6. Передача сообщения из 1С в бизнес-процесс сервера
Когда бизнес-процесс доходит до операции ожидания сообщения, которая отображается на диаграмме BPMN следующим значком, сервер останавливает выполнение процесса и ожидает получения соответствующего сообщения.
При этом в приложении для мониторинга выполнения процессов Camunda Cockpit такой ожидающий сообщения процесс может выглядеть так, как это показано на рисунке ниже.
Один из экзепляров бизнес-процесса ожидает сообщения от внешней системы:
Настройка идентификатора сообщения в Camunda Modeler и отправка сообщения из 1С выполняются аналогичным образом, как это описано для старта процесса по сообщению: задаём идентификатор сообщения и вызываем REST API метод /message.
После получения такого сообщения сервер продолжит выполнение прерванного бизнес-процесса и перейдёт к следующему заданию.
7. Использование очередей заданий на стороне сервера из 1С
В некоторых случаях является неудобным или нежелательным, чтобы сервер Camunda BPM сам выполнял вызовы http-сервисов. В таком случае можно настроить сервисные задания таким образом, чтобы сервер сохранял задания у себя в очереди без вызова http-сервисов.
Обработка такой очереди выполняется внешней системой самостоятельно. Таким образом вместо push стратегии используется стратегия pull для обмена сообщениями между сервером и внешней системой.
Для таких случаев нужно сервисные задания настроить следующим образом.
Код 1С для получения задания из очереди:
СтрокаЗапроса = АдресWebСервера + "/external-task/fetchAndLock";
ТелоСообщения = Новый Структура();
ТелоСообщения.Вставить("workerId", "CustomerOrderWorker");
ТелоСообщения.Вставить("maxTasks", 1);
topics = Новый Массив();
ТелоСообщения.Вставить("topics", topics);
ОписаниеОчереди = Новый Структура();
ОписаниеОчереди.Вставить("topicName", "ProcessCustomerOrderQueue");
// Блокировка задания на 30 секунд (можно и на несколько часов заблокировать)
ОписаниеОчереди.Вставить("lockDuration", 30000);
topics.Добавить(ОписаниеОчереди);
// Получить очередной заказ клиента из очереди на сборку товара
Результат = ОтправитьWebЗапрос("POST", СтрокаЗапроса, ТелоСообщения);
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Результат.ТелоОтвета);
ТелоОтвета = ПрочитатьJSON(ЧтениеJSON);
Для Каждого Задание Из ТелоОтвета Цикл
external_task_id = Задание.id;
businessKey = Задание.businessKey;
КонецЦикла;
Код 1С для завершения задания и удаления его из очереди на сервере:
Функция ОповеститьЗаказСобран(АдресWebСервера, external_task_id) Экспорт
СтрокаЗапроса = АдресWebСервера + "/external-task/{external_task_id}/complete";
СтрокаЗапроса = СтрЗаменить(СтрокаЗапроса, "{external_task_id}", external_task_id);
ТелоСообщения = Новый Структура();
ТелоСообщения.Вставить("workerId", "CustomerOrderWorker");
Возврат ОтправитьWebЗапрос("POST", СтрокаЗапроса, ТелоСообщения);
КонецФункции
Таким образом внешняя система сама отвечает за обработку очереди заданий, формируемой на стороне сервера Camunda BPM.
Здесь нужно обработить внимание на два момента:
- При обращении к очереди на стороне сервера внешняя система указывает свой идентификатор обработчика очереди workerId на тот случай, если очередь обрабатывается несколькими внешними системами одновременно.
- Для того, чтобы завершить задание и удалить его из очереди на сервере, внешняя система должна знать идентификатор задания external_task_id, который возвращается при получении заданий из очереди.
После завершения такого задания бизнес-процесс продолжит своё выполнение дальше.
8. Использование SQL Server
По умолчанию Camunda BPM использует сервер СУБД H2, который поставляется вместе с дистрибутивом. Однако, если это по какой-то причине не устраивает, то можно использовать, например, SQL Server
Для настройки использования СУБД SQL Server сервером Camunda BPM необходимо внести изменения в файл настроек сервера server.xml. Пример такой настройки приводится ниже. Кроме этого необходимо будет в каталог lib дистрибутива поместить библиотеку драйвера JDBC для работы с SQL Server. Я использовал для этого sqljdbc42.jar.
server.xml
<Resource name="jdbc/ProcessEngine"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
uniqueResourceName="camunda"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=camunda"
defaultTransactionIsolation="READ_COMMITTED"
username="sa"
password="sa"
maxActive="20"
minIdle="5"
maxIdle="20" />
На этом всё. Для быстрого старта в освоении Camunda BPM этого вполне достаточно.
Cсылка на стандарт BPMN 2: https://www.omg.org/spec/BPMN/
Успешных всем внедрений !