![]() |
![]() |
![]() |
|
Использование дерева значений и рекурсии при формировании отчета | ☑ | ||
---|---|---|---|---|
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); КонецЦикла; КонецПроцедуры; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |