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