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

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

Синхронная отправка почтовых сообщений в обработчиках событий документов — одна из распространенных причин длительного ожидания пользователя при сохранении или проведении документов. Если почтовый сервер долго отвечает или возникают задержки на уровне сети, проведение документа может зависать на несколько минут. Разберем причины такого поведения и рассмотрим архитектурные подходы, которые позволяют сделать отправку писем быстрой и отказоустойчивой.

Выясним причины длительной отправки писем

Проанализируем основные факторы, которые вызывают задержки при вызове отправки почты:

  1. Использование устаревшего объекта Почта вместо ИнтернетПочта: объект Почта работает через клиентский интерфейс MAPI и обращается к почтовому клиенту операционной системы (например, Microsoft Outlook). В этот момент процесс может блокироваться системными окнами безопасности или ожиданием ответа локального клиента. Кроме того, объект Почта доступен только под управлением ОС Windows на клиенте и не поддерживается на сервере 1С под управлением Linux.
  2. Сетевые задержки и таймауты: попытки согласования протоколов безопасности TLS/SSL, обратный резолвинг DNS или фильтрация портов со стороны антивирусов приводят к тому, что сеанс пользователя блокируется до истечения сетевого таймаута.
  3. Синхронное выполнение в транзакции записи: если отправка письма встроена в обработчики ПередЗаписью или ПриЗаписи, транзакция документа удерживает блокировки данных на все время установки сетевого соединения. При недоступности почтового сервера пользователь не сможет записать документ.

Вариант 1. Запуск асинхронного фонового задания

Рассмотрим самый быстрый способ избавить пользователя от ожидания: перенос отправки письма в фоновое задание. При этом документ записывается мгновенно, а формирование и передача письма выполняются платформой в отдельном потоке.

Разберем по шагам, как запустить процедуру отправки в фоновом задании:

  1. Создадим в общем модуле с признаком Сервер экспортную процедуру для отправки сообщения.
  2. В обработчике события документа вызовем метод ФоновыеЗадания.Выполнить(), передав необходимые параметры.

Посмотрим на пример программного кода вызова фонового задания:


ПараметрыЗадания = Новый Массив();
ПараметрыЗадания.Добавить(Ссылка);
ПараметрыЗадания.Добавить(АдресПолучателя);

ФоновыеЗадания.Выполнить("ПочтовыеОповещенияСервер.ОтправитьОповещениеВФоне", ПараметрыЗадания);

Важное ограничение: в файловом режиме работы информационной базы метод ФоновыеЗадания.Выполнить() без специальной настройки выполняется синхронно в контексте текущего сеанса. В клиент-серверном варианте задание мгновенно передается на кластер серверов 1С.

Вариант 2. Организация очереди сообщений через регистр сведений

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

Разберем алгоритм работы такой схемы:

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

Посмотрим на пример процедуры отправки через объект ИнтернетПочта с явным контролем параметров подключения:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.company.com";
Профиль.ПортSMTP = 587;
Профиль.ПользовательSMTP = "robot@company.com";
Профиль.ПарольSMTP = "SecretPass";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.Таймаут = 15; // Ограничиваем время ожидания ответа сервера

ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Отправитель.Адрес = "robot@company.com";
ПочтовоеСообщение.Получатели.Добавить(АдресПолучателя);
ПочтовоеСообщение.Тема = "Оповещение по документу " + Строка(СсылкаНаДокумент);
ПочтовоеСообщение.Тексты.Добавить("Документ успешно зарегистрирован в системе.", ТипТекстаПочтовогоСообщения.ПростойТекст);

Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль);
    Почта.Послать(ПочтовоеСообщение);
    Почта.Отключиться();
Исключение
    Почта.Отключиться();
    ВызватьИсключение "Ошибка отправки почты: " + ОписаниеОшибки();
КонецПопытки;

Рекомендации по оптимизации почтового обмена

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

  1. Переносите отправку на сторону сервера: отправка с сервера исключает зависимость от клиентского окружения, локальных антивирусов и настроек безопасности рабочих станций.
  2. Задавайте свойство Таймаут: явное ограничение таймаута в объекте ИнтернетПочтовыйПрофиль предотвращает длительные зависания процесса при проблемах со связью.
  3. Используйте механизмы БСП: в типовых конфигурациях рекомендуется использовать готовую подсистему «Работа с почтовыми сообщениями», где очередь отправки и обработка повторных попыток уже реализованы вендором.
← На главную