При разработке отчетов на базе системы компоновки данных (СКД) часто возникает типовая визуальная задача: требуется группировать детальные записи и выводить промежуточные итоги только тогда, когда записей несколько. Если же по элементу присутствует всего одна строка, повторный вывод группировочной строки дублирует значения и перегружает печатную форму отчета.
Параллельно возникает и сопутствующий вопрос: как убрать автоматическое объединение родительской и текущей группировки в заголовке строки (например, когда СКД формирует представление вида «Контрагент, Договор» вместо чистого наименования договора)? Проанализируем причины такого поведения платформы и подробно разберем все способы решения этой задачи.
Выясним причину стандартного поведения платформы 1С:
Авто. В этом режиме СКД берет поле текущей группировки и поля всех вышестоящих родителей, объединяя их наименования через запятую.Разберем по шагам, как избавиться от склеивания полей в заголовке строки:
Договор.Авто.Договор и числовые ресурсы (например, Стоимость).После этого заголовок группировки будет содержать исключительно наименование договора без подтягивания родительского контрагента.
Рассмотрим наиболее надежный и чистый способ формирования отчета без написания программного кода. Идея заключается в том, чтобы разделить вывод повторяющихся и одиночных договоров на две параллельные ветки структуры с взаимно исключающими отборами.
Шаг 1. Вычисление количества записей в запросе
В тексте запроса набора данных добавим вычисление количества строк в разрезе договора. Для этого используем оконную функцию или соединение со сгруппированным подзапросом:
ВЫБРАТЬ
Взаиморасчеты.Контрагент КАК Контрагент,
Взаиморасчеты.Договор КАК Договор,
Взаиморасчеты.Сумма КАК Стоимость,
КОЛИЧЕСТВО(*) OVER(PARTITION BY Взаиморасчеты.Контрагент, Взаиморасчеты.Договор) КАК КоличествоСтрокПоДоговору
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК Взаиморасчеты
Шаг 2. Настройка структуры отчета
В настройках СКД создадим следующую иерархию:
Контрагент.Контрагент добавим две подчиненные ветки одного уровня:
Создаем группировку Договор, а внутри нее — Детальные записи.
В свойствах группировки Договор на вкладке Отбор задаем условие: КоличествоСтрокПоДоговору Больше 1.
Добавляем напрямую Детальные записи (без родительской группировки Договор).
В свойствах этих детальных записей на вкладке Отбор задаем условие: КоличествоСтрокПоДоговору Равно 1.
Не выводить.В результате одиночные договоры выведутся обычной детальной строкой, а договоры с несколькими записями получат полноценную группировку с промежуточным итогом.
Если структура отчета фиксирована, но требуется исключить дублирование суммовых показателей, настроим выражение вычисления ресурса на вкладке Ресурсы.
В поле Выражение для ресурса Стоимость укажем условие:
Выбор
Когда Количество(Стоимость) > 1 Тогда
Сумма(Стоимость)
Иначе
NULL
Конец
В колонке Рассчитывать по... укажем группировку Договор. При таком подходе, если в группе всего одна запись, значение ресурса в итоговой строке группировки не заполнится, что предотвратит дублирование чисел в глазах пользователя.
Проанализируем программный метод для случаев, когда печатная форма формируется нестандартно и требует постобработки табличного документа.
В модуле отчета переопределим процедуру ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Постобработка: удаление пустых/дублирующих строк
// При необходимости можно обойти строки ДокументРезультат и удалить лишние
КонецПроцедуры
Использование разделения структуры на параллельные ветки в схеме компоновки данных является наиболее универсальным решением, так как не требует изменения программного кода и корректно работает в любых типовых конфигурациях.