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

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

При разработке механизмов автоматической рассылки отчетов в конфигурациях на обычных формах (таких как УПП 1.3, КА 1.1 или УТ 10.3) программисты часто сталкиваются с тем, что код, идеально работающий в ручном режиме, «падает» с ошибкой при запуске через регламентное задание. Рассмотрим подробнее, почему возникают ошибки Метод объекта не обнаружен (УстановитьНачальныеНастройки) и Поле объекта не обнаружено (мВосстанавливатьНастройкиПриОткрытии), и как правильно адаптировать отчет для работы на сервере.

Причина возникновения ошибок на сервере

Основная проблема заключается в архитектуре типового механизма УниверсальныйОтчет. Разработчики фирмы 1С изначально проектировали его для работы в интерактивном режиме. Если мы заглянем в модуль объекта отчета или обработки, то увидим, что многие методы и переменные обернуты в инструкции препроцессора #Если Клиент Тогда.

Когда отчет запускается пользователем вручную, эти методы доступны. Но как только управление переходит к регламентному заданию, код выполняется на стороне сервера. В этом контексте всё, что находится внутри клиентских директив, просто «перестает существовать» для системы. Разберем по шагам, как обойти эти ограничения.

Проблема 1: Ошибка метода УстановитьНачальныеНастройки

Проанализируем ситуацию: метод УстановитьНачальныеНастройки предназначен для первичного заполнения структуры отбора, показателей и группировок. На сервере он часто недоступен, так как внутри себя обращается к механизмам работы с интерфейсом (например, к методам управления формой или сохранения настроек в реестр Windows).

Если мы просто удалим вызов этого метода, то при попытке программно добавить группировку или отбор, мы получим следующую ошибку: Поле не найдено (ЗаказПокупателя). Это происходит потому, что ПостроительОтчета еще не проинициализировал свой текст запроса и «не знает» о существовании полей метаданных.

Решение: Нам необходимо выполнить «тихую» инициализацию отчета, которая не затрагивает клиентские функции. Вместо стандартного метода попробуем вызвать инициализацию объектов напрямую. В большинстве типовых конфигураций для этого подходит следующий подход:


// Вместо УстановитьНачальныеНастройки используем явную инициализацию
ОтчетПродажи.УниверсальныйОтчет.УстановитьИнициализироватьОбъекты();

После этого вызова ПостроительОтчета заполнит свои свойства, и мы сможем обращаться к полям через ИзмеренияСтроки.Вставить или Отбор["ИмяПоля"].

Проблема 2: Поле объекта не обнаружено (мВосстанавливатьНастройкиПриОткрытии)

Выясним причину этой ошибки. Переменная мВосстанавливатьНастройкиПриОткрытии (и аналогичные ей, начинающиеся на «м») — это экспортная переменная модуля объекта, которая используется для управления поведением формы (например, чтобы отчет не затирал программно установленные настройки сохраненными пользовательскими при открытии окна).

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

Правильный алгоритм формирования отчета на сервере

Рассмотрим пример корректного формирования отчета на базе Универсального отчета внутри общего модуля, предназначенного для регламентного задания. Обратите внимание на последовательность действий:


Процедура СформироватьОтчетДляРассылки() Экспорт
    
    // Создаем объект отчета
    ОтчетОбъект = Отчеты.ВаловаяПрибыль.Создать();
    ТабДок = Новый ТабличныйДокумент;
    
    // 1. Инициализируем настройки без вызова клиентских методов
    // В некоторых версиях можно передать параметр Ложь, чтобы отключить восстановление
    Попытка
        ОтчетОбъект.УниверсальныйОтчет.УстановитьИнициализироватьОбъекты();
    Исключение
        // Если метод недоступен, инициализируем Построитель напрямую через текст запроса
        ОтчетОбъект.УстановитьНачальныеНастройки(); 
    КонецПопытки;

    // 2. Очищаем стандартные настройки, если нужно задать свои
    ОтчетОбъект.УниверсальныйОтчет.ПостроительОтчета.ИзмеренияСтроки.Очистить();
    ОтчетОбъект.УниверсальныйОтчет.ПостроительОтчета.ВыбранныеПоля.Очистить();
    
    // 3. Добавляем свои измерения
    ОтчетОбъект.УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Склад");
    ОтчетОбъект.УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Номенклатура");

    // 4. Устанавливаем параметры периода
    ОтчетОбъект.УниверсальныйОтчет.ДатаНач = НачалоДня(ТекущаяДата() - 86400);
    ОтчетОбъект.УниверсальныйОтчет.ДатаКон = КонецДня(ТекущаяДата() - 86400);

    // 5. Настраиваем отбор
    ЭлементОтбора = ОтчетОбъект.УниверсальныйОтчет.ПостроительОтчета.Отбор["Организация"];
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
    ЭлементОтбора.Значение = Справочники.Организации.НайтиПоКоду("00001");

    // 6. Формируем отчет
    ОтчетОбъект.УниверсальныйОтчет.СформироватьОтчет(ТабДок);
    
    // Дальнейшие действия: сохранение во временный файл или отправка по почте
    // ...
КонецПроцедуры

Ошибка «Недостаточно фактических параметров для метода фонового задания»

Если после исправления кода отчета вы столкнулись с этой ошибкой, проанализируем настройки самого регламентного задания. Эта ошибка означает, что процедура в общем модуле ожидает параметры, которые вы не передали в метаданных или в программном коде создания фонового задания.

Важные моменты проверки:

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

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

← На главную