Имя: Пароль:
1C
1С v8
Рекурсивный вывод строк в дерево значений
,
0 ddron7
 
05.03.15
11:29
Добрый день!
Есть у кого-нибудь пример вывода строк из запроса в дерево значений  для обычной формы.
Спасибо
1 ДенисЧ
 
05.03.15
11:30
Что именно не получается?
Показывай код
2 Wobland
 
05.03.15
11:30
есть. на здоровье. и формы здесь ни при чём
3 chelentano
 
05.03.15
11:31
например: Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)
4 ddron7
 
05.03.15
11:31
код только в процессе созидания. Вопрос вызывает добавление в иерархию новой строки. Или я туплю...
5 fisher
 
05.03.15
11:31
Пример рекурсии для вычисления факториала из плохих учебников уже осилил?
6 ddron7
 
05.03.15
11:31
(3) интересует рекурсия...
7 fisher
 
05.03.15
11:32
(4) Если в запросе используешь ИТОГИ, то обход результатов - это уже обход дерева. Тупо копирование одного дерева в другое.
8 Wobland
 
05.03.15
11:33
(4) чо?
9 ddron7
 
05.03.15
11:37
(8) нужен пример рекурсивного создания дерева значений, т.к. первоначально количество полей в запоросе неизвестно (набор полей меняется от условия).... во загнул...
10 Ёпрст
 
05.03.15
11:38
(9) запрос выгрузить в дерево значений не предлагать ?
11 fisher
 
05.03.15
11:39
(10) Не. Уже предлагали в (3) :)
12 ddron7
 
05.03.15
11:39
(10) нет. Уже так делал.
13 Крошка Ру
 
05.03.15
11:42
14 Ёпрст
 
05.03.15
11:44
(12) а чего не устраивает ?
Ну.. можешь еще выборку с запроса обойти рекурсивно и слепить дерево ручонками.. так что ле хочешь ?
15 fisher
 
05.03.15
11:50
Что-то типа такого (за работоспособность не ручаюсь, набросал на коленке):

Процедура ЗаполнениеДерева(Выборка = Неопределено, СтрокиДерева = Неопределено)

    Если Выборка = Неопределено Тогда
        
        Запрос = Новый Запрос;
        .....................
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Дерево = Новый ДеревоЗначений;
        Для Каждого КолонкаРезультата Из Результат.Колонки Цикл
            Дерево.Колонки.Добавить(КолонкаРезультата.Имя);
        КонецЦикла;
        СтрокиДерева = Дерево.Строки;
    
    КонецЕсли;
    
    Пока Выборка.Следующий() Цикл
        
        СтрокаДерева = СтрокиДерева.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаДерева, Выборка);
        
        ЗаполнениеДерева(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам), СтрокаДерева.Строки);
    
    КонецЦикла;

КонецПроцедуры
16 fisher
 
05.03.15
11:59
Тьфу, дерево вернуть забыл :)
17 GANR
 
05.03.15
12:08
18 GANR
 
05.03.15
12:09
(15) А вот это

Если Выборка = Неопределено Тогда        
        Запрос = Новый Запрос;
        ....................
КонецЕсли;

надо вынести ЗА рамки рекурсивной процедуры.
19 Ёпрст
 
05.03.15
12:11
(18) зачем ?
20 fisher
 
05.03.15
12:13
(18) С одной стороны как бы да. Так типа логичней и читабельней. А с другой, если это монолитный логический блок без переиспользования, то разнесение его по нескольким процедурам тоже снижает читабельность.
21 fisher
 
05.03.15
12:23
(17) Годная тема. Но на практике размеры деревьев ограничены, а рекурсия красивше и лаконичнее. Вот всякие факториалы считать рекурсивно - это да, смерти подобно. А во "взрослых" языках хвостовая рекурсия заменяется на циклы автоматически на этапе компиляции.