Приветствую Вас ГостьСуббота, 18.05.2024, 21:39

Каталог статей


Вывод произвольной иерархии

Кроме стандартной иерархии (по полю Родитель) можно вывести произвольную иерархию.

Например в справочнике Номенклатура создадим реквизит "МойРодитель" тип СправочникСсылка.Номенклатура и заполним его для всех элементов

В СКД вделаем 2 набора данных:

1) "Приход" - вывод данных по приходу в разрезе склада и номенклатуры

2) "Иерархия" - для формировании произвольной иерархии. Текст запроса набора данных:

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

Чтобы вывести номенклатуру в иерархии надо объединить эти 2 набора:

1) Приход с Иерархией по полю Номенклатура. Так же надо указать, что в параметр "Ссылка" набора Иерархия передается значение Номенклатура из набора Приход. Здесь важно чтобы название полей в наборах для номенклатуры было одинаковое, иначе наименование родителей в отчете будет пустым.

2) Набор Иерархия надо связать с самим собой, по полю Номенклатура, и  настроить передачу в параметр Ссылка значение МойРодитель для построения иерархии.

Далее в настройках отчета выделяем группировку по полю номенклатура и указываем тип  группировки "Иерархия"

Получим отчет

В отчете видно, что запись "Память" является дочерней к ОЗУ, хотя в свойствах этой записи  указано, что родителем является "Комплектующие", а "ОЗУ" - это реквизит "Мой родитель".

При данном способе построения иерархии есть один недостаток: не получиться установить отбор по группе в параметрах отчета. Если его добавить в настройку отчета, то отбор будет осуществляться по иерархии справочника Номенклатура, п не по произвольно иерархии "Мой родитель".

Чтобы добавить возможность отбора "в группе" по произвольной иерархии надо добавить еще один набор данных "ПроверкаИерархии" с запросом:

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

Этот набор данных надо  связать с самим собой. В качестве выражения источника укажем поле ПроверкаИерархииНоменклатуры, а в качестве выражения приемника – поле РодительИерархииНоменклатуры. При этом укажем параметр связи ПроверкаИерархииНоменклатуры с возможностью использования списка параметров

Теперь следует указать данный набор как набор данных проверки иерархии поля Номенклатура набора данных Приход. Это делается на закладке Наборы данных, в таблице полей набора данных:

Иерархия детальных записей

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

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

Для примера создадим схему компоновки данных ИерархияДетальныхЗаписей отчета Список номенклатуры. Создадим набор данных Номенклатура при помощи запроса:

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

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

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

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

В настройках отчета добавим только одну группировку детальных записей и поля "Код" и "Наименование". В результате получим отчет:

 

Категория: СКД | Добавил: leshic (06.12.2021)
Просмотров: 726 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0