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