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