Проблема внезапного прекращения работы регламентных заданий — одна из самых коварных в практике разработчика 1С. Ситуация осложняется тем, что при ручном запуске через «Дополнительные отчеты и обработки» все работает идеально, а в автоматическом режиме задание просто переходит в состояние Неопределено без записей в журнале регистрации. Рассмотрим подробно, почему это происходит, проанализируем программный код и разберем системные настройки сервера.
Первое, что мы должны осознать: когда мы запускаем обработку вручную, код выполняется под нашей учетной записью Windows и в нашем сеансе. Когда же срабатывает РегламентноеЗадание, оно выполняется на стороне сервера под учетной записью, от имени которой запущена служба 1C:Enterprise 8.3 Server Agent (обычно это USR1CV8).
Проанализируем основные последствия этого различия:
C:\Windows\Temp или другие временные директории.USR1CV8 могут быть не настроены параметры прокси-сервера, или брандмауэр сервера может блокировать исходящие HTTP-запросы для процесса rphost.exe.КаталогВременныхФайлов()) у интерактивного пользователя и у службы сервера будут абсолютно разными.Рассмотрим фрагмент кода, который используется для загрузки курсов валют. В нем скрыта серьезная опасность для стабильности фонового процесса.
Функция ЗапроситьФайлыССервера(СерверИсточник, СтрокаПараметраПолучения, ИмяВходящегоФайла)
HTTP = Новый HTTPСоединение(СерверИсточник);
Пока Истина Цикл
Попытка
HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
Результат = Истина;
Прервать;
Исключение
Результат = Ложь;
Прервать;
КонецПопытки;
КонецЦикла;
Возврат Результат;
КонецФункции
Несмотря на наличие Прервать, использование конструкции Пока Истина в сетевых операциях является рискованным. Если по какой-то причине сетевой стек ОС «зависнет» или возникнет критическая ошибка в объекте HTTPСоединение, задание может войти в бесконечный цикл. В новых версиях платформы (8.3.24 и выше) планировщик заданий стал более чувствителен к таким «зависшим» потокам. Если поток потребляет ресурсы, но не завершается, система может пометить его как проблемный и перестать инициировать новые запуски этого задания.
Посмотрим на настройки регистрации обработки в системе:
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Даже если мы явно указываем БезопасныйРежим = Ложь, современные версии конфигураций (УНФ 3.0, ERP, БП 3.0) используют механизмы ПрофилиБезопасности. Выясним причину: если в константах программы включено использование профилей безопасности, то фоновое задание может блокировать попытку создания HTTPСоединение, так как внешняя обработка пытается обратиться к ресурсу в интернете, который не описан в разрешенных правилах. При этом в журнале регистрации ошибка может не фиксироваться, так как исключение перехватывается ядром системы до передачи в код 1С.
В версиях платформы 8.3.24.1758 и последующих релизах ветки 8.3.25 были зафиксированы ошибки работы менеджера заданий. Разберем основные сценарии сбоев:
rphost или при сбоях сетевого соединения между компонентами кластера, фоновые задания могут оставаться в статусе «Активно» в консоли администрирования, хотя фактически они не выполняются. Когда количество таких «фантомных» сеансов достигает лимита, новые задания перестают запускаться.Чтобы найти истинную причину «отвала» заданий, выполним последовательно следующие шаги:
Выясним, доходит ли выполнение вообще до нашего кода. Для этого необходимо запустить сервер 1С в режиме отладки (параметр -debug). В конфигураторе установим автоматическое подключение к фоновым заданиям (Меню: Отладка -> Подключение -> Автоматическое подключение -> Фоновые задания). Если точка останова в процедуре ОбновитьКурсыВалют срабатывает, значит проблема внутри логики кода. Если нет — проблема на уровне планировщика платформы.
Для диагностики на низком уровне настроим сбор ТехнологическийЖурнал. Нам интересны события EXCP (исключения) и SDBL (запросы к БД). Это позволит увидеть ошибки, которые «проглатываются» платформой и не попадают в обычный журнал регистрации. Пример настройки logcfg.xml должен включать сбор событий от процессов rphost и rmngr.
Проанализируем ситуацию с протоколами безопасности. Сервисы курсов валют часто требуют протокол TLS 1.2. Если серверная ОС устарела (например, Windows Server 2012 без обновлений), объект HTTPСоединение не сможет установить защищенное соединение.
Рекомендуется явно проверять доступность ресурса через PowerShell от имени пользователя службы 1С:
runas /user:USR1CV8 "powershell Invoke-WebRequest -Uri https://cbrates.rbc.ru/tsv/cb/840.tsv"
Если команда вернет ошибку доступа или сертификата, проблему нужно решать на уровне настроек ОС или разрешений сетевого экрана.
Иногда помогает полная очистка серверного кэша. Для этого необходимо:
C:\Program Files\1cv8\srvinfo).reg_1541 (за исключением файла 1CV8Reg.lst, если в нем важны настройки кластера).AppData\Local\Temp).Чтобы сделать выполнение более надежным, добавим явную запись в ЖурналРегистрации в самом начале и в конце процедур, а также внутри блока Исключение. Это поможет локализовать место «тихого» падения.
Процедура ОбновитьКурсыВалют(ПараметрыВыполнения)
ЗаписьЖурналаРегистрации("МояОбработка.Начало", УровеньЖурналаРегистрации.Информация,,, "Начало загрузки курсов");
Попытка
// ... основной код ...
Исключение
ЗаписьЖурналаРегистрации("МояОбработка.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ЗаписьЖурналаРегистрации("МояОбработка.Конец", УровеньЖурналаРегистрации.Информация,,, "Завершение загрузки курсов");
КонецПроцедуры
Важное примечание: Если вы используете платформу 8.5 (тестовую), имейте в виду, что в ней могут присутствовать экспериментальные механизмы управления потоками, которые еще не оптимизированы для работы с внешними компонентами и сложными сетевыми вызовами. Для продуктивных баз рекомендуется придерживаться стабильных релизов ветки 8.3.23 или дождаться стабилизации 8.3.25.