В одной из публикаций на сайте встретилась задача преобразовать таблицу с колонками Родитель, Потомок в дерево значений. Сочинил следующий код:
Функция РекурсивноеПостроение(Знач вхРодитель,д,дз)
приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
вхРодитель=узел.Потомок;
д.Удалить(узел);
куда=приемник.Строки.Добавить();
куда.Ч=вхРодитель;
РекурсивноеПостроение(вхРодитель,д,дз)
конеццикла;
КонецФункции
Функция ПостроитьДерево() экспорт
//подготовка исходных данных
д=новый ТаблицаЗначений;
тЧисло=новый ОписаниеТипов("Число");
д.Колонки.Добавить("Потомок",тЧисло);
д.Колонки.Добавить("Родитель",тЧисло);
н=0;
для каждого запись из СтрРазделить("1,10,4,1,7,4,2,10,3,2,5,2,6,5",",") цикл
если н=0 тогда
приемник=д.Добавить();
приемник.Потомок=число(запись);
иначе
приемник.Родитель=число(запись);
конецесли;
н=(н+1)%2
конеццикла;
//код заполнения дерева
дз=новый деревозначений;
дз.Колонки.Добавить("Ч");
для каждого запись из д цикл
найти=д.Найти(запись.Родитель,"Потомок");
если найти=неопределено тогда //это корневой узел
приемник=дз.Строки.Добавить();
приемник.Ч=запись.Родитель;
РекурсивноеПостроение(приемник.Ч,д,дз)
конецесли;
конеццикла;
возврат дз;
КонецФункции
суть рекурсии? в том что от текущего элемента(строки) продолжаете обработку,
в вашем коде можно/нужно убрать поиск строки дерева, примерно так
&НаСервере
Процедура РекурсивноеПостроение(Знач вхРодитель,д,дз)
//приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
приемник=дз;
для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
вхРодитель=узел.Потомок;
д.Удалить(узел);
куда=приемник.Строки.Добавить();
куда.Ч=вхРодитель;
РекурсивноеПостроение(вхРодитель,д,куда);//дз);
конеццикла;
КонецПроцедуры
(18) Он не правильный с точки зрения рекурсии, так как мы повторяем код, который по сути уже есть в рекурсии.
Изначально мне трудно представить такие исходные данные.
Метод Найти, насколько знаю, не использует индексы.