Как реализовать автоматическую отправку писем пользователям по наступлении определенной даты

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

В практике разработки на платформе «1С:Предприятие 8.3» часто возникает задача автоматического оповещения пользователей о приближении какого-либо события. Особенность ситуации заключается в том, что документ, содержащий расчетную дату, может быть создан задолго до события и в день «X» никто его открывать не будет. Следовательно, механизм отправки должен работать полностью в фоновом режиме на стороне сервера. Разберем подробно, какими средствами можно реализовать данный процесс, начиная от простых регламентных заданий и заканчивая сложными архитектурными решениями.

Решение 1. Использование регламентных заданий с прямой выборкой

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

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

Разберем пример кода для такой процедуры:


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

Этот метод прост, но имеет недостатки: при большом объеме данных запрос может стать «тяжелым», а необходимость добавлять флаг УведомлениеОтправлено в сам документ не всегда удобна с точки зрения архитектуры.

Решение 2. Очередь уведомлений через Регистр Сведений

Выясним, как сделать систему более надежной и производительной. Профессиональным подходом считается использование вспомогательного Регистра Сведений, который выполняет роль «очереди сообщений». Рассмотрим по шагам этот процесс:

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

Проанализируем преимущество: если дата в документе изменится, мы просто обновляем запись в регистре. Регламентное задание выбирает только те записи, где ДатаОтправки <= ТекущаяДата и Статус = "КОтправке".

Решение 3. Использование подсистем БСП (Библиотека Стандартных Подсистем)

Если мы работаем в современной конфигурации, такой как 1С:ERP, 1С:КА или 1С:ЗУП, нам доступен механизм Рассылка отчетов или подсистема Работа с почтовыми сообщениями. Рассмотрим, как применить БСП:

В БСП существует механизм «Событийного скоринга» или возможность настройки типовых уведомлений. Вместо написания кода с нуля, мы можем использовать встроенные справочники рассылок, где настраивается расписание и получатели. Это позволяет администратору системы менять текст письма или список получателей без привлечения программиста, что крайне важно для крупных компаний.

Решение 4. Механизм задач и бизнес-процессов

Посмотрим на ситуацию под другим углом. Если отправка письма — это часть бизнес-процесса, логично использовать объект БизнесПроцесс. В карте маршрута можно установить точку действия «Ожидание». Процесс «засыпает» до наступления нужной даты, после чего управление передается в точку, которая программно формирует и отправляет письмо. Это дает отличную визуализацию: руководитель всегда видит, сколько процессов сейчас находится в режиме ожидания отправки.

Важные технические нюансы и оптимизация

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

Подводя итог, наиболее сбалансированным решением для средней и крупной базы будет использование регистра-очереди. Это разделяет логику формирования события (запись документа) и логику его исполнения (отправка письма), обеспечивая высокую отказоустойчивость системы.

← На главную