При программном вызове типовых отчетов, построенных на базе механизмов Универсального отчета (например, «Валовая прибыль», «Продажи» или «Выручка по оплатам»), разработчики часто сталкиваются с ситуацией, когда при выгрузке результата запроса ПостроительОтчета.Результат.Выгрузить() в таблице значений присутствуют только группировочные поля (номенклатура, контрагенты, ответственные менеджеры) и период, но полностью отсутствуют числовые ресурсы — валовая прибыль, сумма продаж, себестоимость и итоговые цифры.
В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько проверенных способов получения полноценной таблицы значений со всеми показателями и итогами.
Проанализируем работу механизма Универсального отчета. В конфигурациях на базе обычных форм построение запроса выполняется через объект ПостроительОтчета. Измерения (группировки) добавляются в запрос автоматически при восстановлении настроек отчета, а вот числовые показатели (ресурсы) подключаются динамически непосредственно перед моментом формирования печатной формы табличного документа.
Во многих типовых отчетах при вызове метода СформироватьОтчет() выполняется следующий алгоритм:
ДобавитьПоказателиВВыбранныеПоляИУсловноеОформление).В результате, когда после метода СформироватьОтчет() разработчик пытается выгрузить результат построителя через ПостроительОтчета.Результат.Выгрузить(), коллекция выбранных полей уже очищена от показателей. Построитель повторно выполняет запрос только по тем полям, которые остались в списке выбранных — то есть только по группировкам.
Наиболее простым и правильным способом является использование штатной функции объекта УниверсальныйОтчет — ПолучитьРезультат(). Этот метод выполняет всю необходимую служебную подготовку, устанавливает параметры, включает активные показатели и возвращает готовый объект РезультатЗапроса.
Рассмотрим пример программного вызова отчета с загрузкой настроек и получением результата:
// Создаем объект отчета
ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();
// Восстанавливаем сохраненные настройки из структуры или регистра сведений
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);
// Устанавливаем требуемый период работы
ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);
// Если в отчете используются дополнительные параметры построителя, устанавливаем их напрямую
ОтчетВал.УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ТипЦен", ОтчетВал.ТипЦенСебестоимости);
// Получаем результат запроса со всеми показателями и выгружаем в таблицу значений
ТаблицаРезультата = ОтчетВал.УниверсальныйОтчет.ПолучитьРезультат().Выгрузить();
При таком подходе функция ПолучитьРезультат() самостоятельно добавит отмеченные в настройках числовые показатели в выбранные поля запроса перед его выполнением.
Если по каким-то причинам требуется использовать именно ПостроительОтчета, необходимо вручную гарантировать наличие числовых полей в коллекции ВыбранныеПоля перед обращением к свойству Результат.
Разберем шаг за шагом, как это сделать:
Рассмотрим пример кода:
ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);
ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);
// Добавляем требуемые показатели в выбранные поля построителя отчета
Построитель = ОтчетВал.УниверсальныйОтчет.ПостроительОтчета;
Построитель.ВыбранныеПоля.Добавить("ВаловаяПрибыль");
Построитель.ВыбранныеПоля.Добавить("Выручка");
Построитель.ВыбранныеПоля.Добавить("Себестоимость");
// Выгружаем итоговую таблицу значений
ТЗ = Построитель.Результат.Выгрузить();
После добавления полей ПостроительОтчета сформирует запрос, в тексте которого будут присутствовать суммируемые поля и их итоги.
В модулях объектов типовых отчетов (например, в отчете «Валовая прибыль») присутствуют экспортные или внутренние функции для управления показателями. Вы можете вызвать процедуру подготовки показателей перед формированием результата.
Посмотрим на пример вызова методов отчета:
ОтчетВал = Отчеты.ВаловаяПрибыль.Создать();
ОтчетВал.ВосстановитьНастройкиИзСтруктуры(СохраненнаяНастройка);
ОтчетВал.УниверсальныйОтчет.ДатаНач = НачалоДня(НачПериода);
ОтчетВал.УниверсальныйОтчет.ДатаКон = КонецДня(КонПериода);
// Вызываем внутреннюю процедуру отчета для установки выбранных полей и условного оформления
ПоказателиСтруктура = ОтчетВал.ДобавитьПоказателиВВыбранныеПоляИУсловноеОформление();
// Выполняем запрос построителя
ЗапросОтчета = ОтчетВал.УниверсальныйОтчет.ПостроительОтчета.ПолучитьЗапрос();
ТЗ = ЗапросОтчета.Выполнить().Выгрузить();
// При необходимости возвращаем настройки полей в исходное состояние
ОтчетВал.УдалитьПоказателиИзВыбранныхПолейИУсловногоОформления(ПоказателиСтруктура);
Этот метод гарантирует, что в результат выгрузки попадут ровно те числовые колонки, которые были предусмотрены алгоритмами конкретного типового отчета.