- Примеры запросов для работы с иерархическими справочниками
- Получение элементов иерархического справочника, находящихся в подчинении заданной группы
- Проверка наличия подчиненных элементов у элемента справочника
- Получение всех родителей элемента
- Вывод иерархического справочника в отчет
- Получение итогов по иерархии
- Работа с иерархией в системе компоновки данных
- Иерархические группировки
- Отбор «В группе»
- Описание иерархических наборов данных
- Набор данных для проверки иерархии
- Примеры
Примеры запросов для работы с иерархическими справочниками
В данном разделе показаны примеры решения типовых задач при работе с иерархическими справочниками.
Получение элементов иерархического справочника, находящихся в подчинении заданной группы
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ. Пример использования В ИЕРАРХИИ:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
В данном примере будут получены все записи справочника Номенклатура, находящиеся в группе &Группа, включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить установив условие на поле Родитель. Пример:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Группа
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа.
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
ВЫБРАТЬ ПЕРВЫЕ 1
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса «Родитель». После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет. Пример:
Если Запрос.Выполнить().Пустой() Тогда
Сообщить(«Зписей нет»);
Иначе
Сообщить(«Записи есть»);
КонецЕсли;
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Запрос = Новый Запрос(«ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры»;
Пока Истина Цикл
Запрос.УстановитьПараметр(«ТекущийЭлементНоменклатуры», ТекущийЭлементНоменклатуры);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() — 1 Цикл
ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить(ТекущийЭлементНоменклатуры);
КонецЕсли;
КонецЦикла;
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
УПОРЯДОЧИТЬ ПО
Номенклатура.ЭтоГруппа ИЕРАРХИЯ,
Наименование
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов.
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ
(Номенклатура.ЭтоГруппа = ЛОЖЬ)
УПОРЯДОЧИТЬ ПО Наименование
ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ИЕРАРХИЯ
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, нам необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ. Пример:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ТОЛЬКО ИЕРАРХИЯ
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Источник
Работа с иерархией в системе компоновки данных
Система компоновки данных позволяет выводить в результат иерархические данные. В данной статье описываются некоторые особенности работы с иерархией в системе компоновки данных.
Иерархические группировки
Для того чтобы вывести в отчет группировку с иерархией следует у поля группировки, указать тип иерархии.
Создаем схему с набором данных — запрос. В качестве текста запроса используем следующий запрос:
Для начала, посмотрим, как будет выглядеть отчет без иерархии. В настройках отчета добавляем группировку по полю Номенклатура. Тип иерархии оставляем без изменения.
Результатом отчета будет простой список номенклатуры:
Номенклатура |
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
Источник