Рассмотрим классическую ситуацию: мы написали внешний отчет или обработку, создали процедуру для ее запуска (например, обновление данных каждые 30 минут) и настроили расписание в регламентном задании. Однако в автоматическом режиме код не срабатывает. При этом, если запустить обработку руками, все отрабатывает без ошибок. Проанализируем причину такого поведения и разберем по шагам, как правильно настроить выполнение кода в фоне.
Если мы работаем в современной конфигурации 1С, построенной на базе Библиотеки стандартных подсистем (БСП), платформа ожидает строго определенную структуру модуля для внешних отчетов и обработок.
Для того чтобы система "поняла", какую именно процедуру запускать при срабатывании регламентного задания, мы не можем использовать произвольное имя метода, например ОбновлениеОтчетаПродажиМенеджера. Программа должна знать точку входа. В БСП для этого зарезервирована экспортная процедура ВыполнитьКоманду.
Разберем пример того, как должен выглядеть модуль внешней обработки или отчета:
Функция СведенияОВнешнейОбработке() Экспорт
// Здесь описываем параметры регистрации обработки в системе
// Указываем, что она должна выполняться по расписанию в фоне
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
// Именно сюда БСП передаст управление по расписанию
Если ИдентификаторКоманды = "МояКомандаОбновления" Тогда
// Здесь мы пишем полезный код
КонецЕсли;
КонецПроцедуры
Если в настройках регламентного задания попытаться вызвать клиентский метод (завязанный на формы или интерактивные действия), он категорически не подойдет для фонового выполнения.
Выясним, почему код, который работает у вас на экране, падает или игнорируется в регламентном задании. Регламентные задания всегда выполняются на стороне сервера в фоновом режиме, без участия пользователя.
ПолучитьФорму(), диалоги, предупреждения или метод Сообщить(). Если вы попытаетесь что-то вывести на экран, фоновое задание может завершиться с ошибкой, так как экрана (клиента) просто не существует. Для логирования используем ЗаписьЖурналаРегистрации.РольДоступна(...) может выдавать совершенно другой результат.Посмотрим на пример кода, который часто пишут новички, перешедшие в 1С из других языков:
// НЕПРАВИЛЬНО
Отчет = Отчеты.ГАФ_ОтчетПланМенеджера;
Если ЗначениеЗаполнено(Отчет) Тогда
Отчет.Записать();
КонецЕсли;
В 1С метод Записать() у объектов метаданных (отчетов, обработок) применяется исключительно для сохранения изменений самой структуры отчета или его настроек в базу данных. Этот метод не формирует отчет и не выгружает данные в файл.
Чтобы программно сформировать отчет в фоне, рассмотрим правильную последовательность действий:
ТабличныйДокумент.ТабличныйДокумент.Записать("ПутьКФайлу.xlsx", ТипФайлаТабличногоДокумента.XLSX).Если вы решили сохранять сформированный в фоне отчет в файл (на диск), помните о правах операционной системы. Фоновое задание выполняется от имени пользователя ОС, под которым работает служба Агента сервера 1С (чаще всего это USR1CV8).
Если вы пропишете в коде сохранение на рабочий стол C:\Users\Admin\Desktop\Отчет.xlsx, сервер просто не найдет этот путь или у него не хватит прав на запись. Мы настоятельно рекомендуем использовать сетевые пути (UNC), например \\ServerName\SharedFolder\Report.xlsx, и предварительно убедиться, что пользователю USR1CV8 предоставлены права на запись в эту сетевую папку.
По умолчанию БСП запускает дополнительные обработки в безопасном режиме. Это значит, что любые попытки работы с внешними файлами или интернетом могут блокироваться платформой. Если это происходит, вам потребуется либо описать необходимые разрешения в функции СведенияОВнешнейОбработке(), либо снять флаг "Безопасный режим" в карточке настройки вашей обработки.
Наконец, чтобы понять, где именно "падает" ваше задание по расписанию, включите отладку фоновых заданий на сервере 1С (ключ -debug в параметрах службы сервера). Это позволит отладчику перехватить выполнение процедуры именно в момент ее запуска регламентным заданием и отследить реальную ошибку.