Имя: Пароль:
1C
 
Использование дерева значений и рекурсии при формировании отчета
0 Феликс
 
02.07.08
17:55
1. Что хитрого надо добавить в запрос, что бы при выгрузке формировалось многоуровневое дерево? (простой запрос к одному регистру накопления с 4 измерениями ну и соответсвенно с 4 группировками)

2. Как правильно обходить такое дерево с помощью рекурсивной функции вывода инфы(инфа типа приход, расход и тд) в отчет (с кнопочками "+" по 4 группировкам)

3. Как должна выглядить такая функция?

4. Дайте плиз сцылку куда-нить, где хорошо расписано устройство деревьев в 1с 8 и примеры работы с ними.
1 YauheniL
 
02.07.08
17:57
(0) на 1: Итоги (не общие) -- получишь дерево с плюсиками. Надо добавлять не в суммируемые поля, а в группировочные.
   на 2: такое дерево правильно обходить рекурсивно
   на 3: как-то так
Функция МояФункция()
   МояФункция()
КонецФункции
2 Феликс
 
02.07.08
18:18
а в типовых такой подход где-нить используется?
3 dimoff
 
02.07.08
18:20
Какая рекурсия, вы о чем. Итоги в запросе с указанием каждого измерения и в прямом обходе считываем уровень строки(не помню точно метод), восьмерки под рукой нет.
4 dimoff
 
02.07.08
18:21
Если деоево в итоге, то простая выгрузка запроса в дерево значений
5 Феликс
 
02.07.08
18:34
во клево. вроде как получил деревце многоуровневое.

расскажите плиз как этот обход организовать?
вот у меня ща есть выгрузка. выгрузка.строки - 45 записей по одному заказу каждая. выгрузка.строки[0].строки - типа 5 записей по номенклатуркам в предлах одного заказа. Вобщем все здорово, но только как этот рекурсивный обход организуется? )
6 Феликс
 
02.07.08
18:36
2 dimoff: это условие моего РП - вывод инфы в макет рекурсией
7 shuhard
 
02.07.08
18:39
(5) создай отчет по Рг с отключенным построителем отчетов - все увидишь
ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

   ВыборкаОбщийИтог.Следующий();        // Общий итог
   ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
   ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());

   ВыборкаНоменклатура = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

   Пока ВыборкаНоменклатура.Следующий() Цикл
       ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
       ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());

       ВыборкаХарактеристикаНоменклатуры = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

       Пока ВыборкаХарактеристикаНоменклатуры.Следующий() Цикл
           ОбластьХарактеристикаНоменклатуры.Параметры.Заполнить(ВыборкаХарактеристикаНоменклатуры);
           ТабДок.Вывести(ОбластьХарактеристикаНоменклатуры, ВыборкаХарактеристикаНоменклатуры.Уровень());

           ВыборкаСерияНоменклатуры = ВыборкаХарактеристикаНоменклатуры.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

           Пока ВыборкаСерияНоменклатуры.Следующий() Цикл
               ОбластьСерияНоменклатуры.Параметры.Заполнить(ВыборкаСерияНоменклатуры);
               ТабДок.Вывести(ОбластьСерияНоменклатуры, ВыборкаСерияНоменклатуры.Уровень());

               ВыборкаКачество = ВыборкаСерияНоменклатуры.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

               Пока ВыборкаКачество.Следующий() Цикл
                   ОбластьКачество.Параметры.Заполнить(ВыборкаКачество);
                   ТабДок.Вывести(ОбластьКачество, ВыборкаКачество.Уровень());

                   ВыборкаСклад = ВыборкаКачество.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

                   Пока ВыборкаСклад.Следующий() Цикл
                       ОбластьСклад.Параметры.Заполнить(ВыборкаСклад);
                       ТабДок.Вывести(ОбластьСклад, ВыборкаСклад.Уровень());
                   КонецЦикла;
               КонецЦикла;
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
8 Феликс
 
02.07.08
19:14
Вот как бы... в ситуации не знания что у тя дерева... впринципе я так догадываюсь можно получить сущность узла по его уровню и выгрузка.колонки.
Тока как это сделать? тобишь, к примеру, я вот узнаю программно, что я нахожусь на 3-ем уровне дерева и знаю что у меня выгрузка.колонки[2 или блин 3] номенклатура, как бы мне вытащить из переменной строкиУ (собсвенно коллеция строк узла третего уровная) ссылку на эту номенклатуру?
9 shuhard
 
02.07.08
19:16
(8) ты всерьез полагаешь, что подобного рода ТЗ кто-то станет читать ?
10 Феликс
 
02.07.08
19:30
я всерьез полагаю, что кто-нибудь имеет опыт работы с деревьями
11 shuhard
 
02.07.08
19:52
(10) далее следует посыл на куй и бан
12 Феликс
 
02.07.08
20:05
родной, хорошь нервничать, перечитай посты 1 и 6, а потом иди за мной и никуда не сворачивай.
13 Immortal
 
02.07.08
20:21
самая тема когда количество строк в отчёте переваливает за 32000-))
14 Феликс
 
02.07.08
23:46
ну вот типа так. хотя все равно лажа получилась какая-то, но работет ))

роцедура  ВывестиСтрокуДерева(Дерево, СтрокиД, Уровень)
   
 //возварт, если конечный узел
 Если строкиД.Количество() = 0 Тогда Возврат; КонецЕсли;
 
 ИмяПар    =    Дерево.Колонки[Уровень - 1].Имя;
 
 Для й = 0 по строкиД.Количество() - 1  Цикл
     Область.Параметры.Заполнить(СтрокиД[й]);
     Область.Параметры["группировка"]    =    СтрокиД[й][ИмяПар];
     ТабДок.Вывести(Область, Уровень);
     ВывестиСтрокуДерева(Дерево, СтрокиД[й].Строки, Уровень + 1);
 КонецЦикла;

 
КонецПроцедуры;
Ошибка? Это не ошибка, это системная функция.