Как настроить пропуск ошибочных сообщений при массовой отправке почты из 1С:Комплексная автоматизация

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

В процессе эксплуатации 1С:Комплексная автоматизация (КА 2.4) пользователи часто сталкиваются с проблемой «зависания» очереди исходящих электронных писем. Ситуация выглядит следующим образом: система начинает рассылку большого пакета документов или уведомлений, одно из писем содержит некорректный адрес или вызывает ошибку на стороне SMTP-сервера, после чего вся дальнейшая отправка останавливается. В итоге в очереди скапливаются десятки и сотни неотправленных сообщений, а бизнес-процессы замедляются. Разберем подробно, почему это происходит и какими методами можно обеспечить бесперебойную работу почтового модуля.

Анализ причины блокировки почтовой очереди

Для начала проанализируем, как работает типовой механизм отправки в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). В 1С существует регламентное задание ОтправкаИПолучениеСообщенийЭлектроннойПочты. Оно запускает программный код, который выбирает сообщения со статусом «Исходящее», формирует почтовый профиль и пытается установить соединение с сервером через объект ИнтернетПочта.

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

  1. Некорректный синтаксис адреса: Если в поле получателя указан адрес типа «user@mail..ru» или адрес вовсе отсутствует, объект ИнтернетПочтовоеСообщение может выдать ошибку еще на этапе подготовки.
  2. Ограничения SMTP-сервера (Rate Limits): Публичные сервисы (Mail.ru, Yandex, Gmail) ограничивают количество писем в минуту или час. При превышении лимита сервер «отбивает» попытку.
  3. Таймауты: Если одно письмо «тяжелое» (с большими вложениями), сессия может закрыться по таймауту, блокируя идущие следом сообщения.

Решение №1: Программная доработка через расширение (Рекомендуемый способ)

Как было справедливо замечено в обсуждении, в типовом пользовательском интерфейсе 1С:КА нет галочки «Пропускать ошибки». Поэтому нам придется прибегнуть к доработке. Чтобы не снимать конфигурацию с поддержки, используем механизм расширений. Наша задача — найти цикл отправки сообщений и внедрить туда блок Попытка...Исключение.

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


&Вместо("ОтправитьПочтовыеСообщения")
Процедура Расш_ОтправитьПочтовыеСообщения(ПараметрыОтправки)
    // Получаем выборку сообщений к отправке
    ПисьмаКОтправке = СформироватьОчередьПисем(); 
    
    Для Каждого Письмо Из ПисьмаКОтправке Цикл
        Попытка
            // Вызов типового метода отправки одного сообщения
            ПродолжитьВызов(Письмо); 
        Исключение
            // Если произошла ошибка, мы не прерываем цикл, а фиксируем её
            ТекстОшибки = ИнформацияОбОшибке().Описание;
            ЗаписатьОшибкуВЛог(Письмо, ТекстОшибки);
            
            // Важно пометить письмо как ошибочное, чтобы оно не бралось в следующую итерацию
            УстановитьСтатусПисьма(Письмо, "ОшибкаПриОтправке");
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

В этом примере мы используем аннотацию &Вместо, но более безопасным вариантом будет использование &ИзменениеИКонтроль, если вы хотите сохранить оригинальную логику БСП, лишь добавив обработку исключений. Проанализируем ситуацию: теперь, даже если одно письмо «упадет» с ошибкой «Address rejected», цикл перейдет к следующему объекту ЭлектронноеПисьмоИсходящее.

Решение №2: Использование счетчика попыток

Рассмотрим более продвинутый метод, который реализован в некоторых отраслевых решениях. Вместо того чтобы сразу помечать письмо как бракованное, мы можем дать системе шанс отправить его позже. Для этого в расширении добавим новый реквизит к документу/справочнику писем — КоличествоПопытокОтправки.

Алгоритм действий будет следующим:

  1. При возникновении ошибки в блоке Исключение мы увеличиваем счетчик на 1.
  2. Если счетчик меньше 5, оставляем статус «Исходящее», но записываем дату следующей попытки (текущая дата + 10 минут).
  3. Если счетчик достиг 5, переводим письмо в статус «Ошибка» и уведомляем администратора.

Это позволит избежать «пробок», если ошибка была временной (например, кратковременный сбой интернета или Greylisting на стороне получателя).

Решение №3: Настройка локального SMTP-реле (Системное решение)

Если вы не хотите вносить изменения в код 1С, существует административный способ решения проблемы. Выясним причину, почему 1С «ждет» ответа от сервера. Когда 1С отправляет письмо напрямую на внешний сервер (например, smtp.yandex.ru), она зависит от скорости и стабильности этого соединения.

Мы можем установить на сервере 1С локальный почтовый ретранслятор (SMTP Relay), например, Postfix (для Linux) или службу SMTP в составе IIS (для Windows). В настройках 1С в качестве сервера исходящей почты указывается localhost (127.0.0.1) без авторизации (или с простой авторизацией по IP).

Разберем преимущества этого подхода:

Технические нюансы платформы 8.3.18 и выше

Проанализируем специфику версии платформы 8.3.18, упомянутой в теме. В этой версии и выше были ужесточены требования к протоколам безопасности (TLS/SSL). Иногда «зависание» происходит на этапе Handshake (рукопожатия) между 1С и почтовым сервером.

Если вы столкнулись с тем, что почта не отправляется вовсе, проверьте свойства объекта ПараметрыИнтернетПочты. В частности, стоит обратить внимание на свойство ИспользоватьБезопасноеСоединение и явно указывать версию протокола, если сервер не поддерживает современные методы шифрования. Также в 8.3.18 рекомендуется использовать таймауты:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
// Установка таймаута в 30 секунд поможет избежать бесконечного ожидания
Профиль.Таймаут = 30; 

Как быстро очистить застрявшую очередь

Если проблема уже случилась и очередь стоит, выполним следующие шаги для восстановления работы:

  1. Перейдем в список «Электронные письма» (или через консоль запросов найдем документы с состоянием «К отправке»).
  2. Выделим письма, созданные более часа назад, которые явно блокируют процесс.
  3. Воспользуемся обработкой «Групповое изменение реквизитов» и установим им статус «Черновик» или «Отменено».
  4. После этого регламентное задание подхватит свежие письма, и рассылка возобновится.

Резюмируем: Для стабильной работы почты в 1С:КА 2.4 идеальным сочетанием является использование локального SMTP-реле для мгновенной передачи сообщений и небольшая доработка в расширении, которая оборачивает процедуру отправки в блок Попытка...Исключение с фиксацией ошибок в журнале регистрации. Это гарантирует, что одно некорректное письмо не парализует работу всей компании.

← На главную