В практике разработки на платформе 1С:Предприятие 8.3 часто встречается коварная ситуация: созданное регламентное задание (РЗ) в консоли заданий отображается как выполненное успешно, время выполнения составляет 0 или 1 секунду, но ожидаемого результата (изменения данных, формирования файлов) нет. При этом, если запустить ту же самую процедуру вручную из внешней обработки, всё работает идеально. Рассмотрим подробнее, почему так происходит, и разберем по шагам алгоритм диагностики этой проблемы.
Первым делом проанализируем ситуацию, описанную в сообщениях форума. Автор отмечает, что даже ЗаписьЖурналаРегистрации, поставленная первой строкой в процедуре, не срабатывает. Это главный симптом того, что управление не передается внутрь процедуры. Одной из самых частых причин является использование инструкций препроцессора в общем модуле.
Выясним причину: регламентные задания всегда выполняются на стороне сервера в контексте фонового задания. Если ваш код или весь модуль обернут в конструкцию:
#Если Клиент Тогда
Процедура МояПроцедураРегЗадания() Экспорт
// Код задания
КонецПроцедуры
#КонецЕсли
То при вызове этой процедуры сервером система просто «не увидит» её внутри модуля, так как для сервера этот блок кода исключен на этапе компиляции. Проверьте, нет ли в начале модуля директив #Если ТонкийКлиент Тогда или #Если Клиент Тогда. Если вы вызываете процедуру из обработки «под кнопкой», она запускается в контексте клиента (если это не серверный вызов), и код работает. В регламентном задании — нет.
Разберем настройки самого общего модуля, в котором расположена экспортная процедура задания. Для корректной работы регламентного задания необходимо соблюдение следующих условий:
Экспорт.Посмотрим на пример правильного оформления заголовка процедуры:
Процедура ВыполнитьОбменДанными() Экспорт
// Тело процедуры
КонецПроцедуры
Если Экспорт отсутствует, фоновое задание может завершиться мгновенно, так как точка входа в модуль будет недоступна.
Проанализируем ситуацию с правами. Регламентное задание запускается от имени конкретного пользователя, указанного в настройках РЗ, либо под системным пользователем, если поле не заполнено. Часто код падает (или тихо завершается) из-за попытки обращения к ПараметрыСеанса, которые в фоновом задании не инициализированы автоматически.
Рассмотрим решение через использование привилегированного режима. Если задание выполняет сложные операции с данными, на которые у «фонового» пользователя может не быть прав, стоит добавить следующую конструкцию:
Процедура РегЗаданиеНаСервере() Экспорт
УстановитьПривилегированныйРежим(Истина);
// Теперь код выполняется без проверки прав доступа
ЗаписьЖурналаРегистрации("МоеЗадание", УровеньЖурналаРегистрации.Информация, , , "Задание запущено");
// Ваш основной код
КонецПроцедуры
Это позволит исключить проблемы с нехваткой прав на чтение или запись отдельных справочников и регистров.
Многие разработчики жалуются, что точка останова не срабатывает. Это происходит потому, что отладка серверных вызовов и фоновых заданий требует специфических настроек. Чтобы «поймать» выполнение кода, выполним следующие шаги:
-debug. Без этого отладка на сервере невозможна в принципе.Только после этого конфигуратор сможет перехватить поток фонового задания, и вы увидите, на какой именно строке происходит прерывание работы.
Проанализируем еще одну редкую, но критическую причину. Если в общем модуле вне процедур (в разделе объявлений) есть код, вызывающий ошибку, или инициализируются переменные через функции, которые недоступны на сервере, то весь модуль не сможет быть скомпилирован системой при обращении к нему. В этом случае выполнение даже не дойдет до первой строки вашей процедуры. Проверьте начало модуля на наличие «лишнего» кода вне процедурных блоков.
Если ваше задание должно работать с внешними файлами или COM-объектами (например, загрузка из Excel), помните: регламентное задание выполняется на сервере в сессии №0. Там нет рабочего стола, нет установленных принтеров по умолчанию и может не быть доступа к сетевым дискам, которые подключены у вас на компьютере как Z:.
При запуске через «кнопку» код работает, так как он использует ваш пользовательский контекст. В регламентном задании используйте только UNC-пути (типа \\Server\Folder\file.xlsx) и убедитесь, что у пользователя, от имени которого запущена служба 1С (обычно USR1CV8), есть права доступа к этой сетевой папке.
Если ваше регламентное задание завершается подозрительно быстро:
ЗаписьЖурналаРегистрации, значит, управление не дошло до кода.#Если Клиент в модуле.Экспорт и соответствие количества параметров.Соблюдение этих правил позволит вам быстро локализовать проблему и добиться стабильной работы автоматических процессов в системе.