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