В процессе эксплуатации 1С:Комплексная автоматизация (КА 2.4) пользователи часто сталкиваются с проблемой «зависания» очереди исходящих электронных писем. Ситуация выглядит следующим образом: система начинает рассылку большого пакета документов или уведомлений, одно из писем содержит некорректный адрес или вызывает ошибку на стороне SMTP-сервера, после чего вся дальнейшая отправка останавливается. В итоге в очереди скапливаются десятки и сотни неотправленных сообщений, а бизнес-процессы замедляются. Разберем подробно, почему это происходит и какими методами можно обеспечить бесперебойную работу почтового модуля.
Для начала проанализируем, как работает типовой механизм отправки в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). В 1С существует регламентное задание ОтправкаИПолучениеСообщенийЭлектроннойПочты. Оно запускает программный код, который выбирает сообщения со статусом «Исходящее», формирует почтовый профиль и пытается установить соединение с сервером через объект ИнтернетПочта.
Основная проблема заключается в том, что если внутри цикла перебора сообщений возникает исключительная ситуация (например, сервер возвращает фатальную ошибку или происходит разрыв соединения), фоновое задание может завершиться аварийно. Если код не обернут в надлежащую обработку ошибок, следующее письмо в очереди просто не берется в работу, так как выполнение всего потока прерывается. Посмотрим на типовые сценарии отказов:
ИнтернетПочтовоеСообщение может выдать ошибку еще на этапе подготовки.Как было справедливо замечено в обсуждении, в типовом пользовательском интерфейсе 1С:КА нет галочки «Пропускать ошибки». Поэтому нам придется прибегнуть к доработке. Чтобы не снимать конфигурацию с поддержки, используем механизм расширений. Наша задача — найти цикл отправки сообщений и внедрить туда блок Попытка...Исключение.
Рассмотрим пример логики, которую следует реализовать в расширении для общего модуля, отвечающего за рассылку (обычно это РаботаСПочтовымиСообщениямиСлужебный):
&Вместо("ОтправитьПочтовыеСообщения")
Процедура Расш_ОтправитьПочтовыеСообщения(ПараметрыОтправки)
// Получаем выборку сообщений к отправке
ПисьмаКОтправке = СформироватьОчередьПисем();
Для Каждого Письмо Из ПисьмаКОтправке Цикл
Попытка
// Вызов типового метода отправки одного сообщения
ПродолжитьВызов(Письмо);
Исключение
// Если произошла ошибка, мы не прерываем цикл, а фиксируем её
ТекстОшибки = ИнформацияОбОшибке().Описание;
ЗаписатьОшибкуВЛог(Письмо, ТекстОшибки);
// Важно пометить письмо как ошибочное, чтобы оно не бралось в следующую итерацию
УстановитьСтатусПисьма(Письмо, "ОшибкаПриОтправке");
КонецПопытки;
КонецЦикла;
КонецПроцедуры
В этом примере мы используем аннотацию &Вместо, но более безопасным вариантом будет использование &ИзменениеИКонтроль, если вы хотите сохранить оригинальную логику БСП, лишь добавив обработку исключений. Проанализируем ситуацию: теперь, даже если одно письмо «упадет» с ошибкой «Address rejected», цикл перейдет к следующему объекту ЭлектронноеПисьмоИсходящее.
Рассмотрим более продвинутый метод, который реализован в некоторых отраслевых решениях. Вместо того чтобы сразу помечать письмо как бракованное, мы можем дать системе шанс отправить его позже. Для этого в расширении добавим новый реквизит к документу/справочнику писем — КоличествоПопытокОтправки.
Алгоритм действий будет следующим:
Исключение мы увеличиваем счетчик на 1.Это позволит избежать «пробок», если ошибка была временной (например, кратковременный сбой интернета или Greylisting на стороне получателя).
Если вы не хотите вносить изменения в код 1С, существует административный способ решения проблемы. Выясним причину, почему 1С «ждет» ответа от сервера. Когда 1С отправляет письмо напрямую на внешний сервер (например, smtp.yandex.ru), она зависит от скорости и стабильности этого соединения.
Мы можем установить на сервере 1С локальный почтовый ретранслятор (SMTP Relay), например, Postfix (для Linux) или службу SMTP в составе IIS (для Windows). В настройках 1С в качестве сервера исходящей почты указывается localhost (127.0.0.1) без авторизации (или с простой авторизацией по IP).
Разберем преимущества этого подхода:
Проанализируем специфику версии платформы 8.3.18, упомянутой в теме. В этой версии и выше были ужесточены требования к протоколам безопасности (TLS/SSL). Иногда «зависание» происходит на этапе Handshake (рукопожатия) между 1С и почтовым сервером.
Если вы столкнулись с тем, что почта не отправляется вовсе, проверьте свойства объекта ПараметрыИнтернетПочты. В частности, стоит обратить внимание на свойство ИспользоватьБезопасноеСоединение и явно указывать версию протокола, если сервер не поддерживает современные методы шифрования. Также в 8.3.18 рекомендуется использовать таймауты:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
// Установка таймаута в 30 секунд поможет избежать бесконечного ожидания
Профиль.Таймаут = 30;
Если проблема уже случилась и очередь стоит, выполним следующие шаги для восстановления работы:
Резюмируем: Для стабильной работы почты в 1С:КА 2.4 идеальным сочетанием является использование локального SMTP-реле для мгновенной передачи сообщений и небольшая доработка в расширении, которая оборачивает процедуру отправки в блок Попытка...Исключение с фиксацией ошибок в журнале регистрации. Это гарантирует, что одно некорректное письмо не парализует работу всей компании.