Почему внешняя обработка не формирует отчет через регламентное задание и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← К списку

Мы часто сталкиваемся с необходимостью автоматизировать рутинные задачи в 1С, и формирование отчетов по расписанию с помощью внешних обработок в регламентных заданиях — одна из таких задач. Однако на этом пути могут возникнуть различные сложности, особенно при отладке и обеспечении корректной работы. Давайте вместе разберем основные причины, по которым внешняя обработка может не формировать отчеты в регламентном задании, и выясним, как эффективно решать эти проблемы.

Отладка регламентных и фоновых заданий: как увидеть, что происходит?

Первое, с чего мы всегда начинаем, когда что-то не работает — это отладка. С регламентными и фоновыми заданиями отладка имеет свои особенности, поскольку они выполняются на сервере и зачастую в отдельном сеансе. Рассмотрим несколько подходов.

  1. Проверка запросов в консоли: Прежде чем запускать сложный механизм, убедитесь, что его базовые компоненты работают. Мы рекомендуем всегда проверять запросы, используемые в вашей обработке, непосредственно в консоли запросов. Это позволяет исключить синтаксические ошибки или некорректную логику выборки данных на самом раннем этапе. Если запрос не работает в консоли, он тем более не будет работать в регламентном задании.

  2. Автоматическое подключение фоновых заданий в отладчике: В настройках отладчика 1С:Предприятия мы можем включить опцию автоматического подключения к фоновым заданиям. Для этого перейдите в меню "Отладка" -> "Настройка автоподключения" и установите флажок напротив пункта "Фоновые задания". После этого отладчик будет автоматически подключаться к фоновым заданиям, позволяя нам останавливаться на точках останова. Однако, имейте в виду, что при большом количестве одновременно выполняющихся фоновых заданий это может привести к перегрузке системы и "дерганым" окнам отладчика.

  3. Использование параметра запуска РежимОтладки: Это один из наиболее удобных способов отладки. Мы можем запустить 1С:Предприятие со специальным параметром РежимОтладки. Для этого перейдите в меню "Сервис" -> "Параметры" -> "Запуск 1С:Предприятия" и в поле "Параметр запуска" укажите РежимОтладки. В этом режиме фоновые задания будут выполняться не в отдельном фоновом сеансе, а в текущем клиентском сеансе, что значительно упрощает отладку — точки останова будут срабатывать как при обычном выполнении кода. При использовании этого режима в форме списка регламентных заданий может появиться кнопка "Выполнить не в фоне", которая запускает задание в текущем сеансе.

  4. Создание отладочной обработки-стартера: Для отладки фонового задания, запускаемого из регламентного, мы можем создать отдельную вспомогательную обработку. В этой обработке разместите кнопку, которая будет вызывать ту же процедуру или функцию, что и регламентное задание. Открыв эту вспомогательную обработку через "Файл" -> "Открыть" и нажав кнопку, мы сможем отлаживать код в привычном режиме, так как он будет выполняться в текущем клиентском сеансе. Важно: для отладки внешних обработок (отчетов) необходимо, чтобы файл обработки был открыт в клиентском приложении из конкретного места файловой системы, а конфигуратор имел доступ именно к этому файлу. Отладка внешних обработок, расположенных непосредственно в информационной базе (например, через справочник ДополнительныеОтчетыИОбработки), не поддерживается; в этом случае рекомендуется временно извлечь обработку из базы на время отладки.

  5. Вывод параметров в файл: Если отладка затруднена или нам нужно проанализировать состояние параметров на определенном этапе выполнения, мы можем выгружать значения ключевых переменных и параметров в текстовый файл (например, CSV). Этот метод особенно полезен, когда регламентное задание выполняется на сервере, к которому нет прямого доступа для отладки. Разместите такой код в критичных местах вашей обработки:

    
    // Пример вывода параметров в файл
    ПутьКФайлуЛога = КаталогВременныхФайлов() + "ПараметрыОтчета.csv";
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.ДобавитьСтроку("ДатаВремя;Параметр1;Параметр2");
    ТекстовыйДокумент.ДобавитьСтроку(Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:mm:ss") + ";" + ЗначениеПараметра1 + ";" + ЗначениеПараметра2);
    ТекстовыйДокумент.Записать(ПутьКФайлуЛога, КодировкаТекста.UTF8);
    

Права доступа и контекст выполнения: под кем работает регламент?

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

  1. Пользователь регламентного задания: Мы должны обязательно указать пользователя, под которым будет выполняться регламентное задание. В настройках регламентного задания в конфигурации или в режиме 1С:Предприятия (через список регламентных заданий) убедитесь, что выбран пользователь с полными или достаточными правами для выполнения всех необходимых операций (чтение данных, запись файлов, формирование отчетов). В файловом варианте базы для выполнения регламентных заданий должен быть запущен клиентский сеанс под этим пользователем.

  2. Ключевое слово РАЗРЕШЕННЫЕ в запросах: Если ваш запрос содержит ключевое слово РАЗРЕШЕННЫЕ, это означает, что система автоматически учитывает права текущего пользователя. Если регламентное задание выполняется под пользователем с ограниченными правами, такой запрос может возвращать пустые или неполные данные. Для отладки мы можем временно убрать слово РАЗРЕШЕННЫЕ из запроса, чтобы выяснить, является ли проблема в правах или в самом запросе. Если после этого запрос начнет возвращать данные, значит, причина именно в правах пользователя.

  3. Безопасный режим для файловых операций: При работе с файлами (сохранение отчета, чтение настроек из файла) во внешней обработке, запускаемой регламентным заданием, мы можем столкнуться с ошибкой типа "Ошибка при вызове конструктора (Файл)". Это происходит, если внешняя обработка работает в безопасном режиме, который по умолчанию запрещает операции с файловой системой. Для разрешения таких операций при создании внешней обработки в обработчике регламентного задания мы должны установить параметр БезопасныйРежим = Ложь:

    
    ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлуОбработки, Ложь, Ложь, Ложь, Ложь);
    ВнешняяОбработкаОбъект.УстановитьБезопасныйРежим(Ложь); // Разрешаем небезопасные действия
    
  4. Защита от опасных действий (платформа 8.3.8+): Начиная с платформы 8.3.8, 1С ввела механизм защиты от опасных действий, препятствующий загрузке произвольных внешних отчетов и обработок без явного разрешения. Если регламентное задание запускает внешнюю обработку, которая не прошла проверку безопасности, оно может завершиться ошибкой. Для решения этой проблемы у нас есть несколько вариантов:

    • Снять флаг "Защита от опасных действий" у пользователя, под которым запускается регламентное задание (в режиме 1С:Предприятия, в карточке пользователя).
    • Использовать параметр DisableUnsafeActionProtection в файле conf.cfg для отключения защиты на уровне сервера (требует перезапуска сервера 1С).
    • При программном вызове метода ВнешниеОбработки.Подключить() использовать соответствующий параметр для отключения защиты от опасных действий для конкретной обработки.

Передача и кэширование параметров: избегаем "старых" значений

Одной из неочевидных проблем при работе с внешними обработками в регламентных заданиях является некорректная передача или кэширование параметров.

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

    • Передавайте параметры как аргументы методов: Создайте процедуру или функцию в модуле объекта обработки, которая принимает все необходимые параметры в виде аргументов.
    • Используйте структуру для передачи параметров: При запуске фонового задания или вызове метода, передавайте параметры в виде объекта Структура. Это надежный способ гарантировать, что передаются актуальные значения.
    
    // Пример передачи параметров через структуру
    ПараметрыДляЗадания = Новый Структура;
    ПараметрыДляЗадания.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
    ПараметрыДляЗадания.Вставить("ИмяФайлаОтчета", "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx");
    
    // Предположим, что в модуле объекта обработки есть процедура "СформироватьОтчет"
    // Она принимает структуру с параметрами
    ВыполняемаяОбработка.СформироватьОтчет(ПараметрыДляЗадания);
    
  2. Регистрация обработки: Убедитесь, что ваша внешняя обработка корректно зарегистрирована в справочнике ДополнительныеОтчетыИОбработки, если вы используете стандартные механизмы работы с внешними объектами. Это обеспечивает ее доступность для регламентных заданий.

Общие рекомендации и особенности работы регламентных заданий

Помимо перечисленных выше проблем, мы должны учитывать и общие принципы работы регламентных заданий в 1С.

  1. Запуск и выполнение: Регламентные задания — это программы, запускаемые сервером 1С по расписанию без участия пользователя. Они используются для автоматизации рутинных задач. Когда планировщик определяет, что регламентное задание должно быть запущено, на его основе автоматически создается фоновое задание, которое и выполняет всю обработку.

  2. Повторный запуск: Если регламентное задание уже выполняется, оно не будет запущено повторно, независимо от расписания. Это предотвращает одновременное выполнение одной и той же задачи.

  3. Размещение кода: Код для выполнения регламентного задания во внешней обработке обычно размещается в экспортной процедуре, которая вызывается планировщиком. Чаще всего это процедура ВыполнитьКоманду или другая, явно указанная в настройках регламентного задания.

  4. Использование БСП: Для создания регламентных заданий из внешних обработок в типовых конфигурациях, использующих Библиотеку стандартных подсистем (БСП), существуют стандартные механизмы и шаблоны. Мы рекомендуем изучить их, так как они упрощают разработку и интеграцию.

Мы рассмотрели основные аспекты, которые могут вызывать проблемы при формировании отчетов внешней обработкой через регламентное задание. Применяя эти подходы к отладке, внимательно проверяя права доступа и корректность передачи параметров, мы сможем эффективно настроить автоматическое выполнение наших задач в 1С.

← К списку