Синхронная отправка почтовых сообщений в обработчиках событий документов — одна из распространенных причин длительного ожидания пользователя при сохранении или проведении документов. Если почтовый сервер долго отвечает или возникают задержки на уровне сети, проведение документа может зависать на несколько минут. Разберем причины такого поведения и рассмотрим архитектурные подходы, которые позволяют сделать отправку писем быстрой и отказоустойчивой.
Проанализируем основные факторы, которые вызывают задержки при вызове отправки почты:
Почта вместо ИнтернетПочта: объект Почта работает через клиентский интерфейс MAPI и обращается к почтовому клиенту операционной системы (например, Microsoft Outlook). В этот момент процесс может блокироваться системными окнами безопасности или ожиданием ответа локального клиента. Кроме того, объект Почта доступен только под управлением ОС Windows на клиенте и не поддерживается на сервере 1С под управлением Linux.ПередЗаписью или ПриЗаписи, транзакция документа удерживает блокировки данных на все время установки сетевого соединения. При недоступности почтового сервера пользователь не сможет записать документ.Рассмотрим самый быстрый способ избавить пользователя от ожидания: перенос отправки письма в фоновое задание. При этом документ записывается мгновенно, а формирование и передача письма выполняются платформой в отдельном потоке.
Разберем по шагам, как запустить процедуру отправки в фоновом задании:
ФоновыеЗадания.Выполнить(), передав необходимые параметры.Посмотрим на пример программного кода вызова фонового задания:
ПараметрыЗадания = Новый Массив();
ПараметрыЗадания.Добавить(Ссылка);
ПараметрыЗадания.Добавить(АдресПолучателя);
ФоновыеЗадания.Выполнить("ПочтовыеОповещенияСервер.ОтправитьОповещениеВФоне", ПараметрыЗадания);
Важное ограничение: в файловом режиме работы информационной базы метод ФоновыеЗадания.Выполнить() без специальной настройки выполняется синхронно в контексте текущего сеанса. В клиент-серверном варианте задание мгновенно передается на кластер серверов 1С.
Если требуется гарантированная доставка сообщений и сохранение истории отправок даже при сбоях почтового сервиса, наиболее надежным решением является построение очереди через регистр сведений и регламентное задание.
Разберем алгоритм работы такой схемы:
ПриЗаписи документа формируется запись в регистре сведений ОчередьИсходящихСообщений, содержащая ссылку на документ, адресата, тему, текст письма и статус обработки.Посмотрим на пример процедуры отправки через объект ИнтернетПочта с явным контролем параметров подключения:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.company.com";
Профиль.ПортSMTP = 587;
Профиль.ПользовательSMTP = "robot@company.com";
Профиль.ПарольSMTP = "SecretPass";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.Таймаут = 15; // Ограничиваем время ожидания ответа сервера
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Отправитель.Адрес = "robot@company.com";
ПочтовоеСообщение.Получатели.Добавить(АдресПолучателя);
ПочтовоеСообщение.Тема = "Оповещение по документу " + Строка(СсылкаНаДокумент);
ПочтовоеСообщение.Тексты.Добавить("Документ успешно зарегистрирован в системе.", ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(ПочтовоеСообщение);
Почта.Отключиться();
Исключение
Почта.Отключиться();
ВызватьИсключение "Ошибка отправки почты: " + ОписаниеОшибки();
КонецПопытки;
Для стабильной работы почтовых оповещений рекомендуем придерживаться следующих правил:
Таймаут: явное ограничение таймаута в объекте ИнтернетПочтовыйПрофиль предотвращает длительные зависания процесса при проблемах со связью.