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

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

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

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

fokas

Помогите с выводом. Дрыгаюсь уже не один час. Пробовал и сам и искал решения. Всё равно не получается :(


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

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

ОбходВыборки(Результат);


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

Смотрел через конструктор запросов. Всё нормально, иерархия есть. Выводит же только верхний уровень и общие итоги
Находил в интернете и полную красоту:

Запрос.Текст = "ВЫБРАТЬ Наименование
|ИЗ Справочник.Номенклатура Автоупорядочивание";
РезультатЗапроса = Запрос.Выполнить();

Но на этом всё заканчивается. Здесь какие либо итоги ломают иерархию

has

Если хочешь чтобы и элементы обходились, то попробуй так
Выборка = ВыборкаРодитель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

fokas

Пробовал и это. И не только это. И запрос составлял по разному. Просидел честно и долго. Обычно всё сводилось к тому, что выводило верхний уровень, либо только элементы. В этом случае так же отображаются только элементы

fokas


has

Попробуй написать процедуру без рекурсии, глядишь поймешь

fokas

Изначально рекурсию я не использовал. Начальство очень уж не любит лишние процедуры.
Чтобы убедиться, что и где в каком количестве выбирается, я использовал отладчик. Что "ПоГруппировкам", что "ПоГруппировкамВИерархии" отбирались только верхние элементы. И даже если перебирать в них через "Выбрать()", количество равно 0

Klyacksa

Попробуйте отладчиком остановиться на строке
Результат = Запрос.Выполнить()
и посмотреть таблицу
Запрос.Выполнить().Выгрузить()

Если там действительно есть иерархические данные, то на каждый уровень иерархии будет еще одна дополнительная строка. Вполне возможно, что у Вас не получается иерархии еще на этапе получения данных.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

fokas

Не, не могу сделать. Глупость какая-то...
Через консоль, запрос нормально выводит всю иерархию. Я перепроверил через отладчик, как советовала Klyacksa. Всё на месте. Решил пройтись ручками, как говорит has. Экспериментировал, да надоело! В конце концов просто сделал перебор всевозможных вариантов. Добраться до нижних элементов с соблюдением последовательности родителей так и не получилось :xfbnsdfb: Фантастика!
Придётся восстанавливать дерево самостоятельно

Dethmontt

Не получиться у тебя обойти выборку по группировкам с иерархией...
Вот так сделай проверки - получишь тоже самое что и в запросе (вот весь текст) надеюсь я тебе помог))))
Запрос = Новый Запрос("ВЫБРАТЬ
                      | ВозвратОтПокупателяТЧ_Номенклатура.Номенклатура КАК Номенклатура,
                      | ВозвратОтПокупателяТЧ_Номенклатура.Количество КАК Количество,
                      | ВозвратОтПокупателяТЧ_Номенклатура.СуммаНДС КАК Сумма
                      |ИЗ
                      | Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратОтПокупателяТЧ_Номенклатура
                      |ИТОГИ
                      | СУММА(Количество),
                      | СУММА(Сумма)
                      |ПО
                      | ОБЩИЕ,
                      | Номенклатура ИЕРАРХИЯ");
 
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Через обход поГруппировкамСИерахией ты только получишь Общий Итог и самые верхние группы номенклатуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

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

Рейтинг@Mail.ru

Поиск