Дерево значений в управляемой форме
Свойства и методы универсальных коллекции значений типа дерево значений как и таблицы значений не доступны в тонком клиенте. Их нужно создавать на сервере, а затем методом контекста формы ЗначениеВРеквизитФормы(<Значение>, <ИмяРеквизита>) преобразовать значение объекта в реквизит управляемой формы с указанным именем ИмяРеквизита
Мне дали задание – создать форму списка заказа в виде дерева значений, как показано на рис 1
Форма создается очень просто в конфигураторе ( см рис 2)

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