Система компоновки данных позволяет выводить в отчет иерархические детальные записи. Иерархия детальных записей нужна, чтобы вывести в отчет группировку Детальные записи как бы с типом Иерархия. Например, можно вывести в отчет иерархический справочник номенклатуры, используя только его детальные записи.
При выводе в результат детальных записей система анализирует наличие у выводимого набора данных связи к самому себе. Если такая связь обнаружена, система рекурсивно выполняет связь для получения вложенных записей.
Для примера создадим схему компоновки данных ИерархияДетальныхЗаписей отчета Список номенклатуры. Создадим набор данных Номенклатура при помощи запроса (листинг 3.7).
Листинг 3.7. Текст запроса
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Родитель,
Номенклатура.Код,
Номенклатура.Наименование,
Номенклатура.ЭтоГруппа
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель В(&Родители)
При помощи данного запроса будут получаться записи с указанным родителем. Если параметр Родитель будет содержать пустую ссылку, то будут получены записи, у которых родителей нет, то есть корневые записи.
Для обеспечения вывода иерархии на закладке Связи наборов данных конструктора схемы компоновки данных опишем связь набора данных Номенклатура к самому себе. Укажем в качестве выражения источника поле Ссылка, а в качестве выражения приемника – поле Родитель. Таким образом, для каждой записи набора данных в наборе данных будут искаться записи, у которых поле Родитель имеет значение поля Ссылка родительской записи. Так как запрос получает данные с фильтрацией по родителю, укажем параметр связи Родители и, так как параметр может принимать список значений, обозначим это в связи, установив соответствующий флажок в поле Список параметров. В этот параметр будет помещено значение связи источника.
Справочник Номенклатура имеет иерархию групп и элементов. При этом дочерние записи могут существовать только у групп. Поэтому для того, чтобы система не осуществляла поиск дочерних записей не у групповых записей, укажем в связи условие связи ЭтоГруппа. Далее нужно указать, с какого значения система должна начинать получать иерархические записи. Делается это при помощи свойства связи Начальное значение связи. Нам нужно, чтобы на первом уровне отчета выдавались записи, у которых родитель отсутствует. Поэтому в качестве начального значения связи укажем выражение Значение(Справочник.Номенклатура.ПустаяСсылка). Таким образом, при первом получении данных из набора данных система будет получать записи, у которых значение поля Родитель равно пустой ссылке, то есть корневые записи (рис. 3.62).
Рис. 3.62. Связь иерархического набора данных к самому себе
На закладке Настройки добавим в структуру отчета группировку Детальные записи и перенесем в список выбранных полей поля Код и Наименование (рис. 3.63).
Рис. 3.63. Настройка структуры и полей отчета
Установим схему ИерархияДетальныхЗаписей в качестве основной схемы компоновки данных для отчета Список номенклатуры (рис. 3.64).
Рис. 3.64. Установка схемы компоновки данных для отчета
Выполним отчет. В результат выводятся детальные записи с иерархией по полю Родитель (рис. 3.65).
Рис. 3.65. Результат отчета