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