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

Как реализовать группировку с расшифровкой?

Автор sapravka, 20 янв 2013, 12:42

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

sapravka

 Здравствуйте!
Собственное все по порядку!
Имеется документ Отчет производства за смену в конфигурации бухгалтерия предприятия 2.0
В нем на закладке продукция, заполняем блюда:

А на закладке материалы автоматический заполняется материалы, из чего собственно и создана данная продукции:

В модуле объекта документа прописал следующее:

Функция ПечатьКанкуляционнаяКарта()

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| ОтчетПроизводстваЗаСменуПродукция.Номенклатура.ОсновнаяСпецификацияНоменклатуры.Владелец.Ссылка КАК Блюда,
| ОтчетПроизводстваЗаСменуПродукция.Количество КАК КоличествоБлюд,
| СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Индигриенты,
| СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК КоличествоНаОдноБлюдо,
| ОтчетПроизводстваЗаСменуПродукция.Количество * СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК ОбщееКоличество,
| ОтчетПроизводстваЗаСмену.Номер КАК Номер,
| ОтчетПроизводстваЗаСмену.Дата КАК Дата,
| ОтчетПроизводстваЗаСмену.Склад КАК Склад
|ИЗ
| Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
| ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка.Владелец
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетПроизводстваЗаСмену КАК ОтчетПроизводстваЗаСмену
| ПО ОтчетПроизводстваЗаСменуПродукция.Ссылка = ОтчетПроизводстваЗаСмену.Ссылка
|ГДЕ
| ОтчетПроизводстваЗаСменуПродукция.Ссылка = &ТекущийДокумент
|ИТОГИ ПО
| ОБЩИЕ";


//ЗапросСтрока = Запрос.Выполнить().Выгрузить();

Запрос.УстановитьПараметр("ОтчетПроизводстваЗаСменуПродукция.Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

Макет = ПолучитьМакет("Калькуляция");




// Выводим все доступные областя макета
ОбластьШапка   = Макет.ПолучитьОбласть("Шапка");
ОбластьБлюда   = Макет.ПолучитьОбласть("Блюда");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал  = Макет.ПолучитьОбласть("Подвал");

ТабДокумент = Новый ТабличныйДокумент;

// Загрузим настройки пользователя.
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Калькуляция";


// Выводим Шапку


Результат = Запрос.Выполнить();   
Выборка = Результат.Выбрать();
//не выводяться почемуто данные...
ОбластьШапка.Параметры.Номер = Выборка.Номер;
ОбластьШапка.Параметры.Дата = Выборка.Дата;
ОбластьШапка.Параметры.Склад = Выборка.Склад;
//хотя сама шапка выводиться
        ТабДокумент.Вывести(ОбластьШапка);



Пока Выборка.Следующий() Цикл
ОбластьБлюда.Параметры.Блюда = Выборка.Блюда;
            ТабДокумент.Вывести(ОбластьБлюда);
ОбластьСтрока.Параметры.СоставБлюд = Выборка.Индигриенты;
ОбластьСтрока.Параметры.ОбщееКоличество = Выборка.ОбщееКоличество;
ТабДокумент.Вывести(ОбластьСтрока); 
КонецЦикла;

 
Область = Макет.ПолучитьОбласть("Подвал");
ТабДокумент.Вывести(Область);


    ТабДокумент.Показать();

КонецФункции // ПечатьКанкуляционнаяКарта()


А в макете следующее:

И при печати выходит следующее:


Подскажите, пожалуйста, как сделать так, чтобы в печатной форме происходила группировка по продукции, вот так:

То есть что бы сначала шла продукция, а потом, то что входит в её состав и соответственно считалась сумма продукции(складывалась сумма всех составляющих её материалов).
Мысль у меня была такая: Сначала что бы выводил область блюда, а потом область строка (то есть из чего состоит) – но вот что то не могу понять, как это реализовать... Как это прописать в модуле объекта? (да и в верху три лишних колонки почему то получается, хотя в макете нет никаких пропусков)
И еще – в шапке, почему то не выводит номер и дату документа, хотя вроде бы прописал все и в параметрах и в самом модуле объекта?

Yura063

Сделайте так:

Блюдо1="";
Пока Выборка.Следующий() Цикл
     Если Блюдо1 = Выборка.Блюда Тогда
            ОбластьСтрока.Параметры.СоставБлюд = Выборка.Индигриенты;
            ОбластьСтрока.Параметры.ОбщееКоличество = Выборка.ОбщееКоличество;
            ТабДокумент.Вывести(ОбластьСтрока);
    Иначе
            Блюда1 = Выборка.Блюда;
            ОбластьБлюда.Параметры.Блюда = Выборка.Блюда;
            ТабДокумент.Вывести(ОбластьБлюда);
    КонецЕсли;
КонецЦикла;
Помогли, отблагодари!

sapravka

Цитата: Yura063 от 20 янв 2013, 14:34
Сделайте так:

Блюдо1="";
Пока Выборка.Следующий() Цикл
     Если Блюдо1 = Выборка.Блюда Тогда
            ОбластьСтрока.Параметры.СоставБлюд = Выборка.Индигриенты;
            ОбластьСтрока.Параметры.ОбщееКоличество = Выборка.ОбщееКоличество;
            ТабДокумент.Вывести(ОбластьСтрока);
    Иначе
            Блюда1 = Выборка.Блюда;
            ОбластьБлюда.Параметры.Блюда = Выборка.Блюда;
            ТабДокумент.Вывести(ОбластьБлюда);
    КонецЕсли;
КонецЦикла;


Спасибо!
Сейчас попробую...
А не подскажите, как в запросе сделать итоги по блюдам (продукции)?

sertak

Цитата: sapravka от 20 янв 2013, 12:42

Результат = Запрос.Выполнить();   
Выборка = Результат.Выбрать();
//не выводяться почемуто данные...
ОбластьШапка.Параметры.Номер = Выборка.Номер;
ОбластьШапка.Параметры.Дата = Выборка.Дата;
ОбластьШапка.Параметры.Склад = Выборка.Склад;
//хотя сама шапка выводиться       
ТабДокумент.Вывести(ОбластьШапка);

Для того, чтобы в шапке отобразились значения из выборки, шапку необходимо вывести внутри цикла (ведь до цикла мы не позиционировались ни на одной строке, соответственно откуда бы взяться, например, значению Выборка.Склад), но для того, чтобы шапка вывелась только 1 раз, можно добавить флаг, например ПерваяИтерация, проверять его и сбрасывать после первой итерации. Например:

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

Добавлено: 20 янв 2013, 18:13


 
        |ВЫБРАТЬ
| ОтчетПроизводстваЗаСменуПродукция.Номенклатура КАК Блюда,
| СуммыПоБлюдам.СуммаПоОдномуБлюду КАК СуммаВсехИнгредиентовПоОдномуБлюду,
| ОтчетПроизводстваЗаСменуПродукция.Количество КАК КоличествоБлюд,
| СуммыПоБлюдам.СуммаПоОдномуБлюду * ОтчетПроизводстваЗаСменуПродукция.Количество КАК СуммаВсехИнгредиентовПоОдномуБлюдуЗаСмену,
| СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Индигриенты,
| СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК КоличествоНаОдноБлюдо,
| ОтчетПроизводстваЗаСменуПродукция.Количество * СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК ОбщееКоличество,
| ОтчетПроизводстваЗаСменуПродукция.Ссылка.Номер КАК Номер,
| ОтчетПроизводстваЗаСменуПродукция.Ссылка.Дата КАК Дата,
| ОтчетПроизводстваЗаСменуПродукция.Ссылка.Склад КАК Склад
|ИЗ
| Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
| ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка.Владелец
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ОтчетПроизводстваЗаСменуПродукция.Номенклатура КАК Блюдо,
| СУММА(СпецификацииНоменклатурыИсходныеКомплектующие.Количество) КАК СуммаПоОдномуБлюду
| ИЗ
| Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
| ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка.Владелец
| ГДЕ
| ОтчетПроизводстваЗаСменуПродукция.Ссылка = &ТекущийДокумент |
| СГРУППИРОВАТЬ ПО
| ОтчетПроизводстваЗаСменуПродукция.Номенклатура) КАК СуммыПоБлюдам
| ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СуммыПоБлюдам.Блюдо
|ГДЕ
| ОтчетПроизводстваЗаСменуПродукция.Ссылка = &ТекущийДокумент

Думаю, из псевдонимов полей будет ясно их содержание.

sapravka

Попробывал сделать так:
Цитата: Yura063 от 20 янв 2013, 14:34
Сделайте так:

Блюдо1="";
Пока Выборка.Следующий() Цикл
     Если Блюдо1 = Выборка.Блюда Тогда
            ОбластьСтрока.Параметры.СоставБлюд = Выборка.Индигриенты;
            ОбластьСтрока.Параметры.ОбщееКоличество = Выборка.ОбщееКоличество;
            ТабДокумент.Вывести(ОбластьСтрока);
    Иначе
            Блюда1 = Выборка.Блюда;
            ОбластьБлюда.Параметры.Блюда = Выборка.Блюда;
            ТабДокумент.Вывести(ОбластьБлюда);
    КонецЕсли;
КонецЦикла;

И получилось вот так:

Подскажите, пожалуйста, что необходимо поправить, что бы получилось вот так:

sertak

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

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


Добавлено: 21 янв 2013, 10:00


И вариант вывода в макет, который вам приводили, немного дополнил:


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


Klyacksa

Зачем соединять еще и с самим документом по ссылке, если он у нас и так уже есть? К Номеру, Дате и Складу можно достучаться через Ссылку.
Итоги/группировки надо получать правильно, еще в запросе, а не отрабатывать потом "Если это все еще то же блюдо, тогда..."
Схема запроса такая:
"ВЫБРАТЬ
|    ОтчетПроизводстваЗаСменуПродукция.Номенклатура КАК Блюда,
|    ОтчетПроизводстваЗаСменуПродукция.Количество КАК КоличествоБлюд,
|    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Индигриенты,
|    СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК КоличествоНаОдноБлюдо,
|    ОтчетПроизводстваЗаСменуПродукция.Количество * СпецификацииНоменклатурыИсходныеКомплектующие.Количество КАК ОбщееКоличество,
|    ОтчетПроизводстваЗаСменуПродукция.Ссылка.Номер КАК Номер,
|    ОтчетПроизводстваЗаСменуПродукция.Ссылка.Дата КАК Дата,
|    ОтчетПроизводстваЗаСменуПродукция.Ссылка.Склад КАК Склад
|ИЗ
|    Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
|        ПО ОтчетПроизводстваЗаСменуПродукция.Номенклатура = СпецификацииНоменклатурыИсходныеКомплектующие.Владелец
|ГДЕ
|    ОтчетПроизводстваЗаСменуПродукция.Ссылка = &ТекущийДокумент
|ИТОГИ
| МАКСИМУМ(КоличествоБлюд),
| МАКСИМУМ(КоличествоНаОдноБлюдо),
| МАКСИМУМ(ОбщееКоличество)
|ПО
|    Блюда";


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

    ВыборкаСтрока=Выборка.Выбрать();
    Пока ВыборкаСтрока.Следующий() цикл
        ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрока);
        ТабДокумент.Вывести(ОбластьСтрока);
    КонецЦикла;
КонецЦикла;


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

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

Yura063

ЦитироватьБлюда1="";
Пока Выборка.Следующий() Цикл
     Если Блюда1 = Выборка.Блюда Тогда
            ОбластьСтрока.Параметры.СоставБлюд = Выборка.Индигриенты;
            ОбластьСтрока.Параметры.ОбщееКоличество = Выборка.ОбщееКоличество;
            ТабДокумент.Вывести(ОбластьСтрока);
    Иначе
            Блюда1 = Выборка.Блюда;
            ОбластьБлюда.Параметры.Блюда = Выборка.Блюда;
            ТабДокумент.Вывести(ОбластьБлюда);
    КонецЕсли;
КонецЦикла;
Написал в спешки, совершил пару ошибок :btbzdb:! Вы хоть сами смотрите, а то копировали и все тут!
Помогли, отблагодари!

Теги:

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

Рейтинг@Mail.ru

Поиск