Я себе отдельный класс сделал для работы с Дерево+Таблица
// класс ДеревоТаблица:АтрибутФормы
Перем СостояниеУзлов, ТекущийУзел;
//*******************************************************************
Функция я() Возврат глВзятьКонтекст(Контекст); КонецФункции
//*******************************************************************
// возвращает тз указанного пути. Если путь не указан - возвращает тз текущего узла
Функция ПолучитьУзел(Путь = "") Экспорт // ... и установить курсор на текущей строке
Если ПустаяСтрока(Путь) = 1 Тогда Путь = "/" + я().ТекущаяСтрокаДерева(); КонецЕсли;
Дл = СтрДлина(Путь);
Поз = Дл;
Пока Поз > 0 Цикл
Если Сред(Путь, Поз, 1) = "/" Тогда Прервать; КонецЕсли;
Поз = Поз - 1;
КонецЦикла;
Если Поз = 1 Тогда
тз = я().Значение
Иначе
тз = я().ЗначениеИзДерева(Сред(Путь, 2, Поз - 2), 1);
КонецЕсли;
НомСтроки = Число(Прав(Путь, Дл - Поз));
Попытка
тз.ПолучитьСтрокуПоНомеру(НомСтроки);
Исключение
//Сообщить(ОписаниеОшибки() + " / " + ТипЗначенияСтр(тз));
КонецПопытки;
Возврат тз;
КонецФункции
//*******************************************************************
Функция СостояниеУзла(Путь, Флаг = "*") Экспорт // замена одной функцией трех функций ФормЕкс
Если Флаг = "*" Тогда Возврат я().УзелРазвернут(Путь); // вернуть текущее состояние узла
ИначеЕсли ПустоеЗначение(Флаг) = 1 Тогда я().СвернутьУзел(Путь);
Иначе я().РазвернутьУзел(Путь); КонецЕсли;
Возврат "";
КонецФункции
//*******************************************************************
Процедура _РазвернутьВесьУзел(тз, _Путь, СостояниеУзла)
Попытка
тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку() = 1 Цикл
Путь = _Путь + Строка(тз.НомерСтроки);
СостояниеУзла(Путь, СостояниеУзла);
Если СостояниеУзла = 0 Тогда Продолжить; КонецЕсли;
_РазвернутьВесьУзел(тз.ПолучитьЗначение(тз.НомерСтроки, 1), Путь + "/", СостояниеУзла);
КонецЦикла;
Исключение;
КонецПопытки;
КонецПроцедуры
//*******************************************************************
Процедура РазвернутьВесьУзел(Путь = "", СостояниеУзла) Экспорт // развернуть/свернуть все узлы
Если ПустаяСтрока(Путь) = 1 Тогда
_РазвернутьВесьУзел(я().Значение, "", СостояниеУзла);
Иначе
_РазвернутьВесьУзел(я().ЗначениеИзДерева(Путь, 1), Путь + "/", СостояниеУзла);
КонецЕсли;
КонецПроцедуры
//*******************************************************************
Функция НайтиУзел(Значение, ИмяКолонки, Путь = "/") Экспорт
тз = ПолучитьУзел(Путь);
тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку() = 1 Цикл
Если тз.ПолучитьЗначение(тз.НомерСтроки, ИмяКолонки) = Значение Тогда
Возврат Путь + тз.НомерСтроки + "/";
КонецЕсли;
_Путь = НайтиУзел(Значение, ИмяКолонки, Путь + тз.НомерСтроки + "/");
Если ПустаяСтрока(_Путь) = 0 Тогда Возврат _Путь; КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
//*******************************************************************
Функция ТекущийУзел(Путь = "") Экспорт // замена одной функцией двух функций ФормЕкс
Если ПустаяСтрока(Путь) = 0 Тогда
я().УстановитьТекущийУзел(Прав(Путь, СтрДлина(Путь) - 1));
Возврат "";
Иначе
Возврат "/" + я().ТекущаяСтрокаДерева();
КонецЕсли;
КонецФункции
//*******************************************************************
Процедура ЗапомнитьСостояниеУзла(тз, _Путь)
Попытка
тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку() = 1 Цикл
Путь = _Путь + Строка(тз.НомерСтроки);
СостояниеУзла = СостояниеУзла(Путь);
СостояниеУзлов.Установить(Путь, СостояниеУзла);
Если СостояниеУзла = 0 Тогда Продолжить; КонецЕсли;
ЗапомнитьСостояниеУзла(тз.ПолучитьЗначение(тз.НомерСтроки, 1), Путь + "/");
КонецЦикла;
Исключение
КонецПопытки;
КонецПроцедуры
//*******************************************************************
Процедура ЗапомнитьСостояниеУзлов() Экспорт
СостояниеУзлов = СоздатьОбъект("СписокЗначений");
ТекущийУзел = ТекущийУзел();
ЗапомнитьСостояниеУзла(я().Значение, ""); // я().значение = перехваченная тз
КонецПроцедуры
//*******************************************************************
Процедура ВосстановитьСостояниеУзлов() Экспорт
я().Видимость = 0;
Для а = 1 По СостояниеУзлов.РазмерСписка() Цикл
Путь = "";
Значение = СостояниеУзлов.ПолучитьЗначение(а, Путь);
СостояниеУзла(Путь, Значение);
КонецЦикла;
ТекущийУзел(ТекущийУзел);
я().Видимость = 1;
КонецПроцедуры
//*******************************************************************
Функция НовыйУзел(Знач Путь = "") Экспорт // добавить узел по указанному пути и вернуть тз с курсором установленным на новой строке (узле)
тз = ПолучитьУзел(Путь);
тз.НоваяСтрока();
тз1 = СоздатьОбъект("ТаблицаЗначений");
тз.Выгрузить(тз1);
тз1.УдалитьСтроки();
тз.__Потомки = тз1;
Возврат тз;
КонецФункции
//****************************************************************************
Процедура ПерехватитьТЗ(_Конт, ИмяТЗ) Экспорт
я().УстановитьАтрибут(_Конт.Форма, ИмяТЗ);
я().ПерехватитьТаблицуЗначений();
КонецПроцедуры
//****************************************************************************
Процедура Конструктор()
КонецПроцедуры //Конструктор
P.S. В данном классе указание путей отличается наличием "/" впереди - надо иметь в виду.