В процессе разработки систем электронного согласования и документооборота часто возникает задача: заранее отобразить пользователю перечень этапов (точек маршрута), через которые пройдет бизнес-процесс, еще до его фактического старта. Например, это требуется для оценки длительности согласования, вывода визуальной цепочки визирующих лиц или проверки корректности заполнения реквизитов документа.
Сложность заключается в том, что в платформе 1С стандартный механизм бизнес-процессов ориентирован на последовательное создание задач по мере прохождения точек карты маршрута. Рассмотрим подробнее, какими способами можно построить прогнозную цепочку шагов без создания постоянных данных в базе.
Прежде чем приступать к реализации, проанализируем условия, при которых предварительный расчет маршрута вообще возможен:
Разберем первый подход: считывание графической схемы бизнес-процесса и последовательное прохождение по ее элементам от точки старта до точки завершения.
Объект конфигурации БизнесПроцесс позволяет получить структуру карты с помощью метода ПолучитьКартуМаршрута(). Результатом вызова является объект ГрафическаяСхема, содержащий коллекцию элементов ГрафическаяСхема.Элементы.
Рассмотрим алгоритм обхода схемы:
ЭлементГрафическойСхемыТочкаСтарта).КонечнаяТочка линии.ЭлементГрафическойСхемыТочкаДействия), фиксируем ее наименование или связанное действие в результирующем массиве.ЭлементГрафическойСхемыТочкаУсловия), вызываем универсальную функцию расчета логического выражения, передавая в нее предмет согласования. В зависимости от результата (Истина/Ложь) выбираем соответствующую исходящую ветку.ЭлементГрафическойСхемыТочкаЗавершения).Посмотрим на пример организации универсальной функции вычисления условий в модуле менеджера бизнес-процесса:
Функция ВычислитьУсловиеМаршрута(ИмяТочки, Предмет) Экспорт
Если ИмяТочки = "ПроверкаСуммы" Тогда
Возврат Предмет.СуммаДокумента > 100000;
ИначеЕсли ИмяТочки = "СогласованиеСБухгалтерией" Тогда
Возврат Предмет.Организация.УчетПоДоговорам;
КонецЕсли;
Возврат Ложь;
КонецФункции
Преимущество метода: высокая скорость работы, полное отсутствие обращений к базе данных на запись и отсутствие блокировок таблиц.
Ограничение: если карта бизнес-процесса содержит параллельные ветки (точки разделения и слияния), простой линейный обход не подойдет — потребуется полноценный алгоритм обхода направленного графа с очередью задач и синхронизацией путей в точках слияния.
Если карта бизнес-процесса содержит множество сложных платформенных обработчиков (ПроверкаУсловия, ПриСозданииЗадач, ПередСозданиемЗадач), ручной разбор схемы может быть слишком трудоемким. В этом случае применим механизм симуляции с откатом транзакции.
Разберем по шагам, как выполняется данный алгоритм:
НачатьТранзакцию().Записать() и Старт().ТочкаМаршрута каждой задачи и сохраняем его в коллекцию прогнозируемого маршрута.ВыполнитьЗадачу() для продвижения процесса дальше по маршруту.Процесс.Завершен = Истина) или закончатся автоматические шаги, вызываем метод ОтменитьТранзакцию().Посмотрим на пример реализации данного подхода:
Функция ПолучитьЦепочкуТочекМаршрута(СсылкаНаДокумент) Экспорт
МассивТочек = Новый Массив;
НачатьТранзакцию();
Попытка
ПроцессОбъект = БизнесПроцессы.СогласованиеДокумента.СоздатьБизнесПроцесс();
ПроцессОбъект.Предмет = СсылкаНаДокумент;
ПроцессОбъект.Записать();
ПроцессОбъект.Старт();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задача.Ссылка КАК Ссылка,
| Задача.ТочкаМаршрута КАК ТочкаМаршрута
|ИЗ
| Задача.ЗадачаИсполнителя КАК Задача
|ГДЕ
| Задача.БизнесПроцесс = &БизнесПроцесс
| И НЕ Задача.Выполнена";
Запрос.УстановитьПараметр("БизнесПроцесс", ПроцессОбъект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивТочек.Добавить(Выборка.ТочкаМаршрута);
ЗадачаОбъект = Выборка.Ссылка.ПолучитьОбъект();
ЗадачаОбъект.ВыполнитьЗадачу();
// Обновляем выборку для получения следующих шагов
Выборка = Запрос.Выполнить().Выбрать();
КонецЦикла;
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
ОтменитьТранзакцию();
Возврат МассивТочек;
КонецФункции
Важные предостережения при использовании транзакционного метода:
В современных типовых и корпоративных решениях (например, в линейке 1С:ERP или 1С:Документооборот) маршрутизация часто строится не на жестких графических схемах объектов метаданных, а на базе справочников правил и матриц маршрутизации.
В такой архитектуре список согласующих лиц и точек определяется отдельным модулем расчета маршрута, который принимает на вход параметры предмета и возвращает готовую таблицу этапов. При старте процесса эта таблица просто загружается в табличную часть бизнес-процесса. Это полностью исключает необходимость эмуляции схемы и позволяет мгновенно получать цепочку шагов на форме документа.