Как в Построителе отчетов вывести Номенклатуру и Характеристику в отдельных колонках и отключить лишние итоги

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

При работе с классическими конфигурациями 1С на обычных формах (такими как УПП 1.3, КА 1.1 или УТ 10.3) разработчики часто сталкиваются с требованиями заказчиков использовать Универсальный отчет вместо СКД. Универсальный отчет построен на базе механизма ПостроительОтчета. Этот инструмент весьма гибок, однако его настройка имеет ряд неочевидных нюансов.

В этой статье мы подробно разберем две популярные проблемы при проектировании отчетов на Построителе:

  1. Вывод Номенклатуры и ее Характеристики в соседних (отдельных) колонках вместо классического иерархического вывода "друг под другом".
  2. Отключение расчета итогов по группировке Характеристика, чтобы избавиться от пустых дублирующих строк с суммами, которые только засоряют отчёт.

---

Проблема №1. Выводим Номенклатуру и Характеристику в отдельных колонках

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

Рассмотрим два принципиально разных способа решения этой задачи.

Способ А. Настройка размещения измерений в строках (если оба поля являются группировками)

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

В коде инициализации отчета или перед выводом необходимо переопределить свойство РазмещениеИзмеренийВСтроках у объекта ПостроительОтчета:


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

Если мы работаем через пользовательский интерфейс настройки «Универсального отчета»:

  1. Переходим в настройки отчета на вкладку «Группировки».
  2. Находим параметр размещения группировок (обычно это выпадающий список в нижней части формы или колонка в таблице группировок).
  3. Выбираем вариант размещения «В отдельных колонках» вместо дефолтных значений «Вместе» или «В одной колонке».

Способ Б. Вывод характеристики как дополнительного поля (реквизита)

Зачастую характеристика не должна быть самостоятельной группировкой. Гораздо логичнее выводить её как зависимый реквизит номенклатуры. Но если просто добавить её в дополнительные поля, колонка может исчезать или выводиться некорректно.

Для правильного вывода необходимо явно связать дополнительное поле с его родителем — измерением «Номенклатура». Проанализируем, как это сделать в модуле отчета (например, в процедуре УстановитьНачальныеНастройки):


// 1. Добавляем характеристику в список дополнительных полей
УниверсальныйОтчет.ДобавитьДополнительноеПоле("ХарактеристикаНоменклатуры", ТипРазмещенияРеквизитовИзмерений.Отдельно);

// 2. Связываем поле характеристики с измерением номенклатуры
УниверсальныйОтчет.УстановитьСвязьПоляИИзмерения("ХарактеристикаНоменклатуры", "Номенклатура");

Метод УстановитьСвязьПоляИИзмерения сообщает Построителю отчетов, что колонка «ХарактеристикаНоменклатуры» должна выводиться строго на уровне строки «Номенклатура», предотвращая появление пустых строк и исключая хаотичное смещение данных.

---

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

Разработчики часто сталкиваются со следующей дилеммой: в запросе Построителя отчетов все доступные для группировки поля должны быть объявлены в секции {ИТОГИ ПО ...}. Если убрать характеристику из фигурных скобок итогов в запросе, она полностью пропадет из списка доступных группировок в настройках отчета.

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

Способ А. Использование структуры невыводимых группировок (Рекомендуемый)

В программном коде типового «Универсального отчета» предусмотрено специальное свойство-соответствие мСтруктураНевыводимыхГруппировок. Оно позволяет управлять выводом строк итогов для конкретных измерений.

Рассмотрим пример настройки в модуле отчета:


// Запрещаем выводить строки итогов для группировки "ХарактеристикаНоменклатуры"
УниверсальныйОтчет.мСтруктураНевыводимыхГруппировок.Вставить("ХарактеристикаНоменклатуры", Истина);

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

Способ Б. Пост-обработка сформированного Табличного документа

Если по какой-то причине стандартные свойства Универсального отчета не отрабатывают (например, при сильных кастомных доработках схемы вывода), мы можем применить обходной путь — очистить ненужные ячейки непосредственно в готовом ТабличномДокументе.

Разберем пример реализации такой очистки после формирования отчета:


// Формируем отчет стандартным методом
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент);

// Обходим строки полученной таблицы с конца, чтобы не сбивались индексы при удалении строк
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
    ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1);
    
    // Проверяем, содержит ли строка маркер группировки характеристики
    Если Найти(ОбластьСтроки.Текст, "Характеристика:") > 0 Тогда
        // Очищаем показатели в строке итога, зная номера колонок с ресурсами
        ТабличныйДокумент.Область(НомерСтроки, НомерКолонкиСуммы).Текст = "";
        
        // Либо, если строка итогов по характеристике вообще не нужна, удаляем ее полностью:
        // ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки, ), ТипСмещенияТаблицы.ПоВертикали);
    КонецЕсли;
КонецЦикла;

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

Способ В. Корректировка секции ИТОГИ в тексте запроса

Мы также можем повлиять на то, как рассчитываются ресурсы на уровне СУБД. Если нам не нужны суммы по характеристикам, мы можем переопределить расчет агрегатных функций в секции ИТОГИ.

Вместо стандартного подсчета сумм по всем измерениям:


ИТОГИ
    СУММА(КоличествоЗадания),
    СУММА(КоличествоФакт)
ПО
    ОБЩИЕ,
    Номенклатура,
    ХарактеристикаНоменклатуры

Мы можем явно указать СУБД рассчитывать суммы только по нужным разрезам (например, только по Номенклатуре), оставив Характеристику без числовых расчетов:


ИТОГИ
    СУММА(КоличествоЗадания),
    СУММА(КоличествоФакт)
ПО
    ОБЩИЕ,
    Номенклатура

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

---

Резюме

Для того чтобы сделать отчет максимально эстетичным и удобным для конечного пользователя, рекомендуется сочетать Способ Б из первой проблемы (вывод характеристики как доп. поля со связью через УстановитьСвязьПоляИИзмерения) и Способ А из второй проблемы (использование мСтруктураНевыводимыхГруппировок). Это позволит вам получить аккуратную плоскую таблицу без лишних итоговых строк, полностью сохранив привычный интерфейс Универсального отчета.

← На главную