Как заранее рассчитать и получить цепочку точек маршрута бизнес-процесса в 1С без его фактического запуска?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки систем электронного согласования и документооборота часто возникает задача: заранее отобразить пользователю перечень этапов (точек маршрута), через которые пройдет бизнес-процесс, еще до его фактического старта. Например, это требуется для оценки длительности согласования, вывода визуальной цепочки визирующих лиц или проверки корректности заполнения реквизитов документа.

Сложность заключается в том, что в платформе 1С стандартный механизм бизнес-процессов ориентирован на последовательное создание задач по мере прохождения точек карты маршрута. Рассмотрим подробнее, какими способами можно построить прогнозную цепочку шагов без создания постоянных данных в базе.

Особенности задачи и ограничения платформы

Прежде чем приступать к реализации, проанализируем условия, при которых предварительный расчет маршрута вообще возможен:

  1. Детерминированность условий: логика ветвления (точки условий и выбора варианта) должна зависеть исключительно от начальных данных — реквизитов предмета бизнес-процесса (документа, справочника) и связанных с ним объектов, а не от решений, принимаемых пользователями в процессе исполнения будущих задач.
  2. Отсутствие побочных эффектов: алгоритмы проверки условий не должны выполнять запись данных, отправку писем или вызовы внешних веб-сервисов.

Способ 1. Программный обход карты маршрута как графа

Разберем первый подход: считывание графической схемы бизнес-процесса и последовательное прохождение по ее элементам от точки старта до точки завершения.

Объект конфигурации БизнесПроцесс позволяет получить структуру карты с помощью метода ПолучитьКартуМаршрута(). Результатом вызова является объект ГрафическаяСхема, содержащий коллекцию элементов ГрафическаяСхема.Элементы.

Рассмотрим алгоритм обхода схемы:

  1. Находим в коллекции элементов точку старта (элемент с типом ЭлементГрафическойСхемыТочкаСтарта).
  2. Анализируем исходящие декоративные линии (соединения) и переходим к следующему элементу схемы, указанному в свойстве КонечнаяТочка линии.
  3. Если следующая точка является обычной точкой действия (ЭлементГрафическойСхемыТочкаДействия), фиксируем ее наименование или связанное действие в результирующем массиве.
  4. Если встречается точка условия (ЭлементГрафическойСхемыТочкаУсловия), вызываем универсальную функцию расчета логического выражения, передавая в нее предмет согласования. В зависимости от результата (Истина/Ложь) выбираем соответствующую исходящую ветку.
  5. Повторяем шаг до достижения точки завершения (ЭлементГрафическойСхемыТочкаЗавершения).

Посмотрим на пример организации универсальной функции вычисления условий в модуле менеджера бизнес-процесса:


Функция ВычислитьУсловиеМаршрута(ИмяТочки, Предмет) Экспорт

    Если ИмяТочки = "ПроверкаСуммы" Тогда
        Возврат Предмет.СуммаДокумента > 100000;
    ИначеЕсли ИмяТочки = "СогласованиеСБухгалтерией" Тогда
        Возврат Предмет.Организация.УчетПоДоговорам;
    КонецЕсли;

    Возврат Ложь;

КонецФункции

Преимущество метода: высокая скорость работы, полное отсутствие обращений к базе данных на запись и отсутствие блокировок таблиц.

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

Способ 2. Симуляция прохождения процесса внутри отменяемой транзакции (Dry Run)

Если карта бизнес-процесса содержит множество сложных платформенных обработчиков (ПроверкаУсловия, ПриСозданииЗадач, ПередСозданиемЗадач), ручной разбор схемы может быть слишком трудоемким. В этом случае применим механизм симуляции с откатом транзакции.

Разберем по шагам, как выполняется данный алгоритм:

  1. Открываем явную транзакцию через НачатьТранзакцию().
  2. Создаем новый экземпляр бизнес-процесса в памяти, заполняем его предмет и реквизиты, после чего вызываем метод Записать() и Старт().
  3. В цикле находим сформированные для данного процесса задачи через объектную модель или запрос.
  4. Считываем реквизит ТочкаМаршрута каждой задачи и сохраняем его в коллекцию прогнозируемого маршрута.
  5. Программно выполняем найденные задачи с помощью метода ВыполнитьЗадачу() для продвижения процесса дальше по маршруту.
  6. Когда процесс перейдет в завершенное состояние (Процесс.Завершен = Истина) или закончатся автоматические шаги, вызываем метод ОтменитьТранзакцию().

Посмотрим на пример реализации данного подхода:


Функция ПолучитьЦепочкуТочекМаршрута(СсылкаНаДокумент) Экспорт

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

КонецФункции

Важные предостережения при использовании транзакционного метода:

  1. В обработчиках бизнес-процесса и задач не должно быть операций, которые нельзя откатить (например, отправка HTTP-запросов, запись файлов на диск, интеграционные вызовы через внешние компоненты).
  2. Механизм автонумерации платформы 1С расходует номера даже при отмене транзакции, поэтому счетчики номеров процессов и задач могут увеличиваться.
  3. Создание и откат объектов порождают кратковременную нагрузку на СУБД.

Способ 3. Вынос логики маршрутизации в декларативную модель

В современных типовых и корпоративных решениях (например, в линейке 1С:ERP или 1С:Документооборот) маршрутизация часто строится не на жестких графических схемах объектов метаданных, а на базе справочников правил и матриц маршрутизации.

В такой архитектуре список согласующих лиц и точек определяется отдельным модулем расчета маршрута, который принимает на вход параметры предмета и возвращает готовую таблицу этапов. При старте процесса эта таблица просто загружается в табличную часть бизнес-процесса. Это полностью исключает необходимость эмуляции схемы и позволяет мгновенно получать цепочку шагов на форме документа.

← На главную