Подскажите алгоритм, есть таблица аля Колонка кодов План Счетов>вывести список в табличный документ. Как обратно вернуть иерархию в виде дерева значений ?

```1c
    901 " "
    901.1 901
    901.1.1 901.1
    901.2 901
    901.2.1 901.2
    901.2.1.1 901.2.1
    901.2.2 901.2
    901.2.2.1 901.2.2
    901.2.2.2 901.2.2
```

зы: вторая колонка для примера что чему подчинено.
обычные формы
---
На вход подается ТаблицаЗначений с колонкой Код.

```1c
    Функция ПреобразоватьВДерево(ТаблицаЗначений)

    ДеревоЗначений = Новый ДеревоЗначений;
    ДеревоЗначений.Колонки.Добавить("Код");

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

    Возврат ДеревоЗначений;

    КонецФункции
```
---
Работающий пример для номенклатуры:

Запрос:

```1c
    ВЫБРАТЬ
    СписокНоменклатуры.Ссылка КАК Номенклатура
    ИЗ
    Справочник.Номенклатура КАК СписокНоменклатуры

    УПОРЯДОЧИТЬ ПО
    СписокНоменклатуры.Ссылка ИЕРАРХИЯ,
    СписокНоменклатуры.Наименование
```

Обработчик:

```1c
    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();

    ТекущийУровень = 0;
    ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы();

    Пока Выборка.Следующий() Цикл
    УровеньЭлемента = Выборка.Номенклатура.Уровень();
    Если УровеньЭлемента = ТекущийУровень И УровеньЭлемента = 0 Тогда
    ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
    ТекущийУровень = УровеньЭлемента;
    ИначеЕсли УровеньЭлемента = ТекущийУровень Тогда
    ТекЭлемент = ТекЭлемент.ПолучитьРодителя().ПолучитьЭлементы().Добавить();
    ТекущийУровень = УровеньЭлемента;
    ИначеЕсли УровеньЭлемента < ТекущийУровень Тогда
    Если УровеньЭлемента = 0 Тогда
    ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
    Иначе
    КоличествоУровней = ТекущийУровень - УровеньЭлемента;
    Для Н = 0 По КоличествоУровней Цикл
    Если Не ТекЭлемент.ПолучитьРодителя() = Неопределено Тогда
    ТекЭлемент = ТекЭлемент.ПолучитьРодителя();
    КонецЕсли;
    КонецЦикла;
    ТекЭлемент = ТекЭлемент.ПолучитьЭлементы().Добавить();
    КонецЕсли;
    ТекущийУровень = УровеньЭлемента;
    ИначеЕсли УровеньЭлемента > ТекущийУровень Тогда
    ТекЭлемент = ТекЭлемент.ПолучитьЭлементы();
    ТекЭлемент = ТекЭлемент.Добавить();
    ТекущийУровень = УровеньЭлемента;
    КонецЕсли;

    ТекЭлемент.Номенклатура = Выборка.Номенклатура;
    КонецЦикла;
```
---
Была бы иерархия, то можно было бы по группировкам обойти итоги. Увы её и надо получить обходом строк
---
На вход подается ТаблицаЗначений с колонкой Код.

```1c
    Функция ПреобразоватьВДерево(ТаблицаЗначений)

    ДеревоЗначений = Новый ДеревоЗначений;
    ДеревоЗначений.Колонки.Добавить("Код");

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

    Возврат ДеревоЗначений;

    КонецФункции
```
---
Спасибо, то что надо !