Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Получение дерева групп справочниками запросом

Как с помощью запроса получить дерево групп справочника. Рассмотрены варианты для иерархии групп и элементов.Автор статьи: Гений 1С
Последняя редакция №1 от 27.04.07
URL: http://kb.mista.ru/article.php?id=522

Ключевые слова: дерево,группы,запрос


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

Допустим у нас есть дерево:

А
--Б
--В
----Г
----Д
Е
--Ж
--З
----И
------Ю
--------Ф
------Я
--------Х
----К
----Л
М
--Н

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

Варианты отображения иерархии



Существуют два варианта отображения иерархии, в которую попадают элементы из списка Список:

1. Без подчиненных.
А
--В
Е
--З

2. С подчиненными.
А
--В
Е
--З
----И
------Ю

Иерархия с подчиненными


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

ВЫБРАТЬ РАЗЛИЧНЫЕ

   Т1.Ссылка.Родитель КАК Ссылка
ИЗ
   Справочник.Задача КАК Т1
ГДЕ
   Т1.Ссылка В ИЕРАРХИИ(&Ссылки) И 0 В (ВЫБРАТЬ Количество(*) ИЗ Справочник.Задача КАК Т2 ГДЕ Т1.Ссылка=Т2.Родитель)
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ


Для иерархии групп и элементов:

ВЫБРАТЬ РАЗЛИЧНЫЕ

   Т1.Ссылка.Родитель КАК Ссылка
ИЗ
   Справочник.Задача КАК Т1
ГДЕ
   Т1.Ссылка В ИЕРАРХИИ(&Ссылки) И Т1.ЭтоГруппа=ложь
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ

Иерархия без подчиненных


В данном случае сложнее. 1С неправильно группирует по иерархии, она плодит дубли.
Код запроса будет таким:
ВЫБРАТЬ РАЗЛИЧНЫЕ

   Т1.Ссылка.Родитель КАК Ссылка
ИЗ
   Справочник.Задача КАК Т1
ГДЕ
   Т1.Ссылка В (&Ссылки)
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ


Полученное дерево нужно будет обработать функцией для удаления лишних дублей:
Функция обУбратьОшибкиИтоговПоИерархии(Строки, Поле="Ссылка", Родитель=Неопределено) Экспорт 
    //Убираем все элементы, равные текущему
    Всего=Строки.Количество();
    Для Инд=1 По Всего Цикл
        Стр=Строки[Всего-Инд];
        Зн=Стр[Поле];
        Если Родитель<>Неопределено И Зн=Родитель Тогда
            Строки.Удалить(Стр);
        Иначе
            обУбратьОшибкиИтоговПоИерархии(Стр.Строки, Поле, Зн);
        КонецЕсли;
    КонецЦикла;
КонецФункции

...

ВычСправочникДерево=Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
обУбратьОшибкиИтоговПоИерархии(ВычСправочникДерево.Строки);


1С не мешало бы доработать запросы, чтобы они выдавали корректные итоги.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика