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