Выгрузка результата запроса в дерево значений с иерархией

Данная заметка рассчитана на начинающих программистов 1С. Часто возникает необходимость получить результат запроса в дерево значений с иерархией. Перебор запроса в цикле и добавление построчно в дерево значений порой не рационально и громоздко.

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

1)  В запросах для справочников доступно упорядочивание по иерархии, это означает, что сортировка будет происходить с учетом подчиненности элемента.

Например если у нас в справочнике есть две папки «А» и «Б», в первой два элемента «А1», «А2» и во второй соответственно «Б1», «Б2». То при сортировке по наименованию элемента по иерархии порядок будет следующим.

А
А1
А2
Б
Б1
Б2

Т.е. приоритет в сортировке зависит от уровня элемента в дереве справочника.

Синтаксис упорядочивания с иерархией в запросе следующий:

Упорядочить ПО <ПолеСортировки> ИЕРАРХИЯ

2)  У результата запроса, как известно, есть метод «выгрузить». В этот метод передается один не обязательный параметр «Тип обхода», одним из значений является «ОбходРезультатаЗапроса.ПоГруппировкамСИерархией» который указывает, что нужно вернуть дерево значений с учетом группировок и иерархии (которые мы можем задавать в запросе, что мы и сделали в первом пункте).

Исходя из этих механизмов наша задача сводится к нескольким строчкам кода. Следующий листинг примера выгрузки справочника номенклатуры в табличное поле (с типом дерево значений) расположенным на форме:

запрос = новый запрос ("ВЫБРАТЬ
                       |	Номенклатура.Наименование КАК Наименование,
                       |	Номенклатура.НаименованиеПолное КАК ПолноеНаименование
                       |ИЗ
                       |	Справочник.Номенклатура КАК Номенклатура
                       |
                       |УПОРЯДОЧИТЬ ПО
                       |	ссылка ИЕРАРХИЯ" );

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

ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Важно отметить, что этот механиз работает только для справочников. Т.е. таблица справочника должна стоять в качестве источника, а не какая-либо друга таблица содержащая лишь ссылку на справочник. Если у вас задача состоит именно в это, тогда нужно соединять соединениями справочник с нужными вам таблицами (документов, регистров и т.п.).

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

Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)

   для каждого стр из ОформленияСтрок цикл

      Уровень=стр.ДанныеСтроки.Уровень();

      стр.ЦветФона=новый цвет (100+Уровень*50,200,100);

   конеццикла;

КонецПроцедуры

Цвет зависит от уровня строки в дереве. Формула для цвета может быть самой разнообразной, все зависит от вашей фантазии.


Автор: Андрей Баринов

Дата публикации: 01.10.2010