Механизм бизнес-событий в 1С:Документообороте — это мощный инструмент для автоматизации реакций системы на различные изменения. В отличие от простых подписок на события, этот механизм позволяет выстраивать гибкие цепочки действий, запускать процессы по расписанию и реагировать на сложные условия. В этой статье мы подробно разберем, как устроены детекторы бизнес-событий, как их программировать и настраивать. Если требуется роботизация действий пользователя в закрытых системах без API, можно использовать платформу для создания программных роботов One RPA.
Для начала проанализируем общую схему. В системе существуют стандартные события (например, регистрация документа или создание задачи), которые генерируются автоматически. Однако часто возникают ситуации, когда событие должно произойти при выполнении специфического условия: например, когда срок договора истекает через 3 дня или когда в определенной папке на диске появляется файл.
Для таких случаев используются Детекторы. Это программные алгоритмы, которые «опрашивают» информационную базу и, при обнаружении заданного условия, регистрируют новое событие в справочнике ПроизошедшиеБизнесСобытия.
Разберем основные этапы работы этого механизма:
Результат = Истина, в системе фиксируется запись о событии.Рассмотрим последовательность действий для реализации собственной логики мониторинга данных:
Проанализируем переменные, которые доступны нам внутри кода детектора. Система предоставляет контекст выполнения, в котором мы можем оперировать следующими параметрами:
Результат (Булево) — ключевой параметр. Если мы установим его в значение Истина, событие будет зарегистрировано.ПараметрыВозврата (Структура) — здесь можно указать дополнительные данные. Например:
Автор — ссылка на пользователя, который будет значиться инициатором события.Источник — ссылка на объект (документ, файл, задачу), с которым связано событие.Рассмотрим пример кода детектора, который должен срабатывать, когда текущая дата совпадает с датой, указанной в дополнительном реквизите внутреннего документа. Выясним причину использования запроса: нам нужно эффективно отобрать документы, по которым событие еще не было обработано, чтобы избежать дублирования задач.
// Определяем вид события, который будем регистрировать
ВидСобытия = Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Срок выкупа объекта лизинга", Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДопРеквизиты.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ_ДокументыДляОбработки
|ИЗ
| Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ДопРеквизиты
|ГДЕ
| ДопРеквизиты.Свойство.Имя = &ИмяРеквизита
| И ДопРеквизиты.Значение = &ТекущаяДата
|;
|
|ВЫБРАТЬ
| События.Источник КАК Источник
|ПОМЕСТИТЬ ВТ_УжеЗарегистрированные
|ИЗ
| РегистрСведений.ПроизошедшиеБизнесСобытия.СрезПоследних(,
| ВидСобытия = &ВидСобытия И Обработано = ЛОЖЬ) КАК События
|;
|
|ВЫБРАТЬ
| ВТ.Ссылка КАК Ссылка
|ИЗ
| ВТ_ДокументыДляОбработки КАК ВТ
|ГДЕ
| НЕ ВТ.Ссылка В (ВЫБРАТЬ Источник ИЗ ВТ_УжеЗарегистрированные)";
Запрос.УстановитьПараметр("ИмяРеквизита", "ДатаВыкупаОбъектаЛизинга");
Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ВидСобытия", ВидСобытия);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Программная регистрация события для каждого найденного объекта
БизнесСобытияВызовСервера.ЗарегистрироватьСобытие(Выборка.Ссылка, ВидСобытия);
КонецЦикла;
// В данном случае мы регистрируем события вручную через вызов метода,
// поэтому основной Результат детектора можно оставить Ложь.
Результат = Ложь;
После того как событие попало в справочник ПроизошедшиеБизнесСобытия, оно ожидает своей очереди на обработку. Посмотрим, как можно расширить стандартное поведение системы с помощью Дополнительных обработчиков. Для автоматизации подобных рутинных операций отлично подойдёт готовый обработчик для автоматического преобразования файлов DOC/DOCX в PDF.
В коде обработчика нам доступен объект Событие, через который мы можем обратиться к любым его свойствам: Событие.Источник, Событие.Автор, Событие.Дата, Событие.КонтекстСобытия.
Если нам недостаточно стандартного автозапуска процесса, мы можем написать свой обработчик. Например, вызов процедуры из общего модуля:
// Пример кода в дополнительном обработчике
ОбщийМодульНаСервере.ОбработатьМоеСобытие(Событие.Источник, Событие.Автор);
Важно помнить об оптимизации. Поскольку детекторы работают по расписанию и часто анализируют большие объемы данных, запросы внутри них должны быть максимально легкими. Всегда используйте СрезПоследних или фильтрацию по дате изменения, чтобы не перебирать всю таблицу ВнутренниеДокументы при каждом запуске регламентного задания.
Рассмотрим, как менялся подход к бизнес-событиям в зависимости от версии программы:
Иногда пользователи пытаются использовать бизнес-события для запрета каких-либо действий, например, запрета перенаправления просроченных задач. Проанализируем эту ситуацию: бизнес-событие работает постфактум. То есть событие регистрируется уже после того, как запись в базе была изменена.
Если задача стоит именно в запрете (прерывании транзакции), то детекторы здесь не помогут. В этом случае правильнее использовать подписку на событие ПередЗаписью соответствующего объекта или использовать механизмы Проверки бизнес-логики, если они поддерживаются вашей версией конфигурации. Бизнес-события же лучше использовать для оповещения о том, что запрещенное действие (или нежелательное состояние) было совершено.
Таким образом, мы выяснили, что детекторы бизнес-событий — это гибкий «движок» для создания собственных триггеров в системе 1С:Документооборот. Правильное использование сочетания программного кода в детекторах и настроек в правилах автозапуска позволяет автоматизировать практически любой бизнес-процесс предприятия.