При работе с классическими конфигурациями 1С на обычных формах (такими как УПП 1.3, КА 1.1 или УТ 10.3) разработчики часто сталкиваются с требованиями заказчиков использовать Универсальный отчет вместо СКД. Универсальный отчет построен на базе механизма ПостроительОтчета. Этот инструмент весьма гибок, однако его настройка имеет ряд неочевидных нюансов.
В этой статье мы подробно разберем две популярные проблемы при проектировании отчетов на Построителе:
---
По умолчанию, если мы добавляем «Номенклатуру» и «Характеристику» в группировки строк, ПостроительОтчета выводит их древовидной структурой (одно под другим в одной колонке). Нам же требуется получить плоскую таблицу, где под каждый разрез выделена своя колонка.
Рассмотрим два принципиально разных способа решения этой задачи.
Если вам обязательно нужно сохранить «Характеристику» именно как полноценное измерение (группировку), по которому при необходимости можно сворачивать данные, нам нужно изменить свойство размещения измерений.
В коде инициализации отчета или перед выводом необходимо переопределить свойство РазмещениеИзмеренийВСтроках у объекта ПостроительОтчета:
// Установка вывода группировок в отдельных колонках программно
ПостроительОтчета.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.ВОтдельныхКолонках;
Если мы работаем через пользовательский интерфейс настройки «Универсального отчета»:
Зачастую характеристика не должна быть самостоятельной группировкой. Гораздо логичнее выводить её как зависимый реквизит номенклатуры. Но если просто добавить её в дополнительные поля, колонка может исчезать или выводиться некорректно.
Для правильного вывода необходимо явно связать дополнительное поле с его родителем — измерением «Номенклатура». Проанализируем, как это сделать в модуле отчета (например, в процедуре УстановитьНачальныеНастройки):
// 1. Добавляем характеристику в список дополнительных полей
УниверсальныйОтчет.ДобавитьДополнительноеПоле("ХарактеристикаНоменклатуры", ТипРазмещенияРеквизитовИзмерений.Отдельно);
// 2. Связываем поле характеристики с измерением номенклатуры
УниверсальныйОтчет.УстановитьСвязьПоляИИзмерения("ХарактеристикаНоменклатуры", "Номенклатура");
Метод УстановитьСвязьПоляИИзмерения сообщает Построителю отчетов, что колонка «ХарактеристикаНоменклатуры» должна выводиться строго на уровне строки «Номенклатура», предотвращая появление пустых строк и исключая хаотичное смещение данных.
---
Разработчики часто сталкиваются со следующей дилеммой: в запросе Построителя отчетов все доступные для группировки поля должны быть объявлены в секции {ИТОГИ ПО ...}. Если убрать характеристику из фигурных скобок итогов в запросе, она полностью пропадет из списка доступных группировок в настройках отчета.
Но если мы оставляем её там, ПостроительОтчета автоматически генерирует подзаголовки и рассчитывает итоги по каждой характеристике, дублируя числовые показатели номенклатуры. Выясним, какими путями можно решить эту проблему.
В программном коде типового «Универсального отчета» предусмотрено специальное свойство-соответствие мСтруктураНевыводимыхГруппировок. Оно позволяет управлять выводом строк итогов для конкретных измерений.
Рассмотрим пример настройки в модуле отчета:
// Запрещаем выводить строки итогов для группировки "ХарактеристикаНоменклатуры"
УниверсальныйОтчет.мСтруктураНевыводимыхГруппировок.Вставить("ХарактеристикаНоменклатуры", Истина);
При заполнении этого соответствия алгоритм вывода отчета сформирует детальные строки с характеристиками, но пропустит создание промежуточных итоговых строк для этого измерения. Это самый чистый и производительный способ решения проблемы.
Если по какой-то причине стандартные свойства Универсального отчета не отрабатывают (например, при сильных кастомных доработках схемы вывода), мы можем применить обходной путь — очистить ненужные ячейки непосредственно в готовом ТабличномДокументе.
Разберем пример реализации такой очистки после формирования отчета:
// Формируем отчет стандартным методом
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент);
// Обходим строки полученной таблицы с конца, чтобы не сбивались индексы при удалении строк
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1);
// Проверяем, содержит ли строка маркер группировки характеристики
Если Найти(ОбластьСтроки.Текст, "Характеристика:") > 0 Тогда
// Очищаем показатели в строке итога, зная номера колонок с ресурсами
ТабличныйДокумент.Область(НомерСтроки, НомерКолонкиСуммы).Текст = "";
// Либо, если строка итогов по характеристике вообще не нужна, удаляем ее полностью:
// ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки, ), ТипСмещенияТаблицы.ПоВертикали);
КонецЕсли;
КонецЦикла;
Этот способ требует точного знания структуры колонок результирующего табличного документа, но дает разработчику абсолютный контроль над внешним видом выходной формы.
Мы также можем повлиять на то, как рассчитываются ресурсы на уровне СУБД. Если нам не нужны суммы по характеристикам, мы можем переопределить расчет агрегатных функций в секции ИТОГИ.
Вместо стандартного подсчета сумм по всем измерениям:
ИТОГИ
СУММА(КоличествоЗадания),
СУММА(КоличествоФакт)
ПО
ОБЩИЕ,
Номенклатура,
ХарактеристикаНоменклатуры
Мы можем явно указать СУБД рассчитывать суммы только по нужным разрезам (например, только по Номенклатуре), оставив Характеристику без числовых расчетов:
ИТОГИ
СУММА(КоличествоЗадания),
СУММА(КоличествоФакт)
ПО
ОБЩИЕ,
Номенклатура
При таком подходе СУБД не будет выполнять лишнюю работу по агрегации данных для характеристик, что положительно скажется на производительности тяжелых отчетов.
---
Для того чтобы сделать отчет максимально эстетичным и удобным для конечного пользователя, рекомендуется сочетать Способ Б из первой проблемы (вывод характеристики как доп. поля со связью через УстановитьСвязьПоляИИзмерения) и Способ А из второй проблемы (использование мСтруктураНевыводимыхГруппировок). Это позволит вам получить аккуратную плоскую таблицу без лишних итоговых строк, полностью сохранив привычный интерфейс Универсального отчета.