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