8.х Как работать с результатом запроса?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем KatrineKA, 6 окт 2010.

  1. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Мой отчет выводит Номенклатуру, "Остаток на начало периода", и "Расход" по каждому подразделению за квартал.

    Необходимо, что бы в отчете выводились "Номенклатура", "Остаток на начало периода", а "Расход" за каждый месяц в отдельной колонке.
    Данные выводятся в макет отчета, сделала вертикальные секции для вывода информации по месяцам. Но с самим результатом запроса пока не получается сделать то что нужно.

    Подскажите как правильно работать с результатом или где можно посмотреть, почитать об этом.

    Части кода:
    Код:
    "|ВЫБРАТЬ
    |	ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель КАК Исполнитель,
    |	ВнутренниеЗаказыОстаткиИОбороты.Заказчик,
    |	ВнутренниеЗаказыОстаткиИОбороты.Номенклатура.Артикул КАК Артикул,
    |	ВнутренниеЗаказыОстаткиИОбороты.Номенклатура,        	
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход КАК Количество,
    |	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |   ВнутренниеЗаказыОстаткиИОбороты.Период КАК Период,
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход+ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК Итог
    |ИЗ
    |	РегистрНакопления.ВнутренниеЗаказы.ОстаткиИОбороты(&НачПериода, &КонПериода, Месяц, , ВнутреннийЗаказ.ПодразделениеИсполнитель В ИЕРАРХИИ (&Исполнитель)) КАК ВнутренниеЗаказыОстаткиИОбороты
    |ЛЕВОЕ СОЕДИНЕНИЕ 
    |РегистрНакопления.ТоварыНаСкладах.Остатки(&НачПериода) КАК ТоварыНаСкладахОстатки
    |		ПО ВнутренниеЗаказыОстаткиИОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    |СГРУППИРОВАТЬ ПО
    |	ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель,
    |	ВнутренниеЗаказыОстаткиИОбороты.Номенклатура,
    |	ВнутренниеЗаказыОстаткиИОбороты.Заказчик,
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход,
    |   ВнутренниеЗаказыОстаткиИОбороты.Период,
    |	ТоварыНаСкладахОстатки.КоличествоОстаток
    |ИТОГИ	
    |	ПО
    |	Заказчик,
    |Период ПЕРИОДАМИ(МЕСЯЦ, , )"
    ///... параметры
    Запрос.УстановитьПараметр("НачПериода", НачПериода);
    ///...области
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Шапка|Начало");
    ОбластьЗаголовокМесяц = Макет.ПолучитьОбласть("Шапка|Месяц");
    ОбластьЗаголовокМесяц.Параметры.ПердставлениеДат = Формат(НачПериода,"ДФ=ММММ");
    
    ОбластьЗаказчик = Макет.ПолучитьОбласть("Заказчик|Начало");
    ОбластьЗаказчикМесяц = Макет.ПолучитьОбласть("Заказчик|Месяц");
    ///....
    Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Заказчик");
    Пока Результат.Следующий() Цикл
    ОбработкаПрерыванияПользователя(); 	
    ОбластьЗаказчикМесяц.Параметры.Заполнить(Результат);	
    ТабДок.Вывести(ОбластьЗаказчик, Результат.Уровень());
    ТабДок.Присоединить(ОбластьЗаказчикМесяц);
    
    Если Результат.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда		</span>
    РезультатВн = Результат.Выбрать();
    Пока РезультатВн.Следующий() Цикл
    ОбработкаПрерыванияПользователя();
    ОбластьСтрока.Параметры.Заполнить(РезультатВн);			
    ОбластьСтрокаМесяц.Параметры.Заполнить(РезультатВн);
    ТабДок.Вывести(ОбластьСтрока, РезультатВн.Уровень());
    ТабДок.Присоединить(ОбластьСтрокаМесяц, РезультатВн.Уровень());			
    КонецЦикла;
    КонецЕсли;     
    КонецЦикла;
    
  2. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Зачем Вы используете 2 конструкции
    ТабДок.Вывести(ОбластьЗаказчик, Результат.Уровень());
    ТабДок.Присоединить(ОбластьЗаказчикМесяц);
    друг за другом?

    Первая "Вывести" создает в ТД новую строку, Вторая "Присоединить" выводит секцию справа от уже имеющихся.
    Код:
    Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Заказчик");
    Пока Результат.Следующий() Цикл
    ...
    ТабДок.Вывести(ОбластьЗаказчик, Результат.Уровень());
    ...
    РезультатВн = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период");
    Пока РезультатВн.Следующий() Цикл
    ...
    ТабДок.Присоединить(ОбластьСтрокаМесяц, РезультатВн.Уровень());
    ...
    КонецЦикла;
    КонецЦикла; 
    
    ЗЫ и пользуйтесь кнопочкой code справа в верху инструментальной панели.
  3. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Да я подправила, сначала секция вывести, потом присоединяю. Но (ОбходРезультатаЗапроса.ПоГруппировкам, "Период") не дает нужного результата, количество вообще не выходит.
    Объясните пожалуйста, как работает этот ОбходРезультата. Может в самом запросе не те итоги отбираю.
  4. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Вы не указали в запросе что складывать в итогах, по каким полям складывать указали.
    Код:
    "ВЫБРАТЬ
    |    ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель КАК Исполнитель,
    |    ВнутренниеЗаказыОстаткиИОбороты.Заказчик КАК Заказчик,
    |    ВнутренниеЗаказыОстаткиИОбороты.Номенклатура.Артикул КАК Артикул,
    |    ВнутренниеЗаказыОстаткиИОбороты.Номенклатура,
    |    ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход КАК Количество,
    |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |    ВнутренниеЗаказыОстаткиИОбороты.Период КАК Период,
    |    ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход + ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Итог
    |ИЗ
    |    РегистрНакопления.ВнутренниеЗаказы.ОстаткиИОбороты(&НачПериода, &КонПериода, Месяц, , ВнутреннийЗаказ.ПодразделениеИсполнитель В ИЕРАРХИИ (&Исполнитель)) КАК ВнутренниеЗаказыОстаткиИОбороты
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&НачПериода, ) КАК ТоварыНаСкладахОстатки
    |        ПО ВнутренниеЗаказыОстаткиИОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель,
    |    ВнутренниеЗаказыОстаткиИОбороты.Номенклатура,
    |    ВнутренниеЗаказыОстаткиИОбороты.Заказчик,
    |    ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход,
    |    ВнутренниеЗаказыОстаткиИОбороты.Период,
    |    ТоварыНаСкладахОстатки.КоличествоОстаток,
    |    ВнутренниеЗаказыОстаткиИОбороты.Номенклатура.Артикул
    |ИТОГИ
    |    СУММА(Количество),
    |    СУММА(КоличествоОстаток),
    |    СУММА(Итог)
    |ПО
    |    Заказчик,
    |    Период ПЕРИОДАМИ(МЕСЯЦ, , )"
    
    
  5. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Опять не поняла, зачем мне складывать итоги?
    Проблема в том что не правильно выводятся секции присоединяемые, а точнее вообще не выходят. Получается только линейная таблица, а необходимо что бы вышло на каждый месяц отдельная колонка.
    ----------------------------------------------------------------
    Номенклатура | КолОст | Месяц1| Месяц2| Месяц3|
    | Кол-во| Кол-во | Кол-во|
    ------------------------------------------------------------------
  6. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Давайте файл с отчетом, если что вечером гляну.
  7. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Отправила в личные сообщения.

    Спасибо за участие :)
  8. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Код:
     "ВЫБРАТЬ
    |	ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель КАК Исполнитель,
    |	ВнутренниеЗаказыОстаткиИОбороты.Заказчик КАК Заказчик,
    |	ВнутренниеЗаказыОстаткиИОбороты.Номенклатура КАК Номенклатура,
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход КАК Количество,
    |	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |	ВнутренниеЗаказыОстаткиИОбороты.Период КАК Период,
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход + ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Итог
    |ИЗ
    |	РегистрНакопления.ВнутренниеЗаказы.ОстаткиИОбороты(&НачПериода, &КонПериода, Месяц, ,ВнутреннийЗаказ.ПодразделениеИсполнитель В ИЕРАРХИИ (&Исполнитель)) КАК ВнутренниеЗаказыОстаткиИОбороты
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&НачПериода, ) КАК ТоварыНаСкладахОстатки
    |		ПО ВнутренниеЗаказыОстаткиИОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |	ВнутренниеЗаказыОстаткиИОбороты.ВнутреннийЗаказ.ПодразделениеИсполнитель,
    |	ВнутренниеЗаказыОстаткиИОбороты.Номенклатура,
    |	ВнутренниеЗаказыОстаткиИОбороты.Заказчик,
    |	ВнутренниеЗаказыОстаткиИОбороты.КоличествоПриход,
    |	ВнутренниеЗаказыОстаткиИОбороты.Период,
    |	ТоварыНаСкладахОстатки.КоличествоОстаток
    |
    |УПОРЯДОЧИТЬ ПО
    |	Номенклатура,
    |	Период
    |
    |ИТОГИ
    |	СУММА(Количество),
    |	СУММА(КоличествоОстаток),
    |	СУММА(Итог)
    |ПО
    |	Заказчик,
    |	Период ПЕРИОДАМИ(МЕСЯЦ,&НачПериода, &КонПериода),
    |	Номенклатура
    |";	
    Запрос.УстановитьПараметр("НачПериода", НачПериода);
    Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
    Запрос.УстановитьПараметр("Исполнитель", Исполнитель);
    
    МесяцНачДат = Месяц(НачПериода);
    МесяцКонДат = Месяц(КонПериода);
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Шапка|Начало");
    ОбластьЗаголовок.Параметры.НачПериода = Формат(НачПериода,"ДЛФ=DD");
    ОбластьЗаголовок.Параметры.КонПериода = Формат(КонПериода,"ДЛФ=DD");
    ОбластьЗаголовокМесяц = Макет.ПолучитьОбласть("Шапка|Месяц");
    ОбластьЗаголовокМесяц.Параметры.ПердставлениеДат = Формат(НачПериода,"ДФ=ММММ");
    ОбластьЗаголовокИтого = Макет.ПолучитьОбласть("Шапка|Итого");	
    ОбластьЗаголовок.Параметры.Исполнитель = Исполнитель;	
    
    ОбластьЗаказчик = Макет.ПолучитьОбласть("Заказчик|Начало");
    ОбластьЗаказчикМесяц = Макет.ПолучитьОбласть("Заказчик|Месяц");
    ОбластьЗаказчикИтого = Макет.ПолучитьОбласть("Заказчик|Итого");
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка|Начало");
    ОбластьСтрокаМесяц = Макет.ПолучитьОбласть("Строка|Месяц");
    ОбластьСтрокаИтого = Макет.ПолучитьОбласть("Строка|Итого");
    
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал|Начало");
    ОбластьПодвалМесяц = Макет.ПолучитьОбласть("Подвал|Месяц");
    ОбластьПодвалИтого = Макет.ПолучитьОбласть("Подвал|Итого");
    
    Результат = Запрос.Выполнить();
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    //Дальше выбираем месяца по первой строчке
    Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
    Пока Выборка.Следующий() Цикл
    //Для каждого периода формируем представление
    ОбластьЗаголовокМесяц.Параметры.ПердставлениеДат = Формат(Выборка.Период,"ДФ=ММММ");
    ТабДок.Присоединить(ОбластьЗаголовокМесяц);
    КонецЦикла;
    //Не забываем присоединить заголовок Итого
    ТабДок.Присоединить(ОбластьЗаголовокИтого);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    //Начинаем формировать строки
    Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Заказчик"); //Первая группировка заказчик
    Пока Выборка.Следующий() Цикл
    ОбработкаПрерыванияПользователя(); 	
    //Сначала выведем левую часть		 
    ОбластьЗаказчик.Параметры.Заполнить(Выборка);	
    ТабДок.Вывести(ОбластьЗаказчик, Выборка.Уровень());
    //Далее выбираем месяца
    ВыборкаМ = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
    Пока ВыборкаМ.Следующий() Цикл
    ОбластьЗаказчикМесяц.Параметры.Заполнить(ВыборкаМ);	
    ТабДок.Присоединить(ОбластьЗаказчикМесяц);
    КонецЦикла;
    //Не забываем прилепить итого
    ОбластьЗаказчикИтого.Параметры.Заполнить(Выборка);	
    ТабДок.Присоединить(ОбластьЗаказчикИтого);
    
    //Вывели строку для заказчика, начинаем перебирать номенклатуру
    ВыборкаН = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
    Пока ВыборкаН.Следующий() Цикл
    //Сначала левую часть
    ОбластьСтрока.Параметры.Заполнить(ВыборкаН);
    //Артикул прописываем отдельно, т.к. его нет в итогах
    ОбластьСтрока.Параметры.Артикул = ВыборкаН.Номенклатура.Артикул;//**
    ТабДок.Вывести(ОбластьСтрока, Выборка.Уровень());
    //Далее цикл по периодам
    ВыборкаМ = ВыборкаН.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
    Пока ВыборкаМ.Следующий() Цикл
    ОбластьСтрокаМесяц.Параметры.Заполнить(ВыборкаМ);	
    ТабДок.Присоединить(ОбластьСтрокаМесяц);
    КонецЦикла;
    //Не забываем прилепить итого
    ОбластьСтрокаИтого.Параметры.Заполнить(ВыборкаН);	
    ТабДок.Присоединить(ОбластьСтрокаИтого);
    КонецЦикла;
    КонецЦикла;    
    
    

Поделиться этой страницей