Почему зависает регламентное задание 1С при массовой отправке почты и как это исправить

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

Ситуация, когда регламентное задание в 1С успешно выполняет все свои функции, фиксирует отправку данных в логах, но при этом «зависает» на этапе завершения, — это классическая проблема, с которой сталкиваются администраторы и разработчики на платформе 8.3. Особенно часто это проявляется в конфигурациях на обычных формах, таких как Управление торговлей 10.3, работающих на релизах платформы ветки 8.3.19. В этой статье мы подробно разберем, почему это происходит, как найти «больную» строку кода и какие настройки сервера помогут устранить проблему.

Выясняем причину зависания: локализация через Журнал регистрации

Когда фоновое задание «висит» в консоли в статусе «Выполняется», хотя фактически работа завершена, нам необходимо понять, на какой именно команде интерпретатор 1С остановил выполнение. Разберем метод «построчного логирования», который позволяет максимально точно сузить зону поиска.

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


Процедура РассылкаПрайсов() Экспорт
    // Шаг 1: Начало работы
    ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Начало выполнения задания");
    
    // Шаг 2: Получение списка групп
    ГруппыРассылки = Справочники.ГруппыПочтовыхРассылок.Выбрать();
    Пока ГруппыРассылки.Следующий() Цикл
        // Обработка конкретной группы
        ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Обработка группы: " + ГруппыРассылки.Ссылка);
        
        ОтправитьПрайс(ГруппыРассылки.Ссылка);
        
        ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Завершена отправка для: " + ГруппыРассылки.Ссылка);
    КонецЦикла;
    
    // Шаг 3: Финальный аккорд
    ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Весь код процедуры выполнен успешно");
КонецПроцедуры

Если в Журнале регистрации последней записью будет «Весь код процедуры выполнен успешно», но задание все равно висит — значит, проблема кроется в механизмах самой платформы при попытке закрыть сеанс и освободить память. Если же записи прерываются на отправке определенной группы — проблема в сетевом взаимодействии.

Анализ замера производительности в фоновом задании

Иногда обычного логирования недостаточно, особенно если зависание происходит внутри системных методов. В этом случае проанализируем ситуацию с помощью отладки фонового задания. Для этого выполним следующие шаги:

  1. Включите режим отладки на сервере 1С (параметр -debug в строке запуска службы).
  2. В конфигураторе откройте Отладка -> Подключение и выберите соответствующее фоновое задание в списке доступных предметов.
  3. Запустите Замер производительности.
  4. Дождитесь момента зависания и остановите замер.

Важным показателем является так называемый «Баланс входов/выходов». Если количество входов в функцию не совпадает с количеством выходов из нее, вы обнаружите ту самую «черную дыру», в которой исчезает управление процессом. Часто это бывает метод Отключиться() объекта ИнтернетПочта.

Критическая ошибка платформы 8.3.19.1229 (Bug 000112742)

Рассмотрим специфику релиза 8.3.19.1229. Данная версия платформы имеет известную проблему с управлением памятью и сеансовыми данными фоновых заданий. Суть заключается в том, что при накоплении определенного объема сеансовых данных (объектов в памяти, временных таблиц) процесс rphost не может корректно завершить выполнение потока.

Почему это проявляется на 6-7 группе рассылки? Каждая группа добавляет в текущий сеанс новые данные: структуру письма, вложения, кеш COM-объектов (если используются). При достижении критического порога механизм очистки памяти при завершении задания «зацикливается» или уходит в бесконечное ожидание. Единственным надежным решением здесь является обновление платформы до релизов 8.3.19.1522 или переход на ветки 8.3.21/8.3.22.

Проблемы сетевого протокола TLS и SMTP-соединения

Выясним причину, связанную с объектом ИнтернетПочта. В современных почтовых сервисах (Mail.ru, Yandex, Gmail) активно используются протоколы защиты соединения TLS. В 1С реализация работы с SSL/TLS в некоторых случаях конфликтует с библиотеками операционной системы.

Проанализируем ваш код отправки. Если вы вызываете Подключиться() и Отключиться() внутри цикла для каждой группы, это создает избыточную нагрузку на сокеты ОС. При частом переподключении (6-7 раз подряд) сетевой экран или антивирус сервера может расценить это как подозрительную активность и перевести соединение в режим TIME_WAIT, блокируя закрытие сеанса 1С.

Рекомендация: Попробуйте изменить логику работы с почтой следующим образом:


Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль); // Подключаемся один раз перед циклом

Пока ГруппыРассылки.Следующий() Цикл
    // Код подготовки письма
    Почта.Послать(Письмо);
    // Не отключаемся здесь!
КонецЦикла;

Почта.Отключиться(); // Отключаемся один раз в самом конце

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

Очистка серверного кэша и папки snccntx

Если программные методы не помогают, стоит заглянуть в «закулисье» сервера 1С. Зависание задания часто связано с невозможностью записи финального статуса в каталог сеансовых данных. Проанализируем состояние папки srvinfo.

  1. Остановите службу 1C:Enterprise 8.3 Server Agent.
  2. Перейдите в каталог C:\Program Files\1cv8\srvinfo\reg_1541\snccntx.
  3. Очистите содержимое этой папки. В ней хранятся контексты сеансов, и если там накопилось много «мусора» или битых файлов, фоновые задания будут вести себя непредсказуемо.
  4. Запустите службу сервера.

Итоги и план действий

Подведем итоги. Если ваше регламентное задание зависает после успешной отправки писем, пройдите по следующему алгоритму:

Соблюдение этих правил и внимательный анализ Журнала регистрации позволят вам быстро вернуть работоспособность автоматическим рассылкам в вашей системе 1С:Управление торговлей.

← На главную