Простые пример работы с деревом значений в управляемых формах (8.3)
Как заполнить дерево значений (на сервере)?
&НаСервере
Процедура ЗаполнитьДеревоНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ИТОГИ ПО
| Родитель";
ПромДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЗначениеВРеквизитФормы(ПромДерево, "Дерево");
КонецПроцедуры
Как добавить строку (на клиенте)?
&НаКлиенте
Процедура ДобавитьСтрокуНаКлиенте(Команда)
ИдентификаторСтроки = Элементы.Дерево.ТекущаяСтрока;
ТекущаяСтрока = Дерево.НайтиПоИдентификатору(ИдентификаторСтроки);
НоваяСтрокаДерева = ТекущаяСтрока.ПолучитьЭлементы().Добавить();
КонецПроцедуры
Как удалить текущую строку (на клиенте)?
&НаКлиенте
Процедура УдалитьТекущуюСтрокуНаКлиенте(Команда)
ИдентификаторСтроки = Элементы.Дерево.ТекущаяСтрока;
ТекущаяСтрока = Дерево.НайтиПоИдентификатору(ИдентификаторСтроки);
СтрокаРодитель = ТекущаяСтрока.ПолучитьРодителя();
Если СтрокаРодитель = Неопределено Тогда
Дерево.ПолучитьЭлементы().Удалить(ТекущаяСтрока);
Иначе
СтрокаРодитель.ПолучитьЭлементы().Удалить(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Как очистить дерево (на клиенте)?
&НаКлиенте
Процедура ОчиститьДерево(Команда)
Дерево.ПолучитьЭлементы().Очистить();
КонецПроцедуры
Как очистить дерево (на сервере)?
&НаСервере
Процедура ОчиститьДерево(Команда)
ДЗ = РеквизитФормыВЗначение("Дерево");
ДЗ.Строки.Очистить();
ЗначениеВРеквизитФормы(ДЗ, "Дерево");
КонецПроцедуры
Как перебрать дерево рекурсивно (на клиенте)?
&НаКлиенте
Процедура ОбойтиДеревоРекурсивно(Команда)
ОбойтиРекурсивноСтрокиДереваНаКлиенте(Дерево.ПолучитьЭлементы());
КонецПроцедуры
&НаКлиенте
Процедура ОбойтиРекурсивноСтрокиДереваНаКлиенте(Строки)
Для Каждого СтрокаДерева Из Строки Цикл
Сообщить(СтрокаДерева.Номенклатура);
ПодчиненныеСтроки = СтрокаДерева.ПолучитьЭлементы();
Если ПодчиненныеСтроки.Количество() > 0 Тогда
ОбойтиРекурсивноСтрокиДереваНаКлиенте(ПодчиненныеСтроки);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Как перебрать дерево рекурсивно (на сервере)?
&НаСервере
Процедура ОбойтиДеревоРекурсивноНаСервере()
ДеревоЗначений = РеквизитФормыВЗначение("Дерево");
ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(ДеревоЗначений);
КонецПроцедуры
&НаСервере
Процедура ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(ДеревоЗначений)
Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл
Сообщить(СтрокаДерева.Номенклатура);
Если СтрокаДерева.Строки.Количество() > 0 Тогда
ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(СтрокаДерева);
КонецЕсли;
КонецЦикла;
КонецПроцедуры