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