Есть таблица значений с двумя реквизитами: "Клиент" и "НомерТелефона".
За клиентом может быть закреплено несколько номеров телефонов, по этому клиенты могут повторяться с разными строками.
Подскажите пожалуйста, как вывести на УФ дерево, на верхнем уровне которого будет находиться "Клиент", при открытии которого будут отображаться его номера телефонов.
---
Я же привел часть кода. Родитель не задается, он для чтения только. Просто дочерние строки добавлять надо не в Дерево.Строки.Добавить(), а в РодительскаяСтрока.Строки.Добавить().
---
запихнуть тз в запрос. в запросе сделать группировку по колонке клиент. и на выходе получите дерево. а дальше просто его вывести на форму
или выгрузить колонку клиент из этой тз в другую. Свернуть строки. потом обходом получившейся тз искать строки в исходной тз по клиенту и построить так дерево
---
Эммм... Просто пробегаешься по таблице значений, отсортированной по полю "Клиент". При изменении значения клиента относительно предыдущего добавляешь в дерево ветку верхнего уровня и пока он тот же самый - добиваешь по нему телефоны.
---
А как заполнять дерево? Пытаюсь вот так, но получаю ошибку при попытки записи родителя, так как данный реквизит только для чтения...Что я делаю не так?

```1c
    ДеревоЗначений=ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
    Запрос = Новый Запрос;
    Запрос.Текст =
    "
    .....(вырезано)
    |ВЫБРАТЬ
    | .....ТорговаяТочкаПоставки КАК ТорговаяТочка,
    | ......НомерТелефона
    |ИЗ
    | ....
    |ИТОГИ ПО
    | ТорговаяТочка";
    Запрос.УстановитьПараметр("ДатаВыборки", НачалоДня(ДатаВыборки));
    РезультатЗапроса = Запрос.Выполнить();
    ПартнерМаршрут=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ПартнерМаршрут.Следующий() Цикл
    СтрокаДЗ=ДеревоЗначений.Строки.Добавить();
    СтрокаДЗ.Партнер = ПартнерМаршрут.ТорговаяТочка;
    СтрокаДЗ.НомерТелефона= ";
    Номера=ПартнерМаршрут.Выбрать();
    Пока Номера.Следующий() Цикл
    СтрокаДЗНомер=ДеревоЗначений.Строки.Добавить();
    СтрокаДЗНомер.Партнер = Номера.ТорговаяТочка;
    СтрокаДЗНомер.НомерТелефона= Номера.НомерТелефона;
    СтрокаДЗНомер.Родитель = СтрокаДЗ;
    КонецЦикла;
    КонецЦикла;
    ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
    ЗначениеВДанныеФормы(ДеревоЗначений,ДеревоЗначенийКлиенты);
```
---
Строки телефонов надо добавлять не к дереву значений, а к родительской строке:

```1c
    Пока Номера.Следующий() Цикл
    СтрокаДЗНомер=СтрокаДЗ.Строки.Добавить();
    СтрокаДЗНомер.Партнер = Номера.ТорговаяТочка;
    СтрокаДЗНомер.НомерТелефона= Номера.НомерТелефона;
    КонецЦикла;
```
---
В таком случае строки будут без родителя и не будут отображаться в группе - не работает
---
Ну здрассте! Дерево сформировалось корректно и без ошибок. Отобразить его на форме - это уже второй этап.

ЗначениеВРеквизитФорм() и проверьте свойство отображения табличного поля на форме.
---
Вот так все работает:

```1c
    ПромДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    ЗначениеВДанныеФормы(ПромДерево, ДеревоЗначенийКлиенты);
```

Но я не пойму как вручную заполнить дерево (код в сообщении (4)). Почему я не могу задать родителя, как мне его тогда задавать?
---
Я же привел часть кода. Родитель не задается, он для чтения только. Просто дочерние строки добавлять надо не в Дерево.Строки.Добавить(), а в РодительскаяСтрока.Строки.Добавить().
---
РодительскаяСтрока.Строки.Добавить()
Именно это я и хотел осознать - спасибо.
Я второй раз сталкиваюсь с иерархическими списками и каждый раз забываю об этом нюансе.
---
Тебе показали - как. Подчиненные узлы добавляются в коллекцию "Строки" родительского узла. Родитель при этом "вытекает" автоматически.
(13) Так и не получится. Иногда полезно заглядывать в синтакс-помощник.
---
Так и не получится. Иногда полезно заглядывать в синтакс-помощник.

Я об этом и написал в ответ на (11) - так не получается - по этому и преобразовываю.
---
Если устраивает результат автовыгруженного дерева - тогда это имеет смысл.
---
Для автовыгрузки ведь все равно нужно преобразовывать? Сразу в дерево значений формыне выгружает.

```1c
    ДеревоЗначений=ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
    ДеревоЗначенийКлиенты = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    ЗначениеВДанныеФормы(ПромДерево, ДеревоЗначенийКлиенты);
```
---
Зачем здесь первая строка? Ты её нигде не используешь.
ЗначениеВРеквизитФормы(ДеревоЗначенийКлиенты, "ИмяРеквизитаФормыДерева");
---
Верно подметили. Теперь я понял о чём Вы писали. Спасибо за разъяснение.
---
Да. Если устраивает автовыгруженное из запроса дерево - тогда только через ДеревоЗначений. ДанныеФормыДерево "оптом" только через него загружаться умеет. А вот если поэлементное заполнение делать - тогда смысл использовать ДеревоЗначений теряется, если не нужны какие-то особые его методы. Это особенно на клиенте удобно - простые преобразования не требующие обращений к БД можно делать не переходя на сервер, экономя таким образом на серверных вызовах.
---
И у строк с номерами телефонов необязательно заполнять колонку с партнером (он уже есть в родительской строке). Так будет нагляднее.
---
Не понимаю, зачем ДанныеФормыДерево преобразовывать в ДеревоЗначений и потом обратно. Почему напрямую не заполнять ДанныеФормыДерево?
---
Старая привычка работать с деревом через "Строки", а не через "ПолучитьЭлементы()". Функционала больше при работе с деревом, чем при работе с ДаннымиФормы.
---
Старая привычка работать с деревом через "Строки", а не через "ПолучитьЭлементы()"
Можно узнать поподробнее пожалуйста об этом вкратце?
---
О чем? В (16) приведен пример уже простой.
---
В (16) перед этим нужно данные формы дерево значений преобразовать в дерево значений (на сколько я понимаю), а Вы писали, как я понял, о том, что можно заполнить дерево значений формы без преобразований туда-назад в дерево значений. Хотел разобраться как это сделать.
---
Зачем тебе дерево с формы тащить? Ты просто подготавливаешь новое дерево после запроса и кладешь его на место старого на форме.
---
В (16) перед этим нужно данные формы дерево значений преобразовать в дерево значений (на сколько я понимаю)
Вы не правильно понимаете.

Есть 2 варианта работы с деревьями.
1. обычное ДеревоЗначений - строки добавляются через МоеДерево.Строки.Добавить();
2. дерево значений на форме - строки добавляются через ДеревоНаФорме.ПолучитьЭлементы().Добавить();

Все.
---
Потому что сразу не получается записать туда данные.
---
Все просто.

```1c
    НоваяКорневаяСтрока = ДеревоЗначенийКлиенты.ПолучитьЭлементы().Добавить();

    НоваяДетальнаяСтрока = НоваяКорневаяСтрока.ПолучитьЭлементы().Добавить();
```