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