Почему не работает запуск внешнего отчета по расписанию через регламентное задание в 1С?

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

Рассмотрим классическую ситуацию: мы написали внешний отчет или обработку, создали процедуру для ее запуска (например, обновление данных каждые 30 минут) и настроили расписание в регламентном задании. Однако в автоматическом режиме код не срабатывает. При этом, если запустить обработку руками, все отрабатывает без ошибок. Проанализируем причину такого поведения и разберем по шагам, как правильно настроить выполнение кода в фоне.

1. Правильная структура модуля объекта для БСП и имя метода

Если мы работаем в современной конфигурации 1С, построенной на базе Библиотеки стандартных подсистем (БСП), платформа ожидает строго определенную структуру модуля для внешних отчетов и обработок.

Для того чтобы система "поняла", какую именно процедуру запускать при срабатывании регламентного задания, мы не можем использовать произвольное имя метода, например ОбновлениеОтчетаПродажиМенеджера. Программа должна знать точку входа. В БСП для этого зарезервирована экспортная процедура ВыполнитьКоманду.

Разберем пример того, как должен выглядеть модуль внешней обработки или отчета:


Функция СведенияОВнешнейОбработке() Экспорт
    // Здесь описываем параметры регистрации обработки в системе
    // Указываем, что она должна выполняться по расписанию в фоне
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
    // Именно сюда БСП передаст управление по расписанию
    Если ИдентификаторКоманды = "МояКомандаОбновления" Тогда
        // Здесь мы пишем полезный код
    КонецЕсли;
КонецПроцедуры

Если в настройках регламентного задания попытаться вызвать клиентский метод (завязанный на формы или интерактивные действия), он категорически не подойдет для фонового выполнения.

2. Особенности серверного контекста выполнения

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

  1. Отсутствие интерфейса: В фоновом задании недопустимо использовать методы типа ПолучитьФорму(), диалоги, предупреждения или метод Сообщить(). Если вы попытаетесь что-то вывести на экран, фоновое задание может завершиться с ошибкой, так как экрана (клиента) просто не существует. Для логирования используем ЗаписьЖурналаРегистрации.
  2. Контекст прав: При ручном запуске код выполняется под вашим пользователем со всеми вашими правами. Фоновое задание часто стартует под системным (Default) пользователем или выделенным пользователем для регламентных заданий. Поэтому проверка РольДоступна(...) может выдавать совершенно другой результат.

3. Грубая ошибка в логике работы с отчетом: метод Записать()

Посмотрим на пример кода, который часто пишут новички, перешедшие в 1С из других языков:


// НЕПРАВИЛЬНО
Отчет = Отчеты.ГАФ_ОтчетПланМенеджера;
Если ЗначениеЗаполнено(Отчет) Тогда 
    Отчет.Записать(); 
КонецЕсли;

В 1С метод Записать() у объектов метаданных (отчетов, обработок) применяется исключительно для сохранения изменений самой структуры отчета или его настроек в базу данных. Этот метод не формирует отчет и не выгружает данные в файл.

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

  1. Необходимо программно инициализировать Схему Компоновки Данных (СКД) вашего отчета.
  2. Передать в нее нужные параметры (например, период, ответственного менеджера).
  3. Выполнить программную компоновку результата.
  4. Вывести результат в объект ТабличныйДокумент.
  5. Сохранить полученный результат вызовом метода ТабличныйДокумент.Записать("ПутьКФайлу.xlsx", ТипФайлаТабличногоДокумента.XLSX).

4. Доступ к файловой системе и права ОС

Если вы решили сохранять сформированный в фоне отчет в файл (на диск), помните о правах операционной системы. Фоновое задание выполняется от имени пользователя ОС, под которым работает служба Агента сервера 1С (чаще всего это USR1CV8).

Если вы пропишете в коде сохранение на рабочий стол C:\Users\Admin\Desktop\Отчет.xlsx, сервер просто не найдет этот путь или у него не хватит прав на запись. Мы настоятельно рекомендуем использовать сетевые пути (UNC), например \\ServerName\SharedFolder\Report.xlsx, и предварительно убедиться, что пользователю USR1CV8 предоставлены права на запись в эту сетевую папку.

5. Безопасный режим и отладка

По умолчанию БСП запускает дополнительные обработки в безопасном режиме. Это значит, что любые попытки работы с внешними файлами или интернетом могут блокироваться платформой. Если это происходит, вам потребуется либо описать необходимые разрешения в функции СведенияОВнешнейОбработке(), либо снять флаг "Безопасный режим" в карточке настройки вашей обработки.

Наконец, чтобы понять, где именно "падает" ваше задание по расписанию, включите отладку фоновых заданий на сервере 1С (ключ -debug в параметрах службы сервера). Это позволит отладчику перехватить выполнение процедуры именно в момент ее запуска регламентным заданием и отследить реальную ошибку.

← На главную