Как программно получить результат Универсального отчета с показателями и числами в 1С

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

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

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

Почему в выгружаемой таблице значений отсутствуют показатели

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

Во многих типовых отчетах при вызове метода СформироватьОтчет() выполняется следующий алгоритм:

  1. Вызывается процедура добавления показателей в выбранные поля построителя (например, ДобавитьПоказателиВВыбранныеПоляИУсловноеОформление).
  2. Выполняется запрос построителя и выводится табличный документ.
  3. Сразу после вывода отчета вызывается процедура очистки или удаления временно добавленных показателей из выбранных полей.

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

Способ 1. Использование встроенного метода ПолучитьРезультат()

Наиболее простым и правильным способом является использование штатной функции объекта УниверсальныйОтчет — ПолучитьРезультат(). Этот метод выполняет всю необходимую служебную подготовку, устанавливает параметры, включает активные показатели и возвращает готовый объект РезультатЗапроса.

Рассмотрим пример программного вызова отчета с загрузкой настроек и получением результата:


// Создаем объект отчета
ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();

// Восстанавливаем сохраненные настройки из структуры или регистра сведений
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);

// Устанавливаем требуемый период работы
ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);

// Если в отчете используются дополнительные параметры построителя, устанавливаем их напрямую
ОтчетВал.УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ТипЦен", ОтчетВал.ТипЦенСебестоимости);

// Получаем результат запроса со всеми показателями и выгружаем в таблицу значений
ТаблицаРезультата = ОтчетВал.УниверсальныйОтчет.ПолучитьРезультат().Выгрузить();

При таком подходе функция ПолучитьРезультат() самостоятельно добавит отмеченные в настройках числовые показатели в выбранные поля запроса перед его выполнением.

Способ 2. Программное добавление полей показателей перед выгрузкой

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

Разберем шаг за шагом, как это сделать:

  1. Загрузить или установить начальные настройки отчета.
  2. Задать период и требуемые параметры запроса.
  3. Добавить имена нужных числовых ресурсов в коллекцию выбранных полей построителя отчета.
  4. Выполнить выгрузку результата запроса.

Рассмотрим пример кода:


ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);

ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);

// Добавляем требуемые показатели в выбранные поля построителя отчета
Построитель = ОтчетВал.УниверсальныйОтчет.ПостроительОтчета;
Построитель.ВыбранныеПоля.Добавить("ВаловаяПрибыль");
Построитель.ВыбранныеПоля.Добавить("Выручка");
Построитель.ВыбранныеПоля.Добавить("Себестоимость");

// Выгружаем итоговую таблицу значений
ТЗ = Построитель.Результат.Выгрузить();

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

Способ 3. Вызов служебных процедур подсистемы Универсального отчета

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

Посмотрим на пример вызова методов отчета:


ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);

ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);

// Вызываем внутреннюю процедуру отчета для установки выбранных полей и условного оформления
ПоказателиСтруктура = ОтчетВал.ДобавитьПоказателиВВыбранныеПоляИУсловноеОформление();

// Выполняем запрос построителя
ЗапросОтчета = ОтчетВал.УниверсальныйОтчет.ПостроительОтчета.ПолучитьЗапрос();
ТЗ = ЗапросОтчета.Выполнить().Выгрузить();

// При необходимости возвращаем настройки полей в исходное состояние
ОтчетВал.УдалитьПоказателиИзВыбранныхПолейИУсловногоОформления(ПоказателиСтруктура);

Этот метод гарантирует, что в результат выгрузки попадут ровно те числовые колонки, которые были предусмотрены алгоритмами конкретного типового отчета.

← На главную