Почему регламентные задания во внешних обработках перестают выполняться и как это исправить

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

Проблема внезапного прекращения работы регламентных заданий — одна из самых коварных в практике разработчика 1С. Ситуация осложняется тем, что при ручном запуске через «Дополнительные отчеты и обработки» все работает идеально, а в автоматическом режиме задание просто переходит в состояние Неопределено без записей в журнале регистрации. Рассмотрим подробно, почему это происходит, проанализируем программный код и разберем системные настройки сервера.

Различие контекстов выполнения: Тонкий клиент vs Сервер

Первое, что мы должны осознать: когда мы запускаем обработку вручную, код выполняется под нашей учетной записью Windows и в нашем сеансе. Когда же срабатывает РегламентноеЗадание, оно выполняется на стороне сервера под учетной записью, от имени которой запущена служба 1C:Enterprise 8.3 Server Agent (обычно это USR1CV8).

Проанализируем основные последствия этого различия:

Анализ кода и потенциальная ловушка бесконечного цикла

Рассмотрим фрагмент кода, который используется для загрузки курсов валют. В нем скрыта серьезная опасность для стабильности фонового процесса.


Функция ЗапроситьФайлыССервера(СерверИсточник, СтрокаПараметраПолучения, ИмяВходящегоФайла)
    HTTP = Новый HTTPСоединение(СерверИсточник);
    Пока Истина Цикл
        Попытка
            HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
            Результат = Истина;
            Прервать;
        Исключение
            Результат = Ложь;
            Прервать;
        КонецПопытки;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Несмотря на наличие Прервать, использование конструкции Пока Истина в сетевых операциях является рискованным. Если по какой-то причине сетевой стек ОС «зависнет» или возникнет критическая ошибка в объекте HTTPСоединение, задание может войти в бесконечный цикл. В новых версиях платформы (8.3.24 и выше) планировщик заданий стал более чувствителен к таким «зависшим» потокам. Если поток потребляет ресурсы, но не завершается, система может пометить его как проблемный и перестать инициировать новые запуски этого задания.

Проблема безопасного режима во внешних обработках

Посмотрим на настройки регистрации обработки в системе:


ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.БезопасныйРежим = Ложь;

Даже если мы явно указываем БезопасныйРежим = Ложь, современные версии конфигураций (УНФ 3.0, ERP, БП 3.0) используют механизмы ПрофилиБезопасности. Выясним причину: если в константах программы включено использование профилей безопасности, то фоновое задание может блокировать попытку создания HTTPСоединение, так как внешняя обработка пытается обратиться к ресурсу в интернете, который не описан в разрешенных правилах. При этом в журнале регистрации ошибка может не фиксироваться, так как исключение перехватывается ядром системы до передачи в код 1С.

Особенности платформы 8.3.24 и 8.3.25

В версиях платформы 8.3.24.1758 и последующих релизах ветки 8.3.25 были зафиксированы ошибки работы менеджера заданий. Разберем основные сценарии сбоев:

  1. Утечка сеансов: При аварийном завершении rphost или при сбоях сетевого соединения между компонентами кластера, фоновые задания могут оставаться в статусе «Активно» в консоли администрирования, хотя фактически они не выполняются. Когда количество таких «фантомных» сеансов достигает лимита, новые задания перестают запускаться.
  2. Блокировка очереди планировщика: Если одно из регламентных заданий (например, типовое обновление индекса полнотекстового поиска) «зависает», оно может блокировать очередь выполнения для всех остальных заданий, включая внешние обработки.

Алгоритм диагностики и решения проблемы

Чтобы найти истинную причину «отвала» заданий, выполним последовательно следующие шаги:

Шаг 1. Настройка отладки фоновых заданий

Выясним, доходит ли выполнение вообще до нашего кода. Для этого необходимо запустить сервер 1С в режиме отладки (параметр -debug). В конфигураторе установим автоматическое подключение к фоновым заданиям (Меню: Отладка -> Подключение -> Автоматическое подключение -> Фоновые задания). Если точка останова в процедуре ОбновитьКурсыВалют срабатывает, значит проблема внутри логики кода. Если нет — проблема на уровне планировщика платформы.

Шаг 2. Использование Технологического журнала

Для диагностики на низком уровне настроим сбор ТехнологическийЖурнал. Нам интересны события EXCP (исключения) и SDBL (запросы к БД). Это позволит увидеть ошибки, которые «проглатываются» платформой и не попадают в обычный журнал регистрации. Пример настройки logcfg.xml должен включать сбор событий от процессов rphost и rmngr.

Шаг 3. Проверка прав и сертификатов TLS

Проанализируем ситуацию с протоколами безопасности. Сервисы курсов валют часто требуют протокол TLS 1.2. Если серверная ОС устарела (например, Windows Server 2012 без обновлений), объект HTTPСоединение не сможет установить защищенное соединение. Рекомендуется явно проверять доступность ресурса через PowerShell от имени пользователя службы 1С:


runas /user:USR1CV8 "powershell Invoke-WebRequest -Uri https://cbrates.rbc.ru/tsv/cb/840.tsv"

Если команда вернет ошибку доступа или сертификата, проблему нужно решать на уровне настроек ОС или разрешений сетевого экрана.

Шаг 4. Очистка кэша серверных процессов

Иногда помогает полная очистка серверного кэша. Для этого необходимо:

  1. Остановить службу 1С:Предприятия.
  2. Перейти в папку данных сервера (обычно C:\Program Files\1cv8\srvinfo).
  3. Удалить содержимое папок reg_1541 (за исключением файла 1CV8Reg.lst, если в нем важны настройки кластера).
  4. Удалить временные файлы в профиле пользователя службы (AppData\Local\Temp).
  5. Запустить службу заново.

Шаг 5. Модернизация кода обработки

Чтобы сделать выполнение более надежным, добавим явную запись в ЖурналРегистрации в самом начале и в конце процедур, а также внутри блока Исключение. Это поможет локализовать место «тихого» падения.


Процедура ОбновитьКурсыВалют(ПараметрыВыполнения)
    ЗаписьЖурналаРегистрации("МояОбработка.Начало", УровеньЖурналаРегистрации.Информация,,, "Начало загрузки курсов");
    Попытка
        // ... основной код ...
    Исключение
        ЗаписьЖурналаРегистрации("МояОбработка.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    ЗаписьЖурналаРегистрации("МояОбработка.Конец", УровеньЖурналаРегистрации.Информация,,, "Завершение загрузки курсов");
КонецПроцедуры

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

← На главную