Для иерархических справочников система компоновки данных автоматически создает специальные наборы данных, при помощи которых и достраивается иерархия. Однако встречаются ситуации, когда требуется построить иерархию самостоятельно. Для примера рассмотрим отчет Поступление товаров, который отражает поступление товаров по складам с иерархией номенклатуры, построенной не по группам справочника Номенклатура (полю Родитель), а по полю Мой родитель.
Для хранения списка элементов собственной иерархии в справочнике Номенклатура создана группа Моя иерархия, на которую ссылаются элементы других групп. Например, в группе Моя иерархия создан элемент Мониторы, для которого поле Мой родитель задано как Товары для сборки. Этот элемент группы Моя иерархия является корневым. Затем в группе Комплектующие для элемента Монитор LCD поле Мой родитель задано как Мониторы. Таким образом, наша иерархия будет двухуровневой (рис. 3.51, 3.52).
Рис. 3.51. Элементы группы «Моя иерархия»
Рис. 3.52. Элементы группы «Комплектующие»
В схеме компоновки данных отчета Поступление товаров создан набор данных Приход, получающий данные о поступлении товаров при помощи запроса (листинг 3.4).
Листинг 3.4. Текст запроса
ВЫБРАТЬ
ОстаткиНоменклатурыОбороты.Склад,
ОстаткиНоменклатурыОбороты.Номенклатура,
ОстаткиНоменклатурыОбороты.КоличествоПриход КАК Приход
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Обороты КАК ОстаткиНоменклатурыОбороты
Чтобы выполнить иерархическую группировку, процессору компоновки данных требуется информация об источнике данных для построения иерархии. Для этого в схеме компоновки данных создан набор данных Иерархия, содержащий информацию о текущем элементе справочника Номенклатура и его родителе (листинг 3.5).
Листинг 3.5. Текст запроса
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.МойРодитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В(&Ссылка)
Для того чтобы данный набор данных получал по иерархии всех родителей, должна быть описана связь набора к самому себе. В конструкторе схемы компоновки данных это делается на закладке Связи наборов данных. В качестве выражения источника указывается поле МойРодитель, а в качестве выражения приемника – поле Номенклатура. Таким образом, из каждой записи набора данных будет получено значение поля МойРодитель и будет осуществлен поиск полученного значения в поле Номенклатура в этом же наборе данных, и система рекурсивно получит все записи по иерархии. Так как в запросе записи получаются только для номенклатуры, переданной в параметре Ссылка, то в параметре связи (поле Параметр) указывается, что следует использовать этот параметр, и так как параметр может принимать список значений, устанавливается соответствующий флажок в поле Список параметров. В параметр Ссылка будет помещено значение связи источника.
Также задается связь между наборами данных Приход и Иерархия по полю Номенклатура (рис. 3.53).
Рис. 3.53. Установка связей наборов данных для построения иерархии
ВНИМАНИЕ
В иерархическом наборе данных поле, с которым осуществляется связь основного набора, должно называться так же, как и в основном наборе. Так, в приведенном выше примере в иерархическом наборе данных связуемое поле должно иметь имя Номенклатура.
СОВЕТ
Поскольку поля иерархического набора данных нужны только для построения иерархии, имеет смысл скрыть их от пользователя. Для этого следует отключить у этих полей доступность настройки. Делается это на закладке Наборы данных конструктора схемы компоновки данных (рис. 3.54).
Рис. 3.54. Установка доступности полей
На закладке Настройки создан вариант отчета Иерархия, содержащий группировку по полю Номенклатура с типом Иерархия, поле Приход и оформленный макетом оформления Радуга (рис. 3.55).
Рис. 3.55. Настройка иерархической группировки
Выполним вариант отчета Иерархия. Результат отчета с иерархической группировкой примет вид (рис. 3.56).
Рис. 3.56. Результат отчета