Имя: Пароль:
1C
1С v8
Составление макета документа
0 VallyNolan
 
18.07.23
17:22
Добрый день! Задание следующее: разработать печатную форму для документа, чтобы в ней по отдельности выводились проданные/предоставленные товары/услуги.
Проблема: не получается отстортировать отдельно материалы и отдельно услуги, а также посчитать по ним итоги.
Код:
Макет = Документы.ОказаниеУслуги.ПолучитьМакет("Печать");
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    спрНоменклатура.ВидНоменклатуры КАК НоменклатураВидНоменклатуры,
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК Количество,
        |    ОказаниеУслугиПереченьНоменклатуры.Цена КАК Цена,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК Сумма,
        |    ОказаниеУслуги.Клиент КАК Клиент,
        |    ОказаниеУслуги.Номер КАК Номер,
        |    ОказаниеУслуги.Дата КАК Дата,
        |    ОказаниеУслуги.Ссылка КАК Ссылка
        |ИЗ
        |    Документ.ОказаниеУслуги КАК ОказаниеУслуги
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
        |        ПО ОказаниеУслуги.Ссылка = ОказаниеУслугиПереченьНоменклатуры.Ссылка
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
        |        ПО (ОказаниеУслугиПереченьНоменклатуры.Ссылка = спрНоменклатура.Ссылка)
        |ГДЕ
        |    ОказаниеУслуги.Ссылка В(&Ссылка)
        |
        |СГРУППИРОВАТЬ ПО
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугиПереченьНоменклатуры.Цена,
        |    ОказаниеУслуги.Клиент,
        |    ОказаниеУслуги.Номер,
        |    ОказаниеУслуги.Дата,
        |    ОказаниеУслуги.Ссылка,
        |    спрНоменклатура.ВидНоменклатуры
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номер,
        |    НоменклатураВидНоменклатуры УБЫВ
        |ИТОГИ
        |    СУММА(Сумма),
        |    МАКСИМУМ(Клиент),
        |    МАКСИМУМ(Номер),
        |    МАКСИМУМ(Дата)
        |ПО
        |    Ссылка,
        |    НоменклатураВидНоменклатуры";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();

    Заголовок = Макет.ПолучитьОбласть("Заголовок");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    ПереченьНоменклатурыТоварыШапка = Макет.ПолучитьОбласть("ПереченьНоменклатурыТоварыШапка");
    Товары = Макет.ПолучитьОбласть("Товары");
    ПереченьНоменклатурыУслугиШапка = Макет.ПолучитьОбласть("ПереченьНоменклатурыУслугиШапка");
    Услуги = Макет.ПолучитьОбласть("Услуги");
    ИтогиТоваров = Макет.ПолучитьОбласть("ИтогиТоваров");
    ИтогиУслуг = Макет.ПолучитьОбласть("ИтогиУслуг");
    ТабДок.Очистить();
    
    ВставлятьРазделительСтраниц = Ложь;
       
    
    ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    Пока ВыборкаСсылка.Следующий() Цикл
        ТабДок.Вывести(Заголовок);
        
        Шапка.Параметры.Заполнить(ВыборкаСсылка);
        Шапка.Параметры.Дата = Формат(ВыборкаСсылка.Дата,"ДФ='dd MMMM гггг ""года""'");
        ТабДок.Вывести(Шапка);
        
        ТабДок.Вывести(ПереченьНоменклатурыТоварыШапка);
        ВыборкаНоменклатураВидНоменклатуры = ВыборкаСсылка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
        
        Пока ВыборкаНоменклатураВидНоменклатуры.Следующий() Цикл
            
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатураВидНоменклатуры.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                
                Товары.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                ТабДок.Вывести(Товары);
                ИтогиТоваров.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                
            КонецЦикла;
            
            ТабДок.Вывести(ИтогиТоваров);
            ТабДок.Вывести(ПереченьНоменклатурыУслугиШапка);    
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатураВидНоменклатуры.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Услуги.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                ТабДок.Вывести(Услуги);
                ИтогиУслуг.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
            КонецЦикла;
            ТабДок.Вывести(ИтогиУслуг);
            
        КонецЦикла;
    КонецЦикла;

Подскажите, пожалуйста, в чём ошибка или где нужно поставить параметр(?), условие(?).
1 Kesim
 
18.07.23
17:43
сделай 2 пакета в запросе один по услугам другой по товарам
и обрабатывай потом 2 выборки
2 VallyNolan
 
18.07.23
20:10
Поменяла запрос и код (без 2 пакетов всё реализовала), но столкнулась с ещё одной проблемой.
В документах, в которых нет услуг и/или материалов, табличная часть этих документов не выводится, но заголовки, при этом, остаются. Куда мне их логичнее поместить, чтобы они выводились по в соответствии: есть товары в таб ч документа => выводится заголовок и таб часть; нет таб части = > не выводится?

Код прилагаю.

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

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

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