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

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

Автоматизация запуска бизнес-процессов (БП) на основе действий пользователя со справочником — это классическая задача, требующая внимательного подхода к архитектуре системы. Разберем, как правильно реализовать запуск процесса при изменении конкретного реквизита, чтобы избежать проблем с производительностью и блокировками.

Анализ задачи и архитектурный подход

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

Вместо того чтобы «зашивать» жесткую логику запуска прямо в модуль объекта, мы рекомендуем использовать разделение обязанностей:

  1. Справочник выступает как хранилище данных и триггер состояния.
  2. Статусная модель (реквизит Статус) управляет жизненным циклом элемента.
  3. Регламентные задания или Подписки на события обеспечивают фоновый запуск процессов, разгружая интерактивный сеанс пользователя.

Вариант 1: Использование статусной модели

Один из самых надежных способов — внедрение статусной модели. Вместо запуска процесса «по факту записи», мы переводим элемент справочника в статус, например, НаЗаполнении. Это позволяет пользователю четко видеть текущее состояние объекта.

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

Вариант 2: Запись в регистр и фоновый запуск (Регламентное задание)

Если процесс сложный (включает формирование множества документов), лучше использовать схему «регистрации очереди»:

  1. В процедуре ПриЗаписиНаСервере или через подписку на событие мы создаем запись в специальном регистре сведений (например, ОчередьЗапускаПроцессов).
  2. В этой записи фиксируем ссылку на элемент справочника и тип процесса.
  3. Создаем регламентное задание, которое раз в минуту (или с другой периодичностью) опрашивает этот регистр.
  4. Регламентное задание считывает накопленные задачи, программно создает БизнесПроцесс и удаляет запись из очереди.

Посмотрим на пример кода для регистрации такой задачи:


// Пример записи в регистр очереди
Запись = РегистрыСведений.ОчередьЗапускаПроцессов.СоздатьМенеджерЗаписи();
Запись.ЭлементСправочника = Объект.Ссылка;
Запись.ДатаРегистрации = ТекущаяДата();
Запись.Статус = Перечисления.СтатусОчереди.Новая;
Запись.Записать();

Вариант 3: Программный запуск через Подписки на события

Для универсальности лучше использовать Подписки на события. Это позволит не править каждый модуль формы, а реализовать логику централизованно. В обработчике события ПриЗаписи для нужного объекта мы анализируем изменения:


Процедура ПриЗаписиСправочникаПриЗаписи(Источник, Отказ) Экспорт
    // Проверяем, изменился ли важный реквизит
    СтарыйОбъект = ОбщегоНазначения.ПрочитатьОбъектПоСсылке(Источник.Ссылка);
    Если СтарыйОбъект.ВажныйРеквизит <> Источник.ВажныйРеквизит Тогда
        // Запуск БП
        НовыйПроцесс = БизнесПроцессы.КомплексныйПроцесс.СоздатьБизнесПроцесс();
        НовыйПроцесс.Дата = ТекущаяДата();
        НовыйПроцесс.ОбъектОснование = Источник.Ссылка;
        НовыйПроцесс.Записать();
        НовыйПроцесс.Старт();
    КонецЕсли;
КонецПроцедуры

Рекомендации по реализации

При реализации любого из этих подходов обязательно следуйте следующим правилам:

В заключение, выбор метода зависит от сложности ваших процессов. Если процессы простые — используйте Подписки на события. Если процессы длительные и нагруженные — выносите их запуск в РегламентныеЗадания через регистр очереди.

← На главную