Необходимо в текущую строку дерева значений записать данные в процедуре с директивой На сервере. В ОФ работает

```1c
    Элементы.ДеревоДокументов.ТекущаяСтрока = мДерево;
```

В уф падает: "Ошибка передачи данных между клиентом и сервером. Отсутствует отображение для типа 'СтрокаДереваЗначений'".
Падает при открытии формы, обработки запускаются в ПриСозданииНаСервере.
мДерево - строка дерева значений, как ее добавить в дерево значений на сервере?
Заранее спасибо!
---
Плохая идея с идентификатором.

Попробуйте так:

```1c
    &НаСервере
    Перем ТекСтрока;

    &НаСервере
    Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
    ///.......................................
    Если СписокРеквизитов.Количество() = 1 Тогда
    ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов);
    ТекСтрока = ДеревоДокументов;
    КонецЕсли;

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

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Строка.Ссылка= Выборка.Ссылка;
    Строка.Проведен = Выборка.Проведен;
    Строка.ПометкаУдаления = Выборка.ПометкаУдаления;
    Строка.ДокументПредставление = Выборка.Представление;
    Строка.СуммаДокумента = Выборка.СуммаДокумента;
    Строка.ВалютаДокумента = Выборка.ВалютаДокумента;
    Строка.ВидДокумента = Выборка.Метаданные;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    Иначе
    Строка.Ссылка= ДокументСсылка;
    Строка.ДокументПредставление = Строка(ДокументСсылка);
    Строка.СуммаДокумента = ДокументСсылка.СуммаДокумента;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    КонецЕсли;
    КонецПроцедуры
```
---
А где вы строку дерева добыли?
---
Идентификатор = Элементы.ДеревоДокументов.ТекущаяСтрока
ДобавитьНаСервере(Идентификатор)

процедура ДобавитьНаСервере(Идентификатор)
ДанныеДерева = деревоДокументов.НайтиПоИдентификатору(Идентификатор)
ПодчиненнаяСтрока = ДанныеДерева.ПолучитьЭлементы().добавить();
---
Идентификатор = Элементы.ДеревоДокументов.ТекущаяСтрока это же на клиенте?
Мне необходимо получить родителя (подойдет просто последняя строка, ее и буду брать за родителя) на сервере(
---
Получить родителя от текущей строки?
---
Я добился иерархии в дереве значений, но только в строке дерева значений. Т.е. у меня тип значения "СтрокаДереваЗначений", значение в отладчике раскрывается иерархией. Как мне теперь На Сервере записать эту строку в дерево значений ?
Пытаюсь вот так, но дерево пустое:

```1c
    //Вот тут я получаю строку (к сожалению, если сразу в реквизит формы (дерево) записывать, не получается добиться иерархии, так как при новом обращении к реквизиту через "РеквизитФормыВЗначение" не виден родитель, т.е. записывается новая строка, а не подстрока)

    Дерево = ВывестиРодительскиеДокументы(ДокументСсылка);

    тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
    Строка = тДерево.Строки.Добавить();
    Строка = Дерево;
    ЗначениеВРеквизитФормы(Дерево,"ДеревоДокументов");
```

Прошу помочь, не исключаю, что делаю какую-то глупость...
---
К чему сейчас пришел:

```1c
    Строка = ВывестиРодительскиеДокументы(ДокументСсылка);

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

    СтрокаДерева = тДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаДерева,Строка);

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

Но дерево выводится без иерархии, в "Строка" иерархия есть, но в "СтрокаДерево" помещается без иерархии
---
Покажи полный код.
---
```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.ДокументСсылка = Неопределено ИЛИ Параметры.ДокументСсылка.Пустая() Тогда
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    ДокументСсылка = Параметры.ДокументСсылка;
    мУжеВСписке = Новый Соответствие;
    мКэшРеквизитовДокумента = Новый Соответствие;
    мКэшПраваДоступаКМетаданным = Новый Соответствие;
    ВывестиДеревоДокументов(); //!!!
    КонецПроцедуры

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

    //Если Дерево - дерево, то возвращается без иерархии
    //Если Дерево - строка дерева, то возвращается с нужной правильной иерархией, но в таком случае не получается строку
    //поместить в дерево реквизит формы

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

    &НаСервере
    Функция ВывестиРодительскиеДокументы(ДокументСсылка)

    МетаданныеДокумента = ДокументСсылка.Метаданные();
    СписокРеквизитов = Новый СписокЗначений;
    МетаданныеДокументы = Метаданные.Документы;
    мКэшМетаданныеРеквизита = новый соответствие;

    Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
    ТипыРеквизита = Реквизит.Тип.Типы();
    Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
    МетаданныеРеквизита = мКэшМетаданныеРеквизита.Получить(ТекущийТип);
    Если МетаданныеРеквизита = неопределено Тогда
    МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
    мКэшМетаданныеРеквизита.Вставить(ТекущийТип,МетаданныеРеквизита);
    КонецЕсли;

    Если МетаданныеРеквизита<>Неопределено
    И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
    Попытка
    ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
    Исключение
    Прервать;
    КонецПопытки;
    ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
    И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
    Попытка
    СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
    Исключение
    ОтладкаТекстОшибки = ОписаниеОшибки();
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;
    КонецЦикла;

    Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
    СтрРеквизитов = ";

    Попытка
    СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
    Исключение
    Прервать;
    КонецПопытки;

    Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
    ТипыРеквизита = Реквизит.Тип.Типы();
    Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
    МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
    Если МетаданныеРеквизита<>Неопределено И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
    СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = ", ", ", ") + Реквизит.Имя;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

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

    ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
    И МетаданныеДокументы.Содержит(МетаданныеЗначения)
    И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
    Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
    Попытка
    СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
    Исключение
    ОтладкаТекстОшибки = ОписаниеОшибки();
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    СписокРеквизитов.СортироватьПоПредставлению();
    мУжеВСписке.Вставить(ДокументСсылка, Истина);

    Если СписокРеквизитов.Количество() = 1 Тогда
    Родитель = ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение); //Вот тут рекурсия
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    Родитель = ВывестиБезРодителей(СписокРеквизитов); //Вывожу верхние элементы. Если возвращаю дерево, то*
    КонецЕсли;

    СтрокаРодителя = Родитель.Строки.Добавить(); //*вот здесь строка ставится новой строкой из-за этого нет иерархии, если
    //возвращаю строку, то здесь в строке есть последний добавленный элемент,
    //который является родителем и далее при завершении предыдущих вызовов
    //элементы становятся дочерними

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда

    СтрокаРодителя.Ссылка= Выборка.Ссылка;
    СтрокаРодителя.Проведен = Выборка.Проведен;
    СтрокаРодителя.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаРодителя.ДокументПредставление = Выборка.Представление;
    СтрокаРодителя.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаРодителя.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаРодителя.ВидДокумента = Выборка.Метаданные;
    Иначе
    СтрокаРодителя.Ссылка= ДокументСсылка;
    СтрокаРодителя.ДокументПредставление = Строка(ДокументСсылка);
    СтрокаРодителя.СуммаДокумента = ДокументСсылка.СуммаДокумента;
    КонецЕсли;
    Возврат Родитель;
    //Возврат СтрокаРодителя;
    КонецФункции

    &НаСервере
    Функция ВывестиБезРодителей(СписокДокументов)

    Дерево = Новый ДеревоЗначений;
    МассивТипов = Новый Массив;
    МассивТиповВалюты = Новый Массив;
    МассивТиповВалюты.Добавить(Тип("СправочникСсылка.Валюты"));
    Дерево.Колонки.Добавить("СуммаДокумента", Новый ОписаниеТипов("Число"));
    Дерево.Колонки.Добавить("ДокументПредставление", Новый ОписаниеТипов("Строка"));
    Дерево.Колонки.Добавить("ВидДокумента", Новый ОписаниеТипов("Строка"));
    Дерево.Колонки.Добавить("Ссылка", Новый ОписаниеТипов(МассивТипов));
    Дерево.Колонки.Добавить("ПометкаУдаления", Новый ОписаниеТипов("Булево"));
    Дерево.Колонки.Добавить("ОграничениеПоРодителям", Новый ОписаниеТипов("Булево"));
    Дерево.Колонки.Добавить("Проведен", Новый ОписаниеТипов("Булево"));
    Дерево.Колонки.Добавить("ВалютаДокумента", Новый ОписаниеТипов(МассивТиповВалюты));

    Для Каждого ЭлементСписка Из СписокДокументов Цикл

    МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);

    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

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

    Выборка = Запрос.Выполнить().Выбрать();
    ЕСли Выборка.Следующий() Тогда
    Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
    СтрокаДерева = Дерево.Строки.Добавить();

    //тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
    //СтрокаДерева = тДерево.Строки.Добавить();
    ////СтрокаДерева = мДерево.Строки.Добавить();
    СтрокаДерева.Ссылка= Выборка.Ссылка;
    СтрокаДерева.Проведен = Выборка.Проведен;
    СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаДерева.ДокументПредставление = Выборка.Представление;
    СтрокаДерева.ВидДокумента = Выборка.Метаданные;
    СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаДерева.ОграничениеПоРодителям = Истина;
    //ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат Дерево;
    //Возврат СтрокаДерева;
    КонецФункции
```
---
Примерно так:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.ДокументСсылка = Неопределено ИЛИ Параметры.ДокументСсылка.Пустая() Тогда
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    ДокументСсылка = Параметры.ДокументСсылка;
    мУжеВСписке = Новый Соответствие;
    мКэшРеквизитовДокумента = Новый Соответствие;
    мКэшПраваДоступаКМетаданным = Новый Соответствие;
    ВывестиДеревоДокументов(); //!!!
    КонецПроцедуры

    &НаСервере
    Процедура ВывестиДеревоДокументов()

    ВывестиРодительскиеДокументы(ДокументСсылка);

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

    &НаСервере
    Функция ВывестиРодительскиеДокументы(ДокументСсылка)

    МетаданныеДокумента = ДокументСсылка.Метаданные();
    СписокРеквизитов = Новый СписокЗначений;
    МетаданныеДокументы = Метаданные.Документы;
    мКэшМетаданныеРеквизита = новый соответствие;

    Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
    ТипыРеквизита = Реквизит.Тип.Типы();
    Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
    МетаданныеРеквизита = мКэшМетаданныеРеквизита.Получить(ТекущийТип);
    Если МетаданныеРеквизита = неопределено Тогда
    МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
    мКэшМетаданныеРеквизита.Вставить(ТекущийТип,МетаданныеРеквизита);
    КонецЕсли;

    Если МетаданныеРеквизита<>Неопределено
    И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
    Попытка
    ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
    Исключение
    Прервать;
    КонецПопытки;
    ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
    И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
    Попытка
    СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
    Исключение
    ОтладкаТекстОшибки = ОписаниеОшибки();
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;
    КонецЦикла;

    Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
    СтрРеквизитов = ";

    Попытка
    СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
    Исключение
    Прервать;
    КонецПопытки;

    Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
    ТипыРеквизита = Реквизит.Тип.Типы();
    Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
    МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
    Если МетаданныеРеквизита<>Неопределено И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
    СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = ", ", ", ") + Реквизит.Имя;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

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

    ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
    И МетаданныеДокументы.Содержит(МетаданныеЗначения)
    И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
    Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
    Попытка
    СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
    Исключение
    ОтладкаТекстОшибки = ОписаниеОшибки();
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    СписокРеквизитов.СортироватьПоПредставлению();
    мУжеВСписке.Вставить(ДокументСсылка, Истина);

    Если СписокРеквизитов.Количество() = 1 Тогда
    Родитель = ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение); //Вот тут рекурсия
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов); //Вывожу верхние элементы. Если возвращаю дерево, то*
    Родитель = ДеревоДокументов;
    КонецЕсли;

    СтрокаРодителя = Родитель.ПолучитьЭлементы().Добавить(); //*вот здесь строка ставится новой строкой из-за этого нет иерархии, если
    //возвращаю строку, то здесь в строке есть последний добавленный элемент,
    //который является родителем и далее при завершении предыдущих вызовов
    //элементы становятся дочерними

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда

    СтрокаРодителя.Ссылка= Выборка.Ссылка;
    СтрокаРодителя.Проведен = Выборка.Проведен;
    СтрокаРодителя.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаРодителя.ДокументПредставление = Выборка.Представление;
    СтрокаРодителя.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаРодителя.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаРодителя.ВидДокумента = Выборка.Метаданные;
    Иначе
    СтрокаРодителя.Ссылка= ДокументСсылка;
    СтрокаРодителя.ДокументПредставление = Строка(ДокументСсылка);
    СтрокаРодителя.СуммаДокумента = ДокументСсылка.СуммаДокумента;
    КонецЕсли;
    Возврат Родитель;
    //Возврат СтрокаРодителя;
    КонецФункции

    &НаСервере
    Процедура ВывестиБезРодителей(СписокДокументов)

    МассивТипов = Новый Массив;

    Для Каждого ЭлементСписка Из СписокДокументов Цикл

    МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);

    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

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

    Выборка = Запрос.Выполнить().Выбрать();
    ЕСли Выборка.Следующий() Тогда
    Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
    СтрокаДерева = ДеревоДокументов.ПолучитьЭлементы().Добавить();

    СтрокаДерева.Ссылка= Выборка.Ссылка;
    СтрокаДерева.Проведен = Выборка.Проведен;
    СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаДерева.ДокументПредставление = Выборка.Представление;
    СтрокаДерева.ВидДокумента = Выборка.Метаданные;
    СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаДерева.ОграничениеПоРодителям = Истина;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
```1c
    Если СписокРеквизитов.Количество() = 1 Тогда
    ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов);
    Родитель = ДеревоДокументов;
    КонецЕсли;

    СтрокаРодителя = Родитель.Строки.Добавить();
```

Вот так ошибка: Поле объекта не обнаружено (Строки)
т.к. это ДанныеФормыДерево

А если вот так, то выводит без иерархии:

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

Заменил на

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

Теперь выводит с иерархией, но очень странно, родитель - пустая строка. (На скрине сверху что получилось, снизу к чему надо придти)
Могу получить последний элемент. Может быть можно как-то от него "двигаться" ?
---
СтрокаРодителя = Родитель.Строки.Добавить();
Замените на

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

В моем примере это так указано. Если у вас не так, значит не все изменения перенесли.
---
К сожалению, не получается...
Дело в том, что при "остаточном" выполнении кода (не знаю, как назвать правильно), когда продолжает двигаться тот код, который вызвал рекурсию в условии, и в "ИначеЕсли" он не попадает, поэтому сначала Родитель - ДанныеФормыДерево, а потом уже Не определено.

```1c
    Родитель = ДеревоДокументов;
    КонецЕсли;

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

Вынес за условие:

```1c
    Если СписокРеквизитов.Количество() = 1 Тогда
    ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов);
    //Родитель = ДеревоДокументов;
    КонецЕсли;
    Родитель = ДеревоДокументов;
    СтрокаРодителя = Родитель.ПолучитьЭлементы().Добавить();
```

И в таком случае не получается иерархии в дереве.
---
К чему я сейчас пришел)

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

Есть иерархия, но создается пустая строка, и каждый след элемент наследуется от новой пустой строки.
Почему-то во время завершения старых вызовов количество элементов дерева не меняется (2), хотя я могу получить по идентификатору и 3-й (пустая строка) и 4-й и 5-й (пустая строка).

Думал сделать счетчик в выборке, и раз не увеличивается количество элементов, то могу прибавлять счетчик из идентификатора - но он тоже обнуляется при завершении предыдущих вызовов...
---
Дорогой дневник..))))
В общем, есть сдвиги, осталось разобраться, почему пустые строки добавляются...

```1c
    Перем Сч;

    &НаСервере
    Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
    ///.......................................
    Если СписокРеквизитов.Количество() = 1 Тогда
    ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов);
    КонецЕсли;
    Родитель = ДеревоДокументов;
    Количество = ДеревоДокументов.ПолучитьЭлементы().Количество();
    Индентификатор = ДеревоДокументов.ПолучитьЭлементы().Количество() - 1 + Сч;

    Строка = ДеревоДокументов.НайтиПоИдентификатору(Индентификатор).ПолучитьЭлементы().Добавить();
    //ПодстрокаРодителя = Строка.ПолучитьЭлементы().Добавить();

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Строка.Ссылка= Выборка.Ссылка;
    Строка.Проведен = Выборка.Проведен;
    Строка.ПометкаУдаления = Выборка.ПометкаУдаления;
    Строка.ДокументПредставление = Выборка.Представление;
    Строка.СуммаДокумента = Выборка.СуммаДокумента;
    Строка.ВалютаДокумента = Выборка.ВалютаДокумента;
    Строка.ВидДокумента = Выборка.Метаданные;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    Сч = Сч + 2;
    Иначе
    Строка.Ссылка= ДокументСсылка;
    Строка.ДокументПредставление = Строка(ДокументСсылка);
    Строка.СуммаДокумента = ДокументСсылка.СуммаДокумента;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    Сч = Сч + 2;
    КонецЕсли;
    КонецПроцедуры
```
---
Плохая идея с идентификатором.

Попробуйте так:

```1c
    &НаСервере
    Перем ТекСтрока;

    &НаСервере
    Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
    ///.......................................
    Если СписокРеквизитов.Количество() = 1 Тогда
    ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
    ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
    ВывестиБезРодителей(СписокРеквизитов);
    ТекСтрока = ДеревоДокументов;
    КонецЕсли;

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

    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, "" + МетаданныеДокумента.Имя + "" КАК Метаданные
    | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");

    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
    КонецЕсли;

    Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
    КонецЕсли;

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

```1c
    &НаСервере
    Перем ТекСтрока;
```
---
Пора уже деньги брать за обучение.
---
Спасибо огромное, иерархия получилась! Корнем выбран другой элемент, но суть я уловил, спасибо огромное!
---
Если ТекСтрока = Неопределено Тогда
    Строка = ДеревоДокументов.ПолучитьЭлементы().Добавить();
Иначе
    Строка = ТекСтрока.ПолучитьЭлементы().Добавить();
КонецЕсли;
ТекСтрока = Строка; Какой красивый код... Туева хуча букв вместо нескольки.
---
Сч = Сч + 2; Че так? Че не 8?
---
эксперименты в виду пустых строк
---
помогает?
---
увы
---
Добавил:

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

Получилось убрать первую пустую, но дальше дочерние так и "цепляются" за пустые строки.
Почему-то количество элементов в дереве не меняется...
---
Попробуйте присвоить идентификатор этой строки

Из справки:
ТекущаяСтрока (CurrentRow)
Использование:
Чтение и запись.
Описание:
Тип: Произвольный.
Идентификатор текущей строки таблицы.
---
Получилось так

```1c
    тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
    СтрокаДерева = тДерево.Строки.Добавить();
    СтрокаДерева = мДерево;
    ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
```
---
Проблема, что добавились просто как строки.. без подчинения.
2 - как в оф
1 - то что получается(((
---
Для иерархии, надо добавлять строку не в корень, а в другую строку.
---
Прошу Вас помочь, не могу разобраться...
ОФ:

```1c
    .....
    //В процедуре 1
    Выборка = Запрос.Выполнить().Выбрать();
    СтрокаДерева = мДерево.Строки.Добавить();

    Если Выборка.Следующий() Тогда
    СтрокаДерева.Ссылка= Выборка.Ссылка;
    СтрокаДерева.Проведен = Выборка.Проведен;
    СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаДерева.ДокументПредставление = Выборка.Представление;
    СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаДерева.ВидДокумента = Выборка.Метаданные;
    Иначе
    СтрокаДерева.Ссылка= ДокументСсылка;
    СтрокаДерева.ДокументПредставление = Строка(ДокументСсылка);
    СтрокаДерева.СуммаДокумента = ДокументСсылка.СуммаДокумента;
    КонецЕсли;

    мДерево = СтрокаДерева;

    // В процедуре 2
    ЕСли Выборка.Следующий() Тогда
    Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
    СтрокаДерева = мДерево.Строки.Добавить();
    СтрокаДерева.Ссылка= Выборка.Ссылка;
    СтрокаДерева.Проведен = Выборка.Проведен;
    СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
    СтрокаДерева.ДокументПредставление = Выборка.Представление;
    СтрокаДерева.ВидДокумента = Выборка.Метаданные;
    СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
    СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
    СтрокаДерева.ОграничениеПоРодителям = Истина;
    мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    мДерево = СтрокаДерева;

    //В выводе
    мДерево = ДеревоДокументов;
    Процедура 1
    Процедура 2
    ЭлементыФормы.ДеревоДокументов.ТекущаяСтрока = мДерево;
```

Пытаюсь переделать на УФ:

```1c
    тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
    СтрокаДерева = тДерево.Строки.Добавить();
    ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
```

Но в таком случае не получается иерархии.
в ОФ в переменную, которая везде доступна записывается строка дерева значений с иерархией, а потом в дерево значений формы записывается получившаяся строка

Если так же пытаюсь через переменную, то в УФ пишет Поле объекта не обнаружено (Строки) у этой переменной...
---
Добавить строку в дерево в управляемую форму:

```1c
    НоваяСтрокаКорня = ДеревоДокументов.ПолучитьЭлементы().Добавить();
    //тут заполнить значения реквизитов строки дерева
    ПодчиненнаяСтрока = НоваяСтрокаКорня.ПолучитьЭлементы().Добавить();
    //тут заполнить значения реквизитов строки дерева
```
---
в ОФ в переменную, которая везде доступна записывается строка дерева значений с иерархией, а потом в дерево значений формы записывается получившаяся строка
Это не так работает.

```1c
    ЭлементыФормы.ДеревоДокументов.ТекущаяСтрока = мДерево;
```

Это просто позиционирование - то есть делается текущей нужная строка дерева.

Заполнение дерева выполняется при добавлении строк в мДерево.
---
Спасибо Вам большое! А Вы не могли бы еще подсказать, пожалуйста, почему после завершения процедуры код прыгает на строку "ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);" ?
---
Потому что процедура вызывается несколько раз.
---
Не понимаю где...
---
Спасибо за наводку, это завершаются предыдущие вызовы
---
Пора бы уже определиться - либо работать с деревом значений на сервере, либо работать с КоллекциейФормы, которая имеет тип дерево значений.
А то вы тут все в кучу намешали.

Да еще и запросы в рекурсии... А если есть запросы - то и нефиг использовать клиент-серверные методы вида ПолучитьЭлементы(), а надо работать сразу с универсальной коллекцией ДеревоЗначений на сервере.
---
Спасибо, рад любым наводкам.