Вертикальный отчет
Показывать по
10
20
40
сообщений
- 1
- 2
22.05.2016
16:56
#1
Здравствуйте. помогите решить задачу.
ВСЕ ВошедшиеВЗапрос. В 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? Спасибо.
ВСЕ ВошедшиеВЗапрос. В 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? Спасибо.
23.05.2016
11:48
#2
Судя по коду, Александр, Вам нужно срочно идти на курсы по 1С — вообще элементарными знаниями не обладаете. Пока базу не угробили...
Ответили:
пост #3
23.05.2016
11:55
#3
Ответ на
пост №2
Денис (САМАРА),Спасибо, Вам огромное за совет. По сути, что то можете предложить? З.Ы. Задача решена. 23.05.2016
12:26
#4
Вот тут:
РегистрНакопления.РеализацияТоваров.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК РеализацияТоваровОбороты
написано "детализация = День", поэтому:
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаКонца)"; - надо заменить на просто Период
Сейчас...
Вот так выходит как вам надо.
РегистрНакопления.РеализацияТоваров.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК РеализацияТоваровОбороты
написано "детализация = День", поэтому:
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаКонца)"; - надо заменить на просто Период
Сейчас...
Вот так выходит как вам надо.
| Код |
|---|
Запрос.Текст = "ВЫБРАТЬ | Продажи.Период КАК Период, | Продажи.Номенклатура КАК Номенклатура, | СУММА(Продажи.КоличествоОборот) КАК Количество |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, ) КАК Продажи |ГДЕ | Продажи.Период МЕЖДУ &ДатаНачала И &ДатаКонца | И Продажи.Номенклатура В(&Номенклатура) | |СГРУППИРОВАТЬ ПО | Продажи.Период, | Продажи.Номенклатура | |УПОРЯДОЧИТЬ ПО | Период, | Номенклатура |ИТОГИ | ВЫБОР | КОГДА СУММА(Количество) ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ СУММА(Количество) | КОНЕЦ КАК Количество |ПО | Номенклатура, | Период"; |
Ответили:
пост #5
23.05.2016
12:38
#5
Ответ на
пост №4
Thorvardr, Да, спасибо. Так и решил. Провозился долго и кучу времени убил. 23.05.2016
12:51
#6
Ну может (раз уж все решилось), то и условие для виртуальной таблицы оборотов перенесете в параметры этой таблицы?
Ответили:
пост #7
23.05.2016
13:18
#7
Ответ на
пост №6
Денис (САМАРА), Да, правильнее будет так:
| Код |
|---|
Запрос.Текст = "ВЫБРАТЬ | Продажи.Период КАК Период, | Продажи.Номенклатура КАК Номенклатура, | СУММА(Продажи.КоличествоОборот) КАК Количество |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, Номенклатура В (&Номенклатура)) КАК Продажи | |СГРУППИРОВАТЬ ПО | Продажи.Период, | Продажи.Номенклатура | |УПОРЯДОЧИТЬ ПО | Период, | Номенклатура |ИТОГИ | ВЫБОР | КОГДА СУММА(Количество) ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ СУММА(Количество) | КОНЕЦ КАК Количество |ПО | Номенклатура, | Период"; |
Ответили:
пост #8
23.05.2016
13:34
#8
Ответ на
пост №7
Thorvardr, Спасибо, попробую и так. Но разницы, честно говоря, не понял. Чем отличается Запрос.УстановитьПараметр("Номенклатура", Товар); от РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, День, Номенклатура В (&Номенклатура))? Скорость? 23.05.2016
14:07
#9
Александр пишет:
Суть в том, что таблица оборотов - виртуальная и в базе её в готовом виде нет. Её строит движок по запросу. При этом, если в параметрах построения уточнить что нас интересуют не все сведения, а только по 4-м товарам, то уже на этапе построения она будет отфильтрована и далее для полученной выборки посчитаются значения оборотов. А если условие в запросе добавить ниже так как было в первом варианте, то построение виртуальной таблицы случится по всем товарам, для них посчитаются значения оборотов, а потом в результате запроса уберутся ненужные записи. Если база большая, то это существенные моменты.
| Цитата |
|---|
Но разницы, честно говоря, не понял. |
Ответили:
пост #10
23.05.2016
14:25
#10
Ответ на
пост №9
Thorvardr,Понял, спасибо. Все таки скорость - 1
- 2
Читают тему
(гостей: 1)