Дерево значений в управляемой форме

Печать (Ctrl+P)

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

Мне дали задание  –  создать форму списка заказа в виде дерева значений, как показано на рис 1

Форма создается очень просто в конфигураторе  ( см рис 2)

Рис 2 Управляемая форма с деревом значений

Однако, у меня не получилось  на сервере создавать дерево значений в путем выгрузки результата запроса по группировкам в дерево таким образом :
Дерево = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
У меня возникала  ошибка при вызове метода контекста формы:
ЗначениеВРеквизитФормы(Дерево, “ДеревоЗаказов”);
Причина ошибки была в том, что структура колонок реквизита формы ДеревоЗаказов не соответствовала структуре объекта  дерево, полученного в результате выгрузки запроса. Я не стал глубоко об этом думать и решил создавать дерево значений  в цикле. Программный код показан ниже:

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

Запрос.УстановитьПараметр("ДатаКон", Период.ДатаОкончания);
Запрос.УстановитьПараметр("ДатаНач", Период.ДатаНачала);
РезультатЗапроса = Запрос.Выполнить();
// Так не получается и пришлось создать дерево в цикле. Тема  статьи
//Дерево = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); 
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Время");
Дерево.Колонки.Добавить("Заказ");
ВыборкаВремя = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаВремя.Следующий() Цикл
Строка = Дерево.Строки.Добавить();
Строка.Время= ВыборкаВремя.Время;
ВыборкаДетальныеЗаписи = ВыборкаВремя.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Нов=Строка.Строки.Добавить(); 
Нов.Заказ= ВыборкаДетальныеЗаписи.Ссылка; 
КонецЦикла;
КонецЦикла;
ЗначениеВРеквизитФормы(Дерево, "ДеревоЗаказов");
КонецПроцедуры

Для создания полной копии исходного дерева значений можно использовать метод метод скопировать:

НовоеДеревоСостава =  ДеревоСостава.Скопировать();

Следующая процедура предназначена для заполнения реквизита формы типа «ДеревоЗначений»
Параметры:
КоллекцияЭлементовДерева – реквизит формы, который имеет тип «ДеревоЗначений» . Реквизит заполняется значениями из второго параметра процедуры.
ДеревоЗначений – ДеревоЗначений – параметр содержит данные для заполнения.

 &НаСервере 
Процедура ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, ДеревоЗначений) Экспорт
Для Каждого Строка Из ДеревоЗначений.Строки Цикл
ЭлементДерева = КоллекцияЭлементовДерева.Добавить();
ЗаполнитьЗначенияСвойств(ЭлементДерева, Строка);
Если Строка.Строки.Количество() > 0 Тогда
заполнитьКоллекциюЭлементовДереваДанныхФормы(ЭлементДерева.ПолучитьЭлементы(), Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Пример вызова процедуры:

КоллекцияЭлементовДерева =Элементы.Дерево.ПолучитьЭлементы();
КоллекцияЭлементовДерева.Очистить();
ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, ДеревоРезультатСКД);
Previous Article
Next Article

One Reply to “Дерево значений в управляемой форме”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.