Ситуация, когда регламентное задание в 1С успешно выполняет все свои функции, фиксирует отправку данных в логах, но при этом «зависает» на этапе завершения, — это классическая проблема, с которой сталкиваются администраторы и разработчики на платформе 8.3. Особенно часто это проявляется в конфигурациях на обычных формах, таких как Управление торговлей 10.3, работающих на релизах платформы ветки 8.3.19. В этой статье мы подробно разберем, почему это происходит, как найти «больную» строку кода и какие настройки сервера помогут устранить проблему.
Когда фоновое задание «висит» в консоли в статусе «Выполняется», хотя фактически работа завершена, нам необходимо понять, на какой именно команде интерпретатор 1С остановил выполнение. Разберем метод «построчного логирования», который позволяет максимально точно сузить зону поиска.
Для этого мы воспользуемся методом ЗаписьЖурналаРегистрации. Нам нужно вставить вызов этой функции после каждого ключевого блока в модуле регламентного задания. Рассмотрим пример реализации:
Процедура РассылкаПрайсов() Экспорт
// Шаг 1: Начало работы
ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Начало выполнения задания");
// Шаг 2: Получение списка групп
ГруппыРассылки = Справочники.ГруппыПочтовыхРассылок.Выбрать();
Пока ГруппыРассылки.Следующий() Цикл
// Обработка конкретной группы
ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Обработка группы: " + ГруппыРассылки.Ссылка);
ОтправитьПрайс(ГруппыРассылки.Ссылка);
ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Завершена отправка для: " + ГруппыРассылки.Ссылка);
КонецЦикла;
// Шаг 3: Финальный аккорд
ЗаписьЖурналаРегистрации("Debug.Рассылка", УровеньЖурналаРегистрации.Информация, , , "Весь код процедуры выполнен успешно");
КонецПроцедуры
Если в Журнале регистрации последней записью будет «Весь код процедуры выполнен успешно», но задание все равно висит — значит, проблема кроется в механизмах самой платформы при попытке закрыть сеанс и освободить память. Если же записи прерываются на отправке определенной группы — проблема в сетевом взаимодействии.
Иногда обычного логирования недостаточно, особенно если зависание происходит внутри системных методов. В этом случае проанализируем ситуацию с помощью отладки фонового задания. Для этого выполним следующие шаги:
-debug в строке запуска службы).Важным показателем является так называемый «Баланс входов/выходов». Если количество входов в функцию не совпадает с количеством выходов из нее, вы обнаружите ту самую «черную дыру», в которой исчезает управление процессом. Часто это бывает метод Отключиться() объекта ИнтернетПочта.
Рассмотрим специфику релиза 8.3.19.1229. Данная версия платформы имеет известную проблему с управлением памятью и сеансовыми данными фоновых заданий. Суть заключается в том, что при накоплении определенного объема сеансовых данных (объектов в памяти, временных таблиц) процесс rphost не может корректно завершить выполнение потока.
Почему это проявляется на 6-7 группе рассылки? Каждая группа добавляет в текущий сеанс новые данные: структуру письма, вложения, кеш COM-объектов (если используются). При достижении критического порога механизм очистки памяти при завершении задания «зацикливается» или уходит в бесконечное ожидание. Единственным надежным решением здесь является обновление платформы до релизов 8.3.19.1522 или переход на ветки 8.3.21/8.3.22.
Выясним причину, связанную с объектом ИнтернетПочта. В современных почтовых сервисах (Mail.ru, Yandex, Gmail) активно используются протоколы защиты соединения TLS. В 1С реализация работы с SSL/TLS в некоторых случаях конфликтует с библиотеками операционной системы.
Проанализируем ваш код отправки. Если вы вызываете Подключиться() и Отключиться() внутри цикла для каждой группы, это создает избыточную нагрузку на сокеты ОС. При частом переподключении (6-7 раз подряд) сетевой экран или антивирус сервера может расценить это как подозрительную активность и перевести соединение в режим TIME_WAIT, блокируя закрытие сеанса 1С.
Рекомендация: Попробуйте изменить логику работы с почтой следующим образом:
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль); // Подключаемся один раз перед циклом
Пока ГруппыРассылки.Следующий() Цикл
// Код подготовки письма
Почта.Послать(Письмо);
// Не отключаемся здесь!
КонецЦикла;
Почта.Отключиться(); // Отключаемся один раз в самом конце
Также попробуйте добавить небольшую технологическую паузу Приостановить(2) перед вызовом Отключиться(), чтобы дать возможность почтовому серверу корректно закрыть сессию на его стороне.
Если программные методы не помогают, стоит заглянуть в «закулисье» сервера 1С. Зависание задания часто связано с невозможностью записи финального статуса в каталог сеансовых данных. Проанализируем состояние папки srvinfo.
C:\Program Files\1cv8\srvinfo\reg_1541\snccntx.Подведем итоги. Если ваше регламентное задание зависает после успешной отправки писем, пройдите по следующему алгоритму:
Соблюдение этих правил и внимательный анализ Журнала регистрации позволят вам быстро вернуть работоспособность автоматическим рассылкам в вашей системе 1С:Управление торговлей.