Обновлено: 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
Сделать копирование на жесткий диск