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