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