Имя: Пароль:
1C
1С v8
Вывести список в иерархическом порядке
0 StarkNotDead
 
02.11.15
07:11
Добрый день! Помогите, пожалуйста, с задачей - необходимо вывести список товаров, оставшихся на складах, причём все товары расположены в папке-родителе Товары, и затем идут папки подродители. Сейчас обработка выводит все товары в СКВОЗНОМ алфавитном порядке, а нужно, чтобы выводился алфавитный список поочерёдно по каждой папке-подродителе. Надеюсь, объяснил понятно.
Конфигурация УТ 10.3. Код кривой, не ругайтесь, только осваиваю.
Вывод производится в две колонки (если будут вопросы).

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

    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Номенклатура",Справочники.Номенклатура.НайтиПоКоду("00000001624"));
    Выб = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока Выб.Следующий() цикл    
            Выборка=Выб.Выбрать();
        если Выборка.Количество()>1 тогда
            ОбластьИмяГруппы.Параметры.ИмяГруппы1 = Выб.НоменклатураРодитель;
            ТабДок.Вывести(ОбластьИмяГруппы);
        конецесли;
        Счетчик =1;
            к=0;
            пока Выборка.Следующий() цикл
                если Выборка.Номенклатура="" тогда
                    Продолжить;
                    КонецЕсли;
            Если Счетчик = 1 Тогда
            ОбластьСтрокаТаблицы.Параметры.Кол1 = Выборка.Номенклатура;    
            Счетчик = 2;
            к1=Истина;
        Иначе
            ОбластьСтрокаТаблицы.Параметры.Кол2 = Выборка.Номенклатура;
            Счетчик = 1;
            к=1;
        КонецЕсли;
        если к=1 тогда
        ТабДок.Вывести(ОбластьСтрокаТаблицы);
        к=0;
        к1=ложь;
        конецесли;
    КонецЦикла;
    если к1 = истина тогда
        ОбластьСтрокаТаблицы.Параметры.Кол2 = "";
        ТабДок.Вывести(ОбластьСтрокаТаблицы);
        к1=ложь;
    //конецесли;
    конецесли;
КонецЦикла;
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ТолькоПросмотр = Истина;
    Возврат ТабДок;
1 patapum
 
02.11.15
07:36
(0) В качестве номенклатуры элемент справочника, далее Итоги Номенклатура Иерархия
2 hawksib
 
02.11.15
07:50
(1) я б ещё рекурсвый вывод добавил, че-то типа

Процедура Дерево(ТабДокумент, Макет, МП, Уровень = 0)
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    //Обходим строки текущего уровня дерева
    Для Каждого СтрДерева Из мп.Строки Цикл
        ОбластьСтрока.Параметры.Период = СтрДерева.Период;
        ОбластьСтрока.Параметры.Номер = СтрДерева.Номер;
        ОбластьСтрока.Параметры.Количество = СтрДерева.Количество;
        ТабДокумент.Вывести(ОбластьСтрока, Уровень, , Ложь);
        Дерево(ТабДокумент, Макет, СтрДерева, Уровень + 1);
    КонецЦикла;
КонецПроцедуры
3 hawksib
 
02.11.15
07:52
ну и при выводе дерева, не забудь указывать уровень иерархии, и ещё в начале вывода нужно начать автогруппировку строк, а в конце закончить