В практике разработки на платформе «1С:Предприятие 8.3» часто возникает задача автоматического оповещения пользователей о приближении какого-либо события. Особенность ситуации заключается в том, что документ, содержащий расчетную дату, может быть создан задолго до события и в день «X» никто его открывать не будет. Следовательно, механизм отправки должен работать полностью в фоновом режиме на стороне сервера. Разберем подробно, какими средствами можно реализовать данный процесс, начиная от простых регламентных заданий и заканчивая сложными архитектурными решениями.
Проанализируем самый очевидный способ — создание регламентного задания, которое будет периодически (например, раз в день утром или раз в час) просматривать базу данных на наличие документов с подходящей датой. Рассмотрим алгоритм действий:
РегламентноеЗадание.Разберем пример кода для такой процедуры:
Процедура ОтправитьУведомленияПоДатам() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТвойДокумент.Ссылка КАК Ссылка,
| ТвойДокумент.Ответственный.Email КАК АдресПочты,
| ТвойДокумент.ДатаСобытия КАК ДатаСобытия
|ИЗ
| Документ.ТвойДокумент КАК ТвойДокумент
|ГДЕ
| (ТвойДокумент.ДатаСобытия = &Сегодня
| ИЛИ ТвойДокумент.ДатаСобытия = &Завтра)
| И ТвойДокумент.УведомлениеОтправлено = ЛОЖЬ";
Запрос.УстановитьПараметр("Сегодня", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("Завтра", НачалоДня(ТекущаяДата() + 86400));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь вызывается функция отправки почты
Попытка
ОтправитьПисьмо(Выборка.АдресПочты, Выборка.Ссылка);
// Помечаем документ, чтобы не отправлять повторно
ОбъектДок = Выборка.Ссылка.ПолучитьОбъект();
ОбъектДок.УведомлениеОтправлено = Истина;
ОбъектДок.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Этот метод прост, но имеет недостатки: при большом объеме данных запрос может стать «тяжелым», а необходимость добавлять флаг УведомлениеОтправлено в сам документ не всегда удобна с точки зрения архитектуры.
Выясним, как сделать систему более надежной и производительной. Профессиональным подходом считается использование вспомогательного Регистра Сведений, который выполняет роль «очереди сообщений». Рассмотрим по шагам этот процесс:
ОчередьУведомлений с измерениями Объект, ДатаОтправки и ресурсом Статус.ПриЗаписи) добавляем код, который рассчитывает дату отправки и записывает данные в этот регистр.Проанализируем преимущество: если дата в документе изменится, мы просто обновляем запись в регистре. Регламентное задание выбирает только те записи, где ДатаОтправки <= ТекущаяДата и Статус = "КОтправке".
Если мы работаем в современной конфигурации, такой как 1С:ERP, 1С:КА или 1С:ЗУП, нам доступен механизм Рассылка отчетов или подсистема Работа с почтовыми сообщениями. Рассмотрим, как применить БСП:
В БСП существует механизм «Событийного скоринга» или возможность настройки типовых уведомлений. Вместо написания кода с нуля, мы можем использовать встроенные справочники рассылок, где настраивается расписание и получатели. Это позволяет администратору системы менять текст письма или список получателей без привлечения программиста, что крайне важно для крупных компаний.
Посмотрим на ситуацию под другим углом. Если отправка письма — это часть бизнес-процесса, логично использовать объект БизнесПроцесс. В карте маршрута можно установить точку действия «Ожидание». Процесс «засыпает» до наступления нужной даты, после чего управление передается в точку, которая программно формирует и отправляет письмо. Это дает отличную визуализацию: руководитель всегда видит, сколько процессов сейчас находится в режиме ожидания отправки.
При реализации автоматической рассылки нельзя забывать о следующих аспектах, которые часто упускаются из виду:
УниверсальномуВремени (UTC) перед сравнением.ВЫБРАТЬ РАЗРЕШЕННЫЕ. Это гарантирует, что регламентное задание, запущенное под системным пользователем, будет учитывать права доступа (RLS), если это необходимо по регламенту безопасности компании.Подводя итог, наиболее сбалансированным решением для средней и крупной базы будет использование регистра-очереди. Это разделяет логику формирования события (запись документа) и логику его исполнения (отправка письма), обеспечивая высокую отказоустойчивость системы.