Как в отчете СКД с выводом по иерархии скрыть верхнего родителя?

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

При построении отчетов в системе компоновки данных часто возникает задача вывести справочник в виде иерархического дерева, но исключить из отображения самый верхний узел (папку верхнего уровня). Разработчики часто сталкиваются с ситуацией, когда стандартные методы фильтрации перестают работать ожидаемым образом: условие в тексте запроса или отбор на вкладке настроек либо не дают эффекта, либо полностью скрывают все вложенные ветки.

Выясним причину такого поведения платформы и разберем практические способы решения этой задачи.

Почему обычный отбор не скрывает верхний узел

Проанализируем механику работы СКД. Когда в настройках структуры для группировки выбирается тип Иерархия, процессор компоновки данных выполняет автоматическое рекурсивное построение дерева. Для обеспечения целостности иерархической структуры система самостоятельно поднимается вверх по ссылкам метаданных до тех пор, пока не дойдет до пустого значения.

Из-за этого возникают следующие эффекты:

  1. Фильтрация в тексте запроса. Если написать в запросе условие вида ГДЕ Родитель <> &ВерхняяПапка, запрос отсечет саму запись папки, однако в процессе компоновки СКД все равно прочитает ссылку на этого родителя из подчиненных элементов и достроит недостающий корневой узел дерева.
  2. Стандартный отбор в настройках СКД. Если установить отбор Ссылка Не равно ПапкаВерхнегоУровня на уровне отчета или группировки, платформа воспримет это как исключение ветки целиком. В результате исчезнет не только сам верхний узел, но и все дочерние элементы, так как они потеряют связь с корнем.

Чтобы обойти это системное ограничение, рассмотрим надежные способы скрытия корневого уровня.

Способ 1. Построение собственной иерархии через связи наборов данных

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

Разберем настройку по шагам:

  1. Перейдем на вкладку Связи наборов данных в схеме компоновки.
  2. Создадим связь набора данных с самим собой, указав текущий набор одновременно источником и приемником.
  3. В колонке Поле источника укажем Ссылка, а в колонке Поле приемника — Родитель.
  4. В колонке Имя параметра иерархии зададим произвольное имя параметра или укажем начальное условие.
  5. В колонке Начальное значение связи укажем ссылку на ту папку (или список папок), которая должна стать реальным началом отчета, минуя корень. Если необходимо начать вывод со второго уровня, в качестве начального значения задаются ссылки элементов первого подуровня.
  6. В настройках структуры отчета для нужного поля группировки выберем тип Иерархия, которая теперь будет строиться на основе созданной связи, а не по стандартному алгоритму метаданных.

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

Способ 2. Отбор после группировки и функция ВычислитьВыражение

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

Для этого создадим пользовательское поле-выражение, определяющее родительский контекст:


Выбор 
    Когда Уровень() = 0 Тогда 
        Неопределено 
    Иначе 
        ВычислитьВыражение("Ссылка", , "Иерархия") 
Конец

Далее настроим отбор в группировке:

  1. Добавим отбор по системному полю СистемныеПоля.УровеньВГруппировке или созданному пользовательскому полю.
  2. Установим условие исключения верхнего уровня (например, уровень не равен значению корня).
  3. В свойствах данного отбора обязательно изменим параметр Применение: вместо стандартного значения установим После группировки или для иерархии.

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

Способ 3. Скрытие строки через условное оформление

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

Разберем порядок действий:

  1. В настройках группировки перейдем на вкладку Условное оформление и добавим новый элемент.
  2. Во вкладке Отбор установим условие на системное поле: СистемныеПоля.УровеньВГруппировке Равно 1 (или условие равенства поля конкретной верхней папке).
  3. Во вкладке Оформление установим параметры: Текст — пустая строка (одиночный пробел), Высота строки — минимальное значение (например, 0.1 или 1 пункт).
  4. Во вкладке Оформляемые поля выберем поле группировки и все связанные ресурсы.

Данный вариант прост в реализации, однако оставляет в отчете тонкую полосу свернутой строки, что не всегда подходит для печатных форм.

Способ 4. Программное скрытие строки при выводе в отчет

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

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


ТабличныйДокумент.НачатьАвтогруппировкуСтрок();

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

ТабличныйДокумент.ЗакончитьАвтогруппировкуСтрок();

Также при программном обходе элементов компоновщика в цикле через ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент можно анализировать свойство ЭлементРезультата.Уровень и просто не вызывать метод ВывестиЭлемент() для верхнего уровня.

Резюме

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

← На главную