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

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

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

Анализ проблемы

Исходная задача — создать отчет на СКД, который выводит список номенклатуры с указанием ее родительской группы. Проблема заключается в том, что если элемент номенклатуры лежит в самом корне справочника, у него нет родителя, и в соответствующей колонке отчета отображается пустое значение. Требуется, чтобы для таких корневых элементов в качестве родителя выводилось некое условное значение, например, строка "Основная группа", или чтобы они отображались на верхнем уровне иерархии отчета. Для отладки таких нюансов полезно использовать продвинутые консоли запросов и СКД, которые позволяют быстро проверить результат выполнения запроса.

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

Решение с помощью модификации запроса

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

Посмотрим на пример такого запроса:


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

Разберем этот запрос по шагам:

  1. ВЫБРАТЬ РАЗРЕШЕННЫЕ — это важная инструкция, которая обеспечивает работу механизма ограничения прав доступа на уровне записей (RLS). Если в системе настроены права, то пользователь увидит в отчете только ту номенклатуру, к которой у него есть доступ.
  2. Справочник.Номенклатура КАК Номенклатура — мы берем за основу весь справочник номенклатуры.
  3. ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураРодитель ПО Номенклатура.Родитель = НоменклатураРодитель.Ссылка — это ключевая часть решения. Мы присоединяем к каждой записи номенклатуры (Номенклатура) соответствующую ей запись родителя (НоменклатураРодитель). Связь устанавливается по полю Родитель. Левое соединение гарантирует, что в результат попадут все записи из левой таблицы (Справочник.Номенклатура), даже если для них не найдется соответствия в правой (то есть, если у элемента нет родителя).
  4. ЕСТЬNULL(НоменклатураРодитель.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Родитель — здесь мы обрабатываем ситуацию с корневыми элементами. Если у номенклатуры есть родитель, соединение будет успешным, и НоменклатураРодитель.Ссылка вернет ссылку на группу. Если же номенклатура в корне, то поле Родитель у нее пустое, соединение не найдет соответствия, и НоменклатураРодитель.Ссылка вернет NULL. Функция ЕСТЬNULL перехватывает это значение NULL и заменяет его на указанное нами значение — в данном случае, на пустую ссылку справочника номенклатуры.
  5. ГДЕ НЕ Номенклатура.ЭтоГруппа — условие, которое отбирает только элементы справочника, исключая группы.

Настройка иерархии в СКД

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

  1. Перейдите на вкладке "Настройки" в конструктор СКД.
  2. В структуре отчета создайте новую группировку.
  3. В качестве поля группировки укажите наше вычисляемое поле Родитель. Если вам необходимо более тонко управлять визуализацией, может пригодиться программное изменение заголовка группировки отчета СКД.
  4. Внутрь этой группировки добавьте дочернюю группировку по полю Номенклатура.
  5. Чтобы иерархия отображалась корректно и наглядно, установите для поля Родитель тип группировки "Иерархия".

Таким образом, элементы из корня справочника будут сгруппированы под условным "пустым" родителем, который можно будет озаглавить в настройках отчета как "Без группы" или "Основная группа".

Альтернативный подход: использование виртуальной таблицы "Иерархия"

В некоторых случаях для построения иерархических отчетов удобно использовать виртуальную таблицу Иерархия. Она позволяет получить все родительские группы для каждого элемента справочника вплоть до самого верхнего уровня. Этот подход дает больше гибкости, если требуется многоуровневая вложенность.

Рассмотрим пример запроса с использованием этой виртуальной таблицы:


ВЫБРАТЬ
    НоменклатураИерархия.Ссылка КАК Номенклатура,
    НоменклатураИерархия.Родитель КАК Родитель
ИЗ
    Справочник.Номенклатура.Иерархия КАК НоменклатураИерархия

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

Подводя итоги

Мы рассмотрели эффективный способ построения иерархического отчета в СКД, который корректно обрабатывает элементы, находящиеся в корне справочника. Ключ к решению — это правильная подготовка данных с помощью запроса, а именно, использование ЛЕВОГО СОЕДИНЕНИЯ для получения родителя и функции ЕСТЬNULL для обработки корневых элементов. После этого стандартные настройки группировки и иерархии в СКД позволяют легко добиться желаемого вида отчета. Такой подход обеспечивает гибкость и полный контроль над представлением данных.

← На главную