Добрый день.
Хочу на простом примере понять как перевести ТаблицуЗначений в ДеревоЗначений.
Хочу что бы при нажатии по "Кнопка2" из ТЗ перевести в ДЗ.

```1c
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.КлючСтроки = 1;
    НоваяСтрока.КлючСвязи = 0;
    НоваяСтрока.Наименование = "Товары1";
    НоваяСтрока.Количество = 1;

    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.КлючСтроки = 2;
    НоваяСтрока.КлючСвязи = 1;
    НоваяСтрока.Наименование = "Товары2";
    НоваяСтрока.Количество = 2;

    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.КлючСтроки = 3;
    НоваяСтрока.КлючСвязи = 1;
    НоваяСтрока.Наименование = "Товары3";
    НоваяСтрока.Количество = 3;

    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.КлючСтроки = 4;
    НоваяСтрока.КлючСвязи = 0;
    НоваяСтрока.Наименование = "Товары4";
    НоваяСтрока.Количество = 4;
```

Пытался сделать по примеру - https://forum.infostart.ru/forum9/topic252442/
---
примерно по вашему примеру простенькую обработку сделал, посмотрите
---
Какая то каша! Вопрос в чем? Чтобы кто то написал за вас? и Выложил готовое решение?
---
сформируй ТЗ, передай ее в запрос, сгруппируй по нужным полям, выгрузи в дерево значений
---
вот простенький пример, попробуйте его, попробуйте поизменять поля группировки, например взять поле КлючСвязи
обратите внимание! в ДЗ должны быть такие-же колонки как и в ТЗ!!!
тогда пример сработает (и да, он для управляемых форм)

```1c
    Процедура Кнопка2Нажатие(Элемент)
    ЗаполнитьДЗнаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьДЗнаСервере()

    //Внимание!!! в ДЗ должны быть такие-же колонки как и в ТЗ!!!
    //определяем группирующие данные, по коду будем использовать Наименование
    //явно прослеживаются группы Товар1 и Товар2

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

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

    КонецПроцедуры
```
---
ЗаполнитьДЗнаСервере();

Создал управляемую форму. Нажимаю Кнопка2 ничего не происходит

```1c
    &НаСервере
    Процедура ЗаполнитьДЗнаСервере()

    //Внимание!!! в ДЗ должны быть такие-же колонки как и в ТЗ!!!
    //определяем группирующие данные, по коду будем использовать Наименование
    //явно прослеживаются группы Товар1 и Товар2

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

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

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

    &НаКлиенте
    Процедура Кнопка1(Команда)
    // Вставить содержимое обработчика.
    НоваяСтрока = Таблица.Добавить();
    НоваяСтрока.КлючСтроки = 1;
    НоваяСтрока.КлючСвязи = 0;
    НоваяСтрока.Наименование = "Товары1";
    НоваяСтрока.Количество = 1;

    НоваяСтрока = Таблица.Добавить();
    НоваяСтрока.КлючСтроки = 2;
    НоваяСтрока.КлючСвязи = 1;
    НоваяСтрока.Наименование = "Товары2";
    НоваяСтрока.Количество = 2;

    НоваяСтрока = Таблица.Добавить();
    НоваяСтрока.КлючСтроки = 3;
    НоваяСтрока.КлючСвязи = 1;
    НоваяСтрока.Наименование = "Товары3";
    НоваяСтрока.Количество = 3;

    НоваяСтрока = Таблица.Добавить();
    НоваяСтрока.КлючСтроки = 4;
    НоваяСтрока.КлючСвязи = 2;
    НоваяСтрока.Наименование = "Товары4";
    НоваяСтрока.Количество = 4;
    КонецПроцедуры

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

    // Процедура выгружает данные из таблицы значений в дерево значений
    // данные выгружаются только в таблицу со сходным набором реквизитов
    //
    // Параметры:
    //
    // КлючСтроки - имя колонки ТаблицыЗначений - уникальный идентификатор
    // КлючСвязи - имя колонки ТаблицыЗначений - указатель привязки к строке Дерева,
    // своего рода указатель на "Родителя"
    //
    Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт
    Дерево = Новый ДеревоЗначений;
    Для Каждого Колонка Из Таблица.Колонки Цикл
    Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЦикла;
    Для Каждого СтрокаТаблицы Из Таблица Цикл
    СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);
    Если СтрокаГруппировки = Неопределено Тогда
    ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы);
    Иначе
    ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы);
    КонецЕсли;
    КонецЦикла;
    Возврат Дерево;
    КонецФункции //ВыгрузитьТаблицуЗначенийВДеревоЗначений()
```
---
```1c
    Процедура Кнопка2Нажатие(Элемент)
    Для каждого Строка ИЗ ТаблицаЗначений Цикл
    ЗаполнитьЗначенияСвойств( ДеревоЗначений.Строки.Добавить(), Строка );
    КонецЦикла;
    КонецПроцедуры
```
---
А можно обойтись без управляемой формы ?

Если сделать таким образом, почему то не группирует.

```1c
    Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт
    Дерево = Новый ДеревоЗначений;
    Для Каждого Колонка Из Таблица.Колонки Цикл
    Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЦикла;
    Для Каждого СтрокаТаблицы Из Таблица Цикл
    СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);
    Если СтрокаГруппировки = Неопределено Тогда
    ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы);
    Иначе
    ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы);
    КонецЕсли;
    КонецЦикла;
    Возврат Дерево;
    КонецФункции //ВыгрузитьТаблицуЗначенийВДеревоЗначений()

    Процедура Кнопка2Нажатие(Элемент)
    // Вставить содержимое обработчика.
    ВыгрузитьТаблицуЗначенийВДеревоЗначений(ТЗ);
    КонецПроцедуры
```

Получить бы хотелось в таком виде, с возможностью раскрыть/закрыть
---
примерно по вашему примеру простенькую обработку сделал, посмотрите
---
Большое спасибо.
А чтобы сделать еще один вложенный объект - добавил "ВлГруппа" Надо по отбору пройтись, правильно понимаю?

```1c
    Процедура ЗаполнитьДЗнаСервере()
    //Внимание!!! в ДЗ должны быть такие-же колонки как и в ТЗ!!!
    //определяем группирующие данные, по коду будем использовать Наименование
    //явно прослеживаются группы Товар1 и Товар2
    лкДЗ = РеквизитФормыВЗначение("ДЗ");
    лкДЗ.Строки.Очистить();//чистим если что-то уже было
    лкПоляГруппы = "Группа,Количество";
    лкПоляСтрок = "ВлГруппа,Наименование,Количество";
    лкТЗ = ТЗ.Выгрузить(,лкПоляГруппы);
    лкТЗ.Свернуть("Группа","Количество");
    лкТЗ.Сортировать("Группа"); //проверить надо ли

    лкОтбор = Новый Структура("Группа");

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

    ЗначениеВРеквизитФормы(лкДЗ,"ДЗ");

    КонецПроцедуры
```
---
вот мы и подошли к понятию использования рекурсивных процедур для заполнения/обработки данных в Дереве Значения
каждая ветка это своя таблица, строчки которой в свою очередь тоже могут содержать таблицу.
и для заполнения таких деревьев не создают 4,5,6 (или сколько там больше) вложенных циклов

а для каких-то маленьких задач, двухуровневых деревьев хватает "заглаза"
---
Можно еще вопрос. В будущем хочу сделать что типо отчета:
-Дата;
--Менеджер;
---Реализация.

Пока тренируюсь на простых вещах для понимая. Правильно понимаю надо добиться того что бы цикл обхода был вынесен в функцию и вызывался рекурсивно?

```1c
    лкОтбор = Новый Структура("Группа");

    Для каждого лкГрп Из лкТЗ Цикл
    //добавляем групповые строчки дерева
    лкНовГ = лкДЗ.строки.добавить();
    ЗаполнитьЗначенияСвойств(лкНовГ, лкГрп, лкПоляГруппы);
    лкОтбор.Группа = лкГрп.Группа;
    лкСтроки = ТЗ.НайтиСтроки(лкОтбор);
    Для каждого лкРез Из лкСтроки Цикл
    //добавляем детальные строчки дерева
    лкНовД = лкНовГ.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(лкНовД, лкРез, лкПоляСтрок);
    КонецЦикла;
    КонецЦикла;
```
---
. В будущем хочу сделать что типо отчета:
-Дата;
--Менеджер;
---Реализация.
Вот ключевое слово "Отчет" !!!
так и надо использовать именно объект - Отчет!!! с СКД! там эти деревья (по/с группировкам(и)) строятся на раз-два
---
по факту отчет уже строится, много все накручено с запросами и подзапросами, когда-то давно его писали. но он вообще не информативный, все вываливает как раз в ТЗ. я хочу его переоформить в ДЗ для начала, потом если получится подумать как переделать.