Сложно себе представить ситуацию, когда бы понадобились подобные функции, но и тем не менее такой момент настал. Встала необходимость анализа уже собранных данных из "Дерева значений", а так же их доработка. После доработки данные нужно обратно загрузить в Дерево. Вот такая специфическая задача.
Глянув в интернете не нашел достойной реализации по этому представляю свой вариант ниже.
Метод получения Таблицы значений из Дерева значений
// Преобразование ДеревоЗначений в ТаблицаЗначений
Функция ДеревоЗначенийВТаблицуЗначений(ДеревоЗначений, ДобавлятьКолонкуУровня = Истина) Экспорт
ТаблицаЗначений = Новый ТаблицаЗначений;
// Копируем колонки из дерева
Для Каждого Колонка Из ДеревоЗначений.Колонки Цикл
НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок);
НоваяКолонка.Ширина = Колонка.Ширина;
КонецЦикла;
// Добавляем служебные колонки для восстановления структуры
ТаблицаЗначений.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("УникальныйИдентификатор"));
ТаблицаЗначений.Колонки.Добавить("ИдентификаторРодителя", Новый ОписаниеТипов("УникальныйИдентификатор"));
Если ДобавлятьКолонкуУровня Тогда
ТаблицаЗначений.Колонки.Добавить("УровеньБаза", Новый ОписаниеТипов("Число"));
КонецЕсли;
// Рекурсивно обходим дерево и заполняем таблицу
ОбойтиСтрокиДерева(ДеревоЗначений.Строки, ТаблицаЗначений, Неопределено, 0, ДобавлятьКолонкуУровня);
Возврат ТаблицаЗначений;
КонецФункции
// Вспомогательная процедура для рекурсивного обхода дерева
Процедура ОбойтиСтрокиДерева(СтрокиДерева, ТаблицаЗначений, ИдентификаторРодителя, УровеньБаза, ДобавлятьКолонкуУровня)
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
ИдентификаторТекущейСтроки = Новый УникальныйИдентификатор;
// Копируем данные из строки дерева
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Колонка.Имя <> "ИдентификаторСтроки"
И Колонка.Имя <> "ИдентификаторРодителя"
И Колонка.Имя <> "УровеньБаза" Тогда
НоваяСтрока[Колонка.Имя] = СтрокаДерева[Колонка.Имя];
КонецЕсли;
КонецЦикла;
// Заполняем служебные поля
НоваяСтрока.ИдентификаторСтроки = ИдентификаторТекущейСтроки;
НоваяСтрока.ИдентификаторРодителя = ИдентификаторРодителя;
Если ДобавлятьКолонкуУровня Тогда
НоваяСтрока.УровеньБаза = УровеньБаза;
КонецЕсли;
// Рекурсивно обрабатываем дочерние строки
Если СтрокаДерева.Строки.Количество() > 0 Тогда
ОбойтиСтрокиДерева(СтрокаДерева.Строки, ТаблицаЗначений, ИдентификаторТекущейСтроки, УровеньБаза + 1, ДобавлятьКолонкуУровня);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Метод получения Дерева значений из Таблицы значений
// ИСПРАВЛЕННАЯ функция преобразования ТаблицаЗначений в ДеревоЗначений
Функция ТаблицуЗначенийВДеревоЗначений(ТаблицаЗначений) Экспорт
ДеревоЗначений = Новый ДеревоЗначений;
// Копируем колонки (исключая служебные)
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Колонка.Имя <> "ИдентификаторСтроки"
И Колонка.Имя <> "ИдентификаторРодителя"
И Колонка.Имя <> "УровеньБаза" Тогда
НоваяКолонка = ДеревоЗначений.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок);
НоваяКолонка.Ширина = Колонка.Ширина;
КонецЕсли;
КонецЦикла;
// Создаем соответствие для быстрого поиска строк по идентификатору
СоответствиеСтрок = Новый Соответствие;
// УБРАЛ сортировку - обрабатываем строки в исходном порядке!
// Обрабатываем все строки в исходном порядке
Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
Если СтрокаТаблицы.ИдентификаторРодителя = Неопределено Тогда
// Корневая строка
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
Иначе
// Ищем родительскую строку
СтрокаРодитель = СоответствиеСтрок[СтрокаТаблицы.ИдентификаторРодителя];
Если СтрокаРодитель <> Неопределено Тогда
НоваяСтрока = СтрокаРодитель.Строки.Добавить();
Иначе
// Если родитель не найден, создаем как корневую
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
КонецЕсли;
КонецЕсли;
// Копируем данные
Для Каждого Колонка Из ДеревоЗначений.Колонки Цикл
НоваяСтрока[Колонка.Имя] = СтрокаТаблицы[Колонка.Имя];
КонецЦикла;
// Сохраняем соответствие для поиска дочерних строк
СоответствиеСтрок.Вставить(СтрокаТаблицы.ИдентификаторСтроки, НоваяСтрока);
КонецЦикла;
Возврат ДеревоЗначений;
КонецФункции
// УЛУЧШЕННАЯ альтернативная функция преобразования через уровни
Функция ТаблицуЗначенийВДеревоЗначенийПоУровням(ТаблицаЗначений) Экспорт
ДеревоЗначений = Новый ДеревоЗначений;
// Копируем колонки (исключая служебные)
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Колонка.Имя <> "ИдентификаторСтроки"
И Колонка.Имя <> "ИдентификаторРодителя"
И Колонка.Имя <> "УровеньБаза" Тогда
НоваяКолонка = ДеревоЗначений.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок);
НоваяКолонка.Ширина = Колонка.Ширина;
КонецЕсли;
КонецЦикла;
// Проверяем наличие колонки УровеньБаза
КолонкаУровня = ТаблицаЗначений.Колонки.Найти("УровеньБаза");
Если КолонкаУровня = Неопределено Тогда
// Если нет колонки уровня, используем основную функцию
Возврат ТаблицуЗначенийВДеревоЗначений(ТаблицаЗначений);
КонецЕсли;
// УБРАЛ сортировку - сохраняем исходный порядок строк!
// Используем соответствие для поиска строк по идентификатору
СоответствиеСтрок = Новый Соответствие;
Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
УровеньБаза = СтрокаТаблицы.УровеньБаза;
Если УровеньБаза = 0 Тогда
// Корневая строка
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
Иначе
// Ищем родительскую строку по идентификатору
СтрокаРодитель = СоответствиеСтрок[СтрокаТаблицы.ИдентификаторРодителя];
Если СтрокаРодитель <> Неопределено Тогда
НоваяСтрока = СтрокаРодитель.Строки.Добавить();
Иначе
// Если родитель не найден, создаем как корневую
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
КонецЕсли;
КонецЕсли;
// Копируем данные
Для Каждого Колонка Из ДеревоЗначений.Колонки Цикл
НоваяСтрока[Колонка.Имя] = СтрокаТаблицы[Колонка.Имя];
КонецЦикла;
// Сохраняем соответствие для поиска дочерних строк
СоответствиеСтрок.Вставить(СтрокаТаблицы.ИдентификаторСтроки, НоваяСтрока);
КонецЦикла;
Возврат ДеревоЗначений;
КонецФункции
Также отмечу, что решение внедрено в реальную базу, оно рабочее, так что пользуйтесь. )