Здравствуйте, коллеги! Есть управляемая форма с двумя реквизитами типа "ДеревоЗначений".
Дерево1 изначально заполнено, Дерево2 пустое.
Как сделать так, чтобы при активации строки в Дереве1 автоматически заполнялось Дерево2? В Дерево2 должна встать ветка Дерева1, которая подчинена выделенной строке Дерева1.

Например: Дерево1
Элемент1
  Элемент2
     Элемент3
       Элемент4

При активации строки Элемент2 Дерево2 принимает следующий вид:
Элемент2
   Элемент3
      Элемент4
---
Держи:

```1c
    &НаКлиенте
    Процедура Дерево1ПриАктивизацииСтроки(Элемент)

    Если Элементы.Дерево1.ТекущиеДанные <> Неопределено Тогда
    Дерево2.ПолучитьЭлементы().Очистить();
    ДобавленнаяСтрока = ДобавитьСтрокуВДверево2(Неопределено, Элементы.Дерево1.ТекущиеДанные);
    ЗаполнитьДерево2(ДобавленнаяСтрока, Элементы.Дерево1.ТекущиеДанные.ПолучитьЭлементы());
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ЗаполнитьДерево2(Родитель, Строкы)

    Для Каждого ТекСтрока Из Строкы Цикл
    ДобавленнаяСтрока = ДобавитьСтрокуВДверево2(Родитель, ТекСтрока);
    ЗаполнитьДерево2(ДобавленнаяСтрока, ТекСтрока.ПолучитьЭлементы());
    КонецЦикла;

    КонецПроцедуры

    &НаКлиенте
    Функция ДобавитьСтрокуВДверево2(Родитель, СтрокаДляЗаполнения)

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

    // НоваяСтрока.Колонка1 = СтрокаДляЗаполнения.Колонка1;
    // НоваяСтрока.Колонка2 = СтрокаДляЗаполнения.Колонка2;
    // ...
    Возврат НоваяСтрока;

    КонецФункции
```

Дерево2 заполняется полностью при открытии формы, если не нужно или очисти Дерево2 (
```1c
    Дерево2.ПолучитьЭлементы().Очистить()
```
) при откритии или имей переменная типа булево и заполняй Дерево2 когда переменная истина (переменная будет истина при откритии)
---
самый простой вариант это обход вашего дерева1 и заполнение дерева2 по нужному вам алгоритму!
---
Если использовать РеквизитФормыВЗначение("Дерево1"), то как в этом дереве найти строку, которая активирована на форме?
---
Явно - никак. Только по комбинации уникальных значений на выбранном уровне и его родителях. Хотя, индексы по уровням, тоже должны совпадать по-идее...
---
а можно ли это сделать без использования РеквизитФормыВЗначение("Дерево1")
---
Можно, конечно. И даже нужно, я бы сказал. Для твоих целей нет смысла получать полнофункциональное дерево значений.
Все равно ведь придется делать копирование рукопашным поэлементным обходом (простенькая рекурсия).
---
есть пример кода?
---
Чего, рекурсии? Обхода деревьев? Да полно в интернетах. Советую напрячься и написать самому. Это неплохая задачка для начинающего программиста. Хоть какая-то алгоритмистика в 1С - большая редкость :)
---
Кодf(sourceNode, destNode)
{
  newNode = destNode.CreateNode();
  newNode.FieldN = sourceNode.FieldN;
  foreach(sourceNode as sourseItem) f(sourseItem, newNode);
}Показать полностью
В опсчем как-то так.
---
То что надо!!!
---
Держи:

```1c
    &НаКлиенте
    Процедура Дерево1ПриАктивизацииСтроки(Элемент)

    Если Элементы.Дерево1.ТекущиеДанные <> Неопределено Тогда
    Дерево2.ПолучитьЭлементы().Очистить();
    ДобавленнаяСтрока = ДобавитьСтрокуВДверево2(Неопределено, Элементы.Дерево1.ТекущиеДанные);
    ЗаполнитьДерево2(ДобавленнаяСтрока, Элементы.Дерево1.ТекущиеДанные.ПолучитьЭлементы());
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ЗаполнитьДерево2(Родитель, Строкы)

    Для Каждого ТекСтрока Из Строкы Цикл
    ДобавленнаяСтрока = ДобавитьСтрокуВДверево2(Родитель, ТекСтрока);
    ЗаполнитьДерево2(ДобавленнаяСтрока, ТекСтрока.ПолучитьЭлементы());
    КонецЦикла;

    КонецПроцедуры

    &НаКлиенте
    Функция ДобавитьСтрокуВДверево2(Родитель, СтрокаДляЗаполнения)

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

    // НоваяСтрока.Колонка1 = СтрокаДляЗаполнения.Колонка1;
    // НоваяСтрока.Колонка2 = СтрокаДляЗаполнения.Колонка2;
    // ...
    Возврат НоваяСтрока;

    КонецФункции
```

Дерево2 заполняется полностью при открытии формы, если не нужно или очисти Дерево2 (
```1c
    Дерево2.ПолучитьЭлементы().Очистить()
```
) при откритии или имей переменная типа булево и заполняй Дерево2 когда переменная истина (переменная будет истина при откритии)
---
посмотрите на методы:
```1c
    скопировать()
```
 и
```1c
    удалить()
```
 не нужные строки.
---
Вот обработчик для тестирование
---
Благодарю! Всё отлично работает!