Разработка и настройка регламентных заданий в среде «1С:Предприятие» — стандартная задача для автоматизации рутинных процессов. Однако часто разработчики сталкиваются с непонятной ситуацией: регламентное задание запускается строго по расписанию, выполняется за доли секунды, рапортует об успешном завершении, но при этом ожидаемого результата работы нет, как и записей об ошибках в Журнале регистрации.
В этой статье мы подробно разберем, почему возникает такое поведение платформы, как правильно организовать диагностику серверного кода и настроить полноценную отладку фонового процесса шаг за шагом.
Привычный для многих начинающих разработчиков метод интерактивной отладки через вывод сообщений пользователю на сервере не работает так, как на клиенте. Рассмотрим классическую ошибку, когда внутри фонового задания пытаются использовать конструкцию:
Сообщить("Старт выполнения задания");
// Основной код
Сообщить("Задание успешно завершено");
Вызов метода Сообщить() в контексте фонового задания на сервере не вызовет падения системы, но текст уйдет «в никуда». У регламентного задания нет активного клиентского сеанса и окна сообщений, в которое можно было бы вывести этот текст. В результате разработчик видит мгновенное завершение задания и пустой экран, делая ложный вывод, что код вообще не запускался.
Для вывода диагностической информации в фоновых заданиях необходимо использовать объект ЗаписьЖурналаРегистрации. Проанализируем правильный пример логирования на сервере:
Процедура ВыполнитьОбменДанными() Экспорт
ЗаписьЖурналаРегистрации(
"РегламентныеЗадания.ОбменДанными",
УровеньЖурналаРегистрации.Информация,
,
,
"Начало выполнения процедуры обмена."
);
// Полезная нагрузка метода
ЗаписьЖурналаРегистрации(
"РегламентныеЗадания.ОбменДанными",
УровеньЖурналаРегистрации.Информация,
,
,
"Процедура обмена завершена успешно."
);
КонецПроцедуры
После внедрения этого кода мы сможем зайти в Журнал регистрации, установить отбор по метаданным или по событию "РегламентныеЗадания.ОбменДанными" и увидеть реальный ход выполнения нашего процесса.
Еще одна неочевидная причина мгновенного завершения работы — избыточное и некорректное использование конструкции Попытка...Исключение. Рассмотрим опасный шаблон кода:
Попытка
// Сложный расчет или обращение к ресурсу
ВыгрузитьДанныеНаСайт();
Исключение
// Ошибку проигнорировали или просто вызвали Сообщить()
Сообщить("Произошла ошибка при выгрузке");
КонецПопытки;
Если внутри функции ВыгрузитьДанныеНаСайт() происходит критический сбой (например, нет соединения с интернетом или не заполнен обязательный реквизит), платформа мгновенно переходит в блок Исключение. Поскольку вызов Сообщить() на сервере невидим, а реальное исключение не генерируется повторно, планировщик задач считает, что фоновое задание отработало штатно и успешно. Для исправления этой ситуации обязательно записывайте ошибку в Журнал регистрации перед завершением работы или передавайте исключение дальше:
Попытка
ВыгрузитьДанныеНаСайт();
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
"РегламентныеЗадания.ОбменДанными",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка выполнения: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
);
// При необходимости прерываем транзакцию и передаем ошибку платформе
ВызватьИсключение "Критическая ошибка выполнения регламентного задания!";
КонецПопытки;
Регламентное задание может ссылаться только на экспортную процедуру общего модуля. Выясним важные требования к этому модулю:
Если процедура регламентного задания ошибочно обернута в конструкцию:
#Если Клиент Тогда
Процедура ВыполнитьДействие() Экспорт
// Код
КонецПроцедуры
#КонецЕсли
то серверная часть платформы при компиляции модуля просто «вырежет» этот кусок кода. Попытка вызова метода приведет к мгновенному завершению сеанса фонового процесса, поскольку для сервера этого метода физически не существует в скомпилированном пространстве имен.
Чтобы понять, почему не срабатывает код, мы можем подключиться отладчиком напрямую к выполняемому регламентному заданию. Разберем этот процесс по шагам:
-debug.Часто программисты забывают, что под учетной записью администратора в режиме «1С:Предприятие» код выполняется с одними правами, а в фоновом задании — совершенно с другими. Проанализируем ключевые моменты:
rphost под учетной записью службы сервера 1С (например, usr1cv8). Эта учетная запись по умолчанию не имеет доступа к вашему рабочему столу, локальным папкам пользователей ОС и сетевым дискам по путям вроде Z:\Folder\ (необходимо использовать только UNC-пути вида \\ServerName\Folder\ и явно давать права пользователю usr1cv8 на эту сетевую папку).Если вы убедились, что код написан правильно, отладка настроена, но поведение не меняется, возможной причиной является рассинхронизация метаданных или зависание серверного кэша. Рекомендуется выполнить следующие действия:
srvinfo на сервере приложений.