Обновлено: 20.03.2008

Работа с иерархией в системе компоновки данных

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

Иерархические группировки

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

Пример:

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

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

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

Результатом отчета будет простой список номенклатуры:

Номенклатура
1С:Аспект 7.7
1С:Бухгалтерия 7.7 Базовая версия
1С:Бухгалтерия 7.7 Стандартная версия
1С:Бухгалтерия ПРОФ версия 7.7
1С:Торговля и Склад 7.7 Проф
Windows XP Home Edition Russian CD
Windows XP Home Edition Russian UPG CD
Windows XP Professional Russian CD
Клавиатура Apple Pro Keyboards
Клавиатура LK-601 KB-2000 PS/2
Копировальный аппарат Omega
Лазерный принтер 5250197-203 Minolta-QMS
Лазерный принтер Canon LBP-810
Лазерный принтер HP LaserJet 2200
Монитор 15' LG Studioworks 575N
Монитор 17' Philips 107S20
Монитор 19' Hitachi CM715ET
Монитор LCD 22' M8537ZM/A
Мышь 2-кноп A4Tech PS/2
Мышь GENIUS "EASY" (3 кнопки),
Мышь Ice Mouse MUS-2
Мышь LOGITECH M-S48 PS/2
Мышь OK-720 Mouse A4Tech PS/2
Ноутбук Rover Computers Explorer
Ноутбук Rover Computers Navigator KT7
Сист. блок Hewlett-Packard Brio BA410
Сист. блок Hewlett-Packard Vectra VL420
Сист. блок IBM NetVista A22p
Сист. блок IBM NetVista M41
Телефон Siemens SL45
Телефон Vega 700

Изменим тип иерархии на "Иерархия". Для этого, в настройках отчета дважды щелкнем на группировке и изменим тип иерархии:

Теперь результат отчета будет дополнен иерархическими записями - родительскими записями для выводимой в отчет номенклатуры:

Номенклатура
Клавиатуры
Клавиатура Apple Pro Keyboards
Клавиатура LK-601 KB-2000 PS/2
Копировальные аппараты
Копировальный аппарат Omega
Мониторы
Монитор 15' LG Studioworks 575N
Монитор 17' Philips 107S20
Монитор 19' Hitachi CM715ET
Монитор LCD 22' M8537ZM/A
Мыши
Мышь 2-кноп A4Tech PS/2
Мышь GENIUS "EASY" (3 кнопки),
Мышь Ice Mouse MUS-2
Мышь LOGITECH M-S48 PS/2
Мышь OK-720 Mouse A4Tech PS/2
Ноутбуки
Ноутбук Rover Computers Explorer
Ноутбук Rover Computers Navigator KT7
Принтеры
Лазерный принтер 5250197-203 Minolta-QMS
Лазерный принтер Canon LBP-810
Лазерный принтер HP LaserJet 2200
Программное обеспечение
1С:Аспект 7.7
1С:Бухгалтерия 7.7 Базовая версия
1С:Бухгалтерия 7.7 Стандартная версия
1С:Бухгалтерия ПРОФ версия 7.7
1С:Торговля и Склад 7.7 Проф
Windows
Windows XP Home Edition Russian CD
Windows XP Home Edition Russian UPG CD
Windows XP Professional Russian CD
Системные блоки и комплектующие
Сист. блок Hewlett-Packard Brio BA410
Сист. блок Hewlett-Packard Vectra VL420
Сист. блок IBM NetVista A22p
Сист. блок IBM NetVista M41
Телефоны
Телефон Siemens SL45
Телефон Vega 700

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

Номенклатура
Клавиатуры
Копировальные аппараты
Мониторы
Мыши
Ноутбуки
Принтеры
Программное обеспечение
Windows
Системные блоки и комплектующие
Телефоны

Отбор "В группе"

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

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

Пример.

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

Отбор: Номенклатура В группе "Программное обеспечение"
     

Номенклатура  
Программное обеспечение  
1С:Аспект 7.7  
1С:Бухгалтерия 7.7 Базовая версия  
1С:Бухгалтерия 7.7 Стандартная версия  
1С:Бухгалтерия ПРОФ версия 7.7  
1С:Торговля и Склад 7.7 Проф  
Windows  
Windows XP Home Edition Russian CD  
Windows XP Home Edition Russian UPG CD  
Windows XP Professional Russian CD  

Описание иерархических наборов данных

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

Рассмотрим пример.

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

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

Для создания такого отчета:

Создадим набор данных "Документы", получающий список документов при помощи запроса:

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

Данный запрос выдаст нам документы с сотрудниками за них ответственных.

Для построения иерархии создадим набор данных "ИерархияСотрудников". Его запрос будет выглядеть так:

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

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

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

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

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

ВАЖНО!
При выводе иерархических записей система компоновки данных выводит в результат поля с теми же именами, какие были у полей, для которых достраивалась иерархия. Поэтому, в иерархическом наборе данных поле, с которым осуществляется связь основного набора должно называться так же, как и в основном наборе. Так, в приведенном выше примере, в иерархическом наборе данных связуемое поле должно иметь имя Сотрудник.

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

Ответственный
Документ Дата Контрагент
 
0000001 28.06.2006 14:19:00 Эльбрус
0000002 28.06.2006 14:30:32 Эльбрус
0000004 28.06.2006 14:32:06 Большаков Андрей
Тарасов
Степанов
Иванов
0000003 28.06.2006 14:30:49 Алекс-2002
0000006 28.06.2006 14:32:47 Филипенко
0000007 28.06.2006 14:34:04 Центр детского творчества
0000010 28.06.2006 14:36:36 Никитин Юрий
0000013 28.06.2006 14:45:29 Алекс-2002
0000014 28.06.2006 14:47:20 Эльбрус
0000019 28.06.2006 14:58:16 Магазин на ул. Алексеева
Петров
0000016 28.06.2006 14:49:47 Алекс-2002
0000017 28.06.2006 14:50:23 Турмасов Марат Сергеевич
0000018 28.06.2006 14:51:36 Завод РТИ
Степанов
0000005 28.06.2006 14:32:32 Завод РТИ
0000008 28.06.2006 14:35:37 Алекс-2002
0000015 28.06.2006 14:48:09 Русская одежда
Федоров
0000009 28.06.2006 14:36:05 Магазин на ул. Алексеева
0000011 28.06.2006 14:37:04 Магазин на ул. Алексеева
0000012 28.06.2006 14:38:18 Автохозяйство №34

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

Набор данных для проверки иерархии

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

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

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

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

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

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

Так, выше описанный отчет, с отбором "Сотрудник В группе "Тарасов" будет выглядеть так:

   
Отбор: Ответственный В группе "Тарасов"
     
Ответственный  
Документ Дата Контрагент  
Тарасов  
Степанов  
Иванов  
0000003 28.06.2006 14:30:49 Алекс-2002  
0000006 28.06.2006 14:32:47 Филипенко  
0000007 28.06.2006 14:34:04 Центр детского творчества  
0000010 28.06.2006 14:36:36 Никитин Юрий  
0000013 28.06.2006 14:45:29 Алекс-2002  
0000014 28.06.2006 14:47:20 Эльбрус  
0000019 28.06.2006 14:58:16 Магазин на ул. Алексеева  
Петров  
0000016 28.06.2006 14:49:47 Алекс-2002  
0000017 28.06.2006 14:50:23 Турмасов Марат Сергеевич  
0000018 28.06.2006 14:51:36 Завод РТИ  
Степанов  
0000005 28.06.2006 14:32:32 Завод РТИ  
0000008 28.06.2006 14:35:37 Алекс-2002  
0000015 28.06.2006 14:48:09 Русская одежда  

Примеры

Приведенные в данной статье примеры можно найти в отчете "ДокументыПоОтветственным" в информационной базе "Примеры 8.1", расположенной на диске ИТС.

Дистрибутив конфигурации находится в каталоге \1CITS\EXE\Demo81

Сделать копирование на жесткий диск