В процессе работы с документами планирования часто возникает необходимость напомнить сотрудникам о приближающихся сроках выполнения задач. Рассмотрим, как настроить автоматическую систему уведомлений в среде 1С:Предприятие 8.2. Основная задача состоит в том, чтобы система самостоятельно проверяла даты в документах и за 7 дней до дедлайна отправляла письмо на электронную почту исполнителя.
Прежде чем перейти к коду, разберем правильный архитектурный подход. Мы могли бы в регламентном задании каждый раз перебирать все документы "План", но это неэффективно при больших объемах данных. Оптимальный путь — использовать Независимый регистр сведений, который будет служить очередью для отправки уведомлений. Проанализируем преимущества этого метода:
Для начала создадим новый объект метаданных — РегистрСведений. Назовем его ОчередьУведомлений. Установим режим записи Независимый.
Определим следующую структуру:
ОбъектКонтроля (тип ДокументСсылка.План), Сотрудник (тип СправочникСсылка.Сотрудники).ДатаУведомления (тип Дата), Отправлено (тип Булево).Выясним, как данные будут попадать в наш регистр. Самый надежный способ — прописать логику в модуле документа План в процедуре ОбработкаПроведения. Рассмотрим пример кода, который рассчитывает дату отправки (минус 7 дней от плановой) и делает запись:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Очистим старые записи по этому документу, если они были
НаборЗаписей = РегистрыСведений.ОчередьУведомлений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ОбъектКонтроля.Установить(Ссылка);
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ОбъектКонтроля = Ссылка;
НоваяЗапись.Сотрудник = СтрокаТЧ.Сотрудник;
// Устанавливаем дату за 7 дней до выполнения
НоваяЗапись.ДатаУведомления = СтрокаТЧ.ДатаВыполнения - (7 * 24 * 60 * 60);
НоваяЗапись.Отправлено = Ложь;
КонецЦикла;
НаборЗаписей.Записать();
КонецПроцедуры
Важный момент: Если ваша конфигурация находится на поддержке, вместо изменения модуля документа лучше использовать Подписки на события. Это позволит сохранить возможность легкого обновления системы.
Теперь создадим общий модуль (например, РассылкиСервер), в котором будет располагаться процедура для регламентного задания. Нам необходимо выбрать из регистра все записи, где Отправлено = Ложь и ДатаУведомления <= ТекущаяДата.
Процедура ОтправитьУведомленияПоПланам() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Очередь.Сотрудник,
| Очередь.Сотрудник.Email КАК Почта,
| Очередь.ОбъектКонтроля.Номер КАК НомерДокумента
|ИЗ
| РегистрСведений.ОчередьУведомлений КАК Очередь
|ГДЕ
| Очередь.Отправлено = ЛОЖЬ
| И Очередь.ДатаУведомления <= &ТекущаяДата";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.Почта) Тогда
Если ОтправитьПисьмо(Выборка.Почта, "Напоминание о плане", "До выполнения плана осталось 7 дней!") Тогда
// Помечаем в регистре, что отправка прошла успешно
МенеджерЗаписи = РегистрыСведений.ОчередьУведомлений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ОбъектКонтроля = Выборка.ОбъектКонтроля;
МенеджерЗаписи.Сотрудник = Выборка.Сотрудник;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Отправлено = Истина;
МенеджерЗаписи.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим подробнее функцию ОтправитьПисьмо. В 1С 8.2 для этого используется объект ИнтернетПочта. Обратите внимание, что современные почтовые сервисы (Yandex, Mail.ru, Gmail) требуют использования SSL/TLS и специальных паролей приложений.
Функция ОтправитьПисьмо(АдресПолучателя, Тема, Текст)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.Пользователь = "your_login@yandex.ru";
Профиль.Пароль = "ваш_пароль_приложения"; // Не основной пароль от почты!
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "your_login@yandex.ru";
Сообщение.Тема = Тема;
Сообщение.Получатели.Добавить(АдресПолучателя);
Сообщение.Тексты.Добавить(Текст, ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Возврат Истина;
Исключение
ЗаписьЖурналаРегистрации("Ошибка отправки почты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Последний этап — создание объекта РегламентноеЗадание в дереве метаданных.
РассылкиСервер.ОтправитьУведомленияПоПланам.Проанализируем технические сложности, с которыми вы можете столкнуться. Платформа 8.2 была выпущена до массового внедрения обязательного шифрования TLS 1.2. Если штатный метод ИнтернетПочта выдает ошибку "Невозможно установить защищенное соединение", рассмотрите альтернативы:
Таким образом, мы построили надежную систему оповещения, которая минимизирует риск пропуска важных задач сотрудниками и работает в автоматическом режиме без участия администратора.