Вертикальный отчет

Новая тема
Показывать по 10 20 40 сообщений
Здравствуйте. помогите решить задачу.
ВСЕ ВошедшиеВЗапрос. В 77 эта конструкция решала       задачу с выводом пустых значений. Напрмер: задан период с 01.05.16 по 15.05.16. И есть четыре товара. Первый и четвертый продавались 09, 10,12,13 Второй и третий продавался 09, 10 и 13. Причем у Второго товара на 12 число был пизнак1, а у Третьего товара 12 числа был признак2 (признак1 и признак 2 определяются ресурсом того же регистра)  Если делать вертикальный отчет с группировкой по периодам, то в 77 я делал так: "Группировка День Все ВошедшиеВЗапрос" и в результате этого я получал в запросе все даты (09, 10, 12 ,13) как для Первого и Второго, так и для Третьего и Четвертого товаров. В 8 я делаю запрос такого вида:


Товар    = Новый Массив;
Для каждого строкаТЧ Из Отчет.Товары Цикл        
   Товар.Добавить(строкаТЧ.Товар);    
КонецЦикла;


ОтчетОбъект    = РеквизитФормыВЗначение("Отчет");
Макет        = ОтчетОбъект.ПолучитьМакет("Макет");
ОбластьЗаголовокТовар        = Макет.ПолучитьОбласть("Шапка|Верт1");
ОбластьЗаголовокПериод        = Макет.ПолучитьОбласть("Шапка|Верт2");    
ОбластьЗаголовокИтоги        = Макет.ПолучитьОбласть("Шапка|Верт3");    
Запрос = Новый Запрос;    
Запрос.Текст =     "ВЫБРАТЬ    
|    РеализацияТоваровОбороты.Период КАК Период,
|    РеализацияТоваровОбороты.Товар КАК Товар,    
|    СУММА(РеализацияТоваровОбороты.КоличествоОборот) КАК Количество    
|ИЗ    
|    РегистрНакопления.РеализацияТоваров.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК РеализацияТоваровОбороты    
|ГДЕ    
|    РеализацияТоваровОбороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца    
|    И РеализацияТоваровОбороты.Товар В(&Товар)    
|    |СГРУППИРОВАТЬ ПО    
|    РеализацияТоваровОбороты.Период,    
|    РеализацияТоваровОбороты.Товар    
|    
|УПОРЯДОЧИТЬ ПО    
|    Период,    
|    Товар    
|ИТОГИ    
|    ВЫБОР    
|        КОГДА СУММА(Количество) Есть NULL    
|            ТОГДА 0    
|        ИНАЧЕ СУММА(Количество)    
|    КОНЕЦ КАК Количество    
|ПО    
|    Товар,    
|    Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаКонца)";
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);    
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);    
Запрос.УстановитьПараметр("Товар", Товар);        
РезультатЗапроса = Запрос.Выполнить();    
//ТЗ = РезультатЗапроса.Выгрузить();
ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ТОВАР","ВСЕ");        


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





В итоге получаю для Первого и четвертого товара выборку с датами (09, 10, 12 ,13), а для Третьего и Четвертого товара выборку с датами (09, 10, 13), т.е. для них нет данных за 12 число и это, как бы, правильно. Обрабатываю результкт и получаю скособоченную таблицу такого вида, как на рис. отчет8. Создавая отчет с помощью СКД с такими же критериями, получаю рис. ОтчетСКД. Т.е. там для всех товаров все даты присутствуют. Но в нем я не понимаю, как заполнить 12 число признаками.  Как и что добавить в мой запрос, для того что бы вывод был как на рис. отчет77? Спасибо.

Судя по коду, Александр, Вам нужно срочно идти на курсы по 1С — вообще элементарными знаниями не обладаете. Пока базу не угробили...
Ответили: пост #3
Ответ на пост №2
Денис (САМАРА),Спасибо, Вам огромное за совет. По сути, что то можете предложить? З.Ы. Задача решена.
Вот тут:
РегистрНакопления.РеализацияТоваров.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК РеализацияТоваровОбороты
написано "детализация = День", поэтому:
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаКонца)";  - надо заменить на просто Период
Сейчас...
Вот так выходит как вам надо.
Код
      Запрос.Текст = "ВЫБРАТЬ
                     |      Продажи.Период КАК Период,
                     |      Продажи.Номенклатура КАК Номенклатура,
                     |      СУММА(Продажи.КоличествоОборот) КАК Количество
                     |ИЗ
                     |      РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК Продажи
                     |ГДЕ
                     |      Продажи.Период МЕЖДУ &ДатаНачала И &ДатаКонца
                     |      И Продажи.Номенклатура В(&Номенклатура)
                     |
                     |СГРУППИРОВАТЬ ПО
                     |      Продажи.Период,
                     |      Продажи.Номенклатура
                     |
                     |УПОРЯДОЧИТЬ ПО
                     |      Период,
                     |      Номенклатура
                     |ИТОГИ
                     |      ВЫБОР
                     |            КОГДА СУММА(Количество) ЕСТЬ NULL 
                     |                  ТОГДА 0
                     |            ИНАЧЕ СУММА(Количество)
                     |      КОНЕЦ КАК Количество
                     |ПО
                     |      Номенклатура,
                     |      Период";
Ответили: пост #5
Ответ на пост №4
Thorvardr, Да, спасибо. Так и решил. Провозился долго и кучу времени убил.
Ну может (раз уж все решилось), то и условие для виртуальной таблицы оборотов перенесете в параметры этой таблицы?
Ответили: пост #7
Ответ на пост №6
Денис (САМАРА),
Да, правильнее будет так:


Код
      Запрос.Текст = "ВЫБРАТЬ
                     |      Продажи.Период КАК Период,
                     |      Продажи.Номенклатура КАК Номенклатура,
                     |      СУММА(Продажи.КоличествоОборот) КАК Количество
                     |ИЗ
                     |      РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, Номенклатура В (&Номенклатура)) КАК Продажи
                     |
                     |СГРУППИРОВАТЬ ПО
                     |      Продажи.Период,
                     |      Продажи.Номенклатура
                     |
                     |УПОРЯДОЧИТЬ ПО
                     |      Период,
                     |      Номенклатура
                     |ИТОГИ
                     |      ВЫБОР
                     |            КОГДА СУММА(Количество) ЕСТЬ NULL 
                     |                  ТОГДА 0
                     |            ИНАЧЕ СУММА(Количество)
                     |      КОНЕЦ КАК Количество
                     |ПО
                     |      Номенклатура,
                     |      Период"; 
Ответили: пост #8
Ответ на пост №7
Thorvardr, Спасибо, попробую и так. Но разницы, честно говоря, не понял. Чем отличается Запрос.УстановитьПараметр("Номенклатура", Товар); от РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, Номенклатура В (&Номенклатура))? Скорость?
Александр пишет:
Цитата

Но разницы, честно говоря, не понял.
Суть в том, что таблица оборотов - виртуальная и в базе её в готовом виде нет. Её строит движок по запросу. При этом, если в параметрах построения уточнить что нас интересуют не все сведения, а только по 4-м товарам, то уже на этапе построения она будет отфильтрована и далее для полученной выборки посчитаются значения оборотов. А если условие в запросе добавить ниже так как было в первом варианте, то построение виртуальной таблицы случится по всем товарам, для них посчитаются значения оборотов, а потом в результате запроса уберутся ненужные записи. Если база большая, то это существенные моменты.
Ответили: пост #10
Ответ на пост №9
Thorvardr,Понял, спасибо. Все таки скорость :) Я все время проработал с 77. и там условия задавались в запросе (Условие Номенклатура в выбНоменклатура). И тогда получался Ваш вариант. Т.е. выборка была только по списку выбНоменклатура. Поскольку в приведенном листинге параметры запроса заполняются до РезультатЗапроса = Запрос.Выполнить(); я и считал, что это все равно.
Читают тему
(гостей: 1)

Быстрый переход