Работа с иерархическими детальными записями

Система компоновки данных позволяет выводить в отчет иерархические детальные записи. В данной статье описываются особенности работы с данным механизмом.

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

Рассмотрим пример. В примере будем выдавать в отчет иерархический справочник номенклатуры.

Запрос набора данных для получения номенклатуры будет выглядеть так:

Копировать в буфер обмена
ВЫБРАТЬ
 Номенклатура.Ссылка,
 Номенклатура.Родитель,
 Номенклатура.Код,
 Номенклатура.Наименование,
 Номенклатура.ЭтоГруппа
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.Родитель В(&Родители)

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

Набор данных с указанным запросом назовем Номенклатура.

Для обеспечения вывода иерархии опишем связь набора данных Номенклатура к самому себе.

В качестве выражения - источника будем использовать значение поля Ссылка.

В качестве выражения - приемника буем использовать значение поля Родитель.

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

Т.к. запрос получает данные с фильтрацией по родителю, в связи укажем параметр связи "Родитель". Таким образом, при получении дочерних записей система будет передавать значения поля Ссылка дочернему запросу через этот параметр. Т.к. параметр Родитель используется в конструкции языка запроса В, то в качестве значения параметра система может передавать не одно, а сразу несколько значений. Чтобы система это делала, укажем в связи признак "Список параметров".

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

Последнее, что нам нужно сделать, это указать, с какого значения система должна начинать получать иерархические записи. Делается это при помощи свойства связи "Начальное значение связи". Нам нужно, чтобы на первом уровне отчета выдавались записи, у которых родитель отсутствует. Поэтому в качестве начального значения связи укажем выражение "Значение(Справочник.Номенклатура.ПустаяСсылка)" (без кавычек). Таким образом, при первом получении данных из набора данных система будет получать записи, у которых значение поля Родитель равно пустой ссылке, т.е. корневые записи.

На следующем рисунке показана полностью заполненная связь в конструкторе схемы:

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

Для этого добавим в настройки детальные записи (группировку без полей группировки) и выберем поля, которые мы хотели бы видеть в результате:

Результат такого отчета будет выглядеть следующим образом:

Код Наименование
0000001 Мониторы
0000021 Монитор 15' LG Studioworks 575N
0000022 Монитор 17' Philips 107S20
0000023 Монитор 19' Hitachi CM715ET
0000024 Монитор LCD 22' M8537ZM/A
0000002 Системные блоки и комплектующие
0000036 Сист. блок Hewlett-Packard Brio BA410
0000037 Сист. блок Hewlett-Packard Vectra VL420
0000038 Сист. блок IBM NetVista A22p
0000039 Сист. блок IBM NetVista M41
0000003 Принтеры
0000030 Лазерный принтер Canon LBP-810
0000031 Лазерный принтер 5250197-203 Minolta-QMS
0000032 Лазерный принтер HP LaserJet 2200
0000004 Мыши
0000025 Мышь 2-кноп A4Tech PS/2
0000026 Мышь OK-720 Mouse A4Tech PS/2
0000027 Мышь Ice Mouse MUS-2
0000028 Мышь LOGITECH M-S48 PS/2
0000029 Мышь GENIUS "EASY" (3 кнопки),
0000005 Клавиатуры
0000018 Клавиатура Apple Pro Keyboards
0000020 Клавиатура LK-601 KB-2000 PS/2
0000006 Программное обеспечение
0000045 Windows
0000009 Windows XP Home Edition Russian CD
0000010 Windows XP Home Edition Russian UPG CD
0000011 Windows XP Professional Russian CD
0000012 1С:Бухгалтерия 7.7 Базовая версия
0000013 1С:Бухгалтерия 7.7 Стандартная версия
0000014 1С:Бухгалтерия ПРОФ версия 7.7
0000015 1С:Аспект 7.7
0000016 1С:Торговля и Склад 7.7 Проф
0000007 Услуги
0000041 Доставка
0000042 Инсталляция ПО
0000043 Консультации по настройке ОС Windiws
0000044 Консультации по настройке 1С
0000033 Ноутбуки
0000034 Ноутбук Rover Computers Navigator KT7
0000035 Ноутбук Rover Computers Explorer
0000046 Телефоны
0000047 Телефон Vega 700
0000048 Телефон Vega 300
0000051 Телефон Siemens SL45
0000052 Телефон LG W7200
0000049 Копировальные аппараты
0000050 Копировальный аппарат Omega