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

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

В процессе работы с документами планирования часто возникает необходимость напомнить сотрудникам о приближающихся сроках выполнения задач. Рассмотрим, как настроить автоматическую систему уведомлений в среде 1С:Предприятие 8.2. Основная задача состоит в том, чтобы система самостоятельно проверяла даты в документах и за 7 дней до дедлайна отправляла письмо на электронную почту исполнителя.

Архитектура решения: почему нельзя просто сканировать документы?

Прежде чем перейти к коду, разберем правильный архитектурный подход. Мы могли бы в регламентном задании каждый раз перебирать все документы "План", но это неэффективно при больших объемах данных. Оптимальный путь — использовать Независимый регистр сведений, который будет служить очередью для отправки уведомлений. Проанализируем преимущества этого метода:

  1. Производительность: Мы работаем только с узким набором данных в регистре, а не со всей базой документов.
  2. Контроль: Мы точно знаем, было отправлено письмо или нет, храня статус в ресурсе регистра.
  3. Гибкость: Если дата в документе изменится, мы просто обновим запись в регистре.

Шаг 1. Создание регистра сведений "ОчередьУведомлений"

Для начала создадим новый объект метаданных — РегистрСведений. Назовем его ОчередьУведомлений. Установим режим записи Независимый.

Определим следующую структуру:

Шаг 2. Настройка записи в регистр при проведении документа

Выясним, как данные будут попадать в наш регистр. Самый надежный способ — прописать логику в модуле документа План в процедуре ОбработкаПроведения. Рассмотрим пример кода, который рассчитывает дату отправки (минус 7 дней от плановой) и делает запись:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // Очистим старые записи по этому документу, если они были
    НаборЗаписей = РегистрыСведений.ОчередьУведомлений.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ОбъектКонтроля.Установить(Ссылка);
    
    Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.ОбъектКонтроля = Ссылка;
        НоваяЗапись.Сотрудник = СтрокаТЧ.Сотрудник;
        // Устанавливаем дату за 7 дней до выполнения
        НоваяЗапись.ДатаУведомления = СтрокаТЧ.ДатаВыполнения - (7 * 24 * 60 * 60); 
        НоваяЗапись.Отправлено = Ложь;
    КонецЦикла;
    
    НаборЗаписей.Записать();
КонецПроцедуры

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

Шаг 3. Создание алгоритма отправки почты

Теперь создадим общий модуль (например, РассылкиСервер), в котором будет располагаться процедура для регламентного задания. Нам необходимо выбрать из регистра все записи, где Отправлено = Ложь и ДатаУведомления <= ТекущаяДата.


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

Шаг 4. Настройка почтового профиля

Рассмотрим подробнее функцию ОтправитьПисьмо. В 1С 8.2 для этого используется объект ИнтернетПочта. Обратите внимание, что современные почтовые сервисы (Yandex, Mail.ru, Gmail) требуют использования SSL/TLS и специальных паролей приложений.


Функция ОтправитьПисьмо(АдресПолучателя, Тема, Текст)
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.yandex.ru";
    Профиль.ПортSMTP = 465;
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.Пользователь = "your_login@yandex.ru";
    Профиль.Пароль = "ваш_пароль_приложения"; // Не основной пароль от почты!
    
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Отправитель.Адрес = "your_login@yandex.ru";
    Сообщение.Тема = Тема;
    Сообщение.Получатели.Добавить(АдресПолучателя);
    Сообщение.Тексты.Добавить(Текст, ТипТекстаПочтовогоСообщения.ПростойТекст);
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Сообщение);
        Почта.Отключиться();
        Возврат Истина;
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка отправки почты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
КонецФункции

Шаг 5. Регламентное задание

Последний этап — создание объекта РегламентноеЗадание в дереве метаданных.

  1. В поле Имя метода выберите созданную нами процедуру РассылкиСервер.ОтправитьУведомленияПоПланам.
  2. Настройте Расписание. Обычно достаточно запускать проверку один раз в день (например, в 9:00 утра).
  3. Убедитесь, что в свойствах базы разрешено выполнение регламентных заданий (для файловой базы должен быть запущен отдельный сеанс, выполняющий роль планировщика).

Особенности работы в старых версиях платформы 8.2

Проанализируем технические сложности, с которыми вы можете столкнуться. Платформа 8.2 была выпущена до массового внедрения обязательного шифрования TLS 1.2. Если штатный метод ИнтернетПочта выдает ошибку "Невозможно установить защищенное соединение", рассмотрите альтернативы:

Таким образом, мы построили надежную систему оповещения, которая минимизирует риск пропуска важных задач сотрудниками и работает в автоматическом режиме без участия администратора.

← На главную