Как убрать иерархию в СКД, если нет нижестоящего уровня?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов в системе компоновки данных (СКД) мы часто сталкиваемся с задачей вывода иерархических структур, например, связки «Номенклатура — Аналог». Чтобы сделать процесс разработки более эффективным, важно понимать логику работы компоновщика. Стандартное поведение системы при использовании левого соединения в запросе приводит к тому, что если у номенклатуры нет аналога, отчет все равно выводит пустую строку под группировкой товара. Это загромождает отчет и мешает визуальному восприятию.

В этой статье мы подробно разберем, как правильно настроить отчет, чтобы иерархия «сворачивалась» при отсутствии подчиненных записей, но при этом родительская запись оставалась видимой. Мы рассмотрим решение на уровне настроек группировок, оптимизацию запроса и использование условного оформления.

Суть проблемы: откуда берутся пустые строки

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

Для того чтобы не потерять товары, у которых нет аналогов, мы используем ЛЕВОЕ СОЕДИНЕНИЕ (Left Join). В результате, если аналог не найден, в соответствующем поле выборки мы получаем значение NULL. СКД честно выводит эту запись, создавая группировку по пустому значению.

Способ 1. Отбор на уровне группировки (Рекомендуемый)

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

В настройках СКД существует два уровня отборов:

  1. Отбор отчета: применяется ко всему набору данных. Если мы здесь поставим условие «Аналог Заполнено», то товары без аналогов исчезнут из отчета полностью. Это нам не подходит, так как мы хотим видеть оригинальную номенклатуру.
  2. Отбор группировки: применяется только к выводу конкретного уровня иерархии.

Пошаговая настройка:

  1. Откройте настройки варианта отчета (или схему компоновки данных в конфигураторе).
  2. В дереве группировок выделите нижний уровень (в нашем случае это группировка «Аналог» или «Детальные записи» под «Номенклатурой»). В некоторых случаях здесь также может потребоваться программное изменение заголовка группировки отчета, если стандартные имена полей не подходят.
  3. Перейдите на вкладку «Отбор» (именно в настройках этой группировки, а не общих настройках отчета).
  4. Добавьте новый элемент отбора:
    • Левое значение: Поле Аналог.
    • Вид сравнения: Заполнено (или Не равно пустому значению).
  5. Чтобы пользователь не видел этот технический фильтр в шапке отчета, перейдите на вкладку «Дополнительные настройки» группировки и установите свойство «Выводить отбор» в значение «Не выводить».

В результате этих действий СКД проверит каждую детальную запись. Если аналог пустой, строка внутри группировки «Номенклатура» не будет выведена, но сама «Номенклатура» (верхний уровень) останется на месте.

Способ 2. Обработка NULL в запросе

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

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


ВЫБРАТЬ
    Товары.Ссылка КАК Номенклатура,
    ЕСТЬNULL(Аналоги.Аналог, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Аналог,
    Аналоги.Количество
ИЗ
    Справочник.Номенклатура КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналогиНоменклатуры КАК Аналоги
        ПО Товары.Ссылка = Аналоги.Номенклатура

Использование функции ЕСТЬNULL гарантирует, что в поле Аналог всегда будет значение определенного типа (в данном случае — пустая ссылка справочника), а не неопределенное значение. Это упрощает настройку отборов, описанную в Способе 1.

Способ 3. Условное оформление (Для сохранения итогов)

Иногда возникают ситуации, когда отбор на группировке искажает итоги. Например, если ресурсы рассчитываются по детальным записям, скрытие строки может привести к изменению суммы в группировке (зависит от настроек ресурсов).

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

Как настроить:

  1. Перейдите на вкладку «Условное оформление» в настройках отчета.
  2. Добавьте новый элемент.
  3. Оформление: Установите параметр Видимость в значение Ложь. Можно также установить Максимальная высота = 0.
  4. Условие: Добавьте отбор Аналог Не заполнено.
  5. Оформляемые поля: Выберите все поля, которые выводятся в детальной группировке.

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

Способ 4. Вычисляемое поле-флаг

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

В схеме компоновки данных на вкладке «Вычисляемые поля» добавим поле:

Теперь в настройках группировки можно использовать более понятный отбор:

ПризнакНаличияАналога Равно Истина.

Особенности работы с ресурсами

Важно помнить, что добавляя поле «Оригинал» (родительскую номенклатуру) в ресурсы или группировки для суммирования, мы должны следить за дублированием данных. Особенно это актуально, когда реализуется вывод элементов иерархии верхнего уровня на СКД.

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

Чтобы избежать этого, ресурсы для родительской группировки (Номенклатура) следует рассчитывать с использованием функции Максимум(ОстатокТовара) или настраивать расчет итогов по группировке так, чтобы данные брались из корректного источника, а не суммировались по детальным записям аналогов. В исключительных случаях, когда логика отчета слишком разная для разных уровней, могут потребоваться две разных схемы в отчете СКД.

Резюме

Для решения задачи скрытия пустой иерархии в СКД выполните следующие шаги:

  1. Убедитесь, что в запросе поля, которые могут быть NULL, обработаны через ЕСТЬNULL.
  2. Перейдите в настройки варианта отчета.
  3. Выберите группировку, отвечающую за нижний уровень (Аналог).
  4. Установите отбор на эту группировку: Аналог Заполнено.
  5. Отключите вывод этого отбора в шапке отчета через дополнительные настройки.

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

← На главную