Работа с деревом значений (Управляемые формы 8.3)

Простые пример работы с деревом значений в управляемых формах (8.3)

Как заполнить дерево значений (на сервере)?

&НаСервере
Процедура ЗаполнитьДеревоНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Номенклатура.Родитель КАК Родитель,
	|	Номенклатура.Ссылка КАК Номенклатура
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ИТОГИ ПО
	|	Родитель";
	
	ПромДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	ЗначениеВРеквизитФормы(ПромДерево, "Дерево");
КонецПроцедуры

Как добавить строку (на клиенте)?

&НаКлиенте
Процедура ДобавитьСтрокуНаКлиенте(Команда)
	ИдентификаторСтроки = Элементы.Дерево.ТекущаяСтрока;
	ТекущаяСтрока       = Дерево.НайтиПоИдентификатору(ИдентификаторСтроки);
	НоваяСтрокаДерева   = ТекущаяСтрока.ПолучитьЭлементы().Добавить();
КонецПроцедуры

Как удалить текущую строку (на клиенте)?

&НаКлиенте
Процедура УдалитьТекущуюСтрокуНаКлиенте(Команда)
	ИдентификаторСтроки = Элементы.Дерево.ТекущаяСтрока;
	ТекущаяСтрока       = Дерево.НайтиПоИдентификатору(ИдентификаторСтроки);
	СтрокаРодитель      = ТекущаяСтрока.ПолучитьРодителя();
	
	Если СтрокаРодитель = Неопределено Тогда
		Дерево.ПолучитьЭлементы().Удалить(ТекущаяСтрока);
	Иначе
		СтрокаРодитель.ПолучитьЭлементы().Удалить(ТекущаяСтрока);
	КонецЕсли;
КонецПроцедуры

Как очистить дерево (на клиенте)?

&НаКлиенте
Процедура ОчиститьДерево(Команда)
	
	Дерево.ПолучитьЭлементы().Очистить();
	
КонецПроцедуры

Как очистить дерево (на сервере)?

&НаСервере
Процедура ОчиститьДерево(Команда)
	ДЗ = РеквизитФормыВЗначение("Дерево");
	ДЗ.Строки.Очистить();
	ЗначениеВРеквизитФормы(ДЗ, "Дерево");
КонецПроцедуры

Как перебрать дерево рекурсивно (на клиенте)?

&НаКлиенте
Процедура ОбойтиДеревоРекурсивно(Команда)
    ОбойтиРекурсивноСтрокиДереваНаКлиенте(Дерево.ПолучитьЭлементы());
КонецПроцедуры

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

Как перебрать дерево рекурсивно (на сервере)?

&НаСервере
Процедура ОбойтиДеревоРекурсивноНаСервере()
	 ДеревоЗначений  = РеквизитФормыВЗначение("Дерево");
     ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(ДеревоЗначений);
КонецПроцедуры

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