Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
27 ноя 2024, 19:53

Вывод иерархии справочника Номенклатура с помощью запроса

Автор fokas, 01 дек 2011, 19:12

0 Пользователей и 1 гость просматривают эту тему.

duk337

Помните!!! Парметры в 1с передаются по ссылке!!! А при рекурсии - лучше бы по значению, как говорил товарищ Сухов: Фун(знач Пар1)

duk337

Вообще всё ещё проще. создается новый простенький отчет по справочнику через конструктор. И оттуда осмысленно всё передирается

fokas

Dethmontt
Честно, сомневаюсь что это сработает. Но конечно, надо будет убедиться. Сомнение обосновано. Говоря, что перебрал всевозможные варианты, имел ввиду перебор всевозможных вариантов, включая и:
//ОбходРезультатаЗапроса.ПоГруппировкам -> ОбходРезультатаЗапроса.ПоГруппировкам -> ОбходРезультатаЗапроса.ПоГруппировкам
Выводил результаты как путь от верхнего родителя до нижнего элемента. Ни один из перебранных вариантов мне так полный путь и не выдал.
Всё равно спасибо, обязательно перепроверю

duk337
Да нет, не соглашусь. Я конечно не фанатик, но передавая выборку как значение, мы продублируем её - нагрузка на оперативную память. А смысл? Никаких операций, влияющих на состояние переменной, ссылку которой мы передаём, не производится.
Было бы лучше показать пример решения

Рабочее, но думаю, далеко не идельное решение:

Запрос = Новый Запрос;
Запрос.Текст =
           "ВЫБРАТЬ
           |    ВозвратОтПокупателяТЧ_Номенклатура.Номенклатура КАК Номенклатура,
           |    ВозвратОтПокупателяТЧ_Номенклатура.Количество,
           |    ВозвратОтПокупателяТЧ_Номенклатура.СуммаСНДС КАК Сумма
           |    ВозвратОтПокупателяТЧ_Номенклатура.Ссылка КАК Документ
           |ИЗ
           |    Документ.ВозвратОтПокупателя.ТЧ_Номенклатура КАК ВозвратОтПокупателяТЧ_Номенклатура
           |ИТОГИ ПО
           |    ОБЩИЕ,
           |    Номенклатура ИЕРАРХИЯ";

Результат = Запрос.Выполнить();


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

ТабДок.НачатьАвтогруппировкуСтрок();

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

Область.Параметры.Заполнить(ВыборкаНоменклатуры);

РодительНоменклатуры = ВыборкаНоменклатуры.Номенклатура.Родитель;

УровеньИерархии = 0;
Пока ЗначениеЗаполнено(РодительНоменклатуры) Цикл
УровеньИерархии = УровеньИерархии +1;
РодительНоменклатуры = РодительНоменклатуры.Родитель;
КонецЦикла;

ТабДок.Вывести(Область,УровеньИерархии);

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

КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();

При таком обходе выборки, мы проходим по веткам дерева. Остаётся вручную узнать уровень иерархии через справочник

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск