Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Розница: отчет на СКД

Розница: отчет на СКД
Я
   slafor
 
26.04.21 - 19:00
1С:Розница 2.3. Есть отчет "Оценка валовой прибыли", переделанный под партионный учет.
Отчет полностью на СКД, там даже формы нет. Вызываю скопированную схему компоновки данных из другого отчета - он формируется минут 15-20. Если пишу отдельно запрос в другом отчете и работаю с ним - то отчет выполняется за 2-3 минуты.
Интересно бы узнать, где именно он так зависает. С СКД, если честно, знаком поверхностно, особенно со всякими там компоновщиками настроек и т.д. Подскажите, где взять информацию об этом, и где может тормозить вызываемая таким образом схема компоновки.
Необходимые параметры я вызываю с использованием БСП Розницы: ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "СтандартныйПериод", Стр.Период); и так далее.
Я мог бы написать все отдельным запросом и самого его юзать, но дело в том, что там используется несколько наборов данных, и это уже проблематично.
   slafor
 
1 - 26.04.21 - 19:01
"Необходимые параметры я вызываю с использованием БСП Розницы:" 
читать как "Необходимые параметры я передаю с использованием БСП Розницы:" :)
   slafor
 
2 - 26.04.21 - 19:03
Вот полностью процедура для получения данных отчета.

&НаСервере
Процедура ПолучитьДанныеОтчета(Стр, СтруктураДанных, СКД)
    
    // Подготовка компоновщика макета компоновки данных.

    Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
    Компоновщик.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
    //Компоновщик.ЗагрузитьНастройки(ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки());

    
    //Установка параметров                                                       Новый СтандартныйПериод(Стр.ДатаНачала,Стр.ДатаОк)

    ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "СтандартныйПериод", Стр.Период);
    //Компоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", СтрПериод);

    
    // Компоновка макета компоновки данных.

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СКД,
    Компоновщик.Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    // Вывод.

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных();
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,,Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ДанныеОтчета = Новый ДеревоЗначений;
    ПроцессорВывода.УстановитьОбъект(ДанныеОтчета);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    СтрНомер = Строка(Стр.НомерСтроки);
    СтруктураДанных.Вставить("_"+СтрНомер, ДанныеОтчета);

КонецПроцедуры// ()
   slafor
 
3 - 26.04.21 - 19:15
Стр - строка с периодом отчета,
СКД - схема компоновки данных из другого отчета,
а СтруктураДанных - структура, где в виде элементов выступает дерево значений из результата запроса - Данные отчета.
   CepeLLlka
 
4 - 26.04.21 - 19:23
(1)Я может не до конца понял конечно, поэтому спрошу..  В отдельном отчете тоже в дерево информация выводится?
   Гений 1С
 
5 - 26.04.21 - 19:32
>> Если пишу отдельно запрос в другом отчете и работаю с ним - то отчет выполняется за 2-3 минуты.
Вот это не понял, код можно тоже в студию.

Видимо в настройках схемы такие отборы, что делается долго (вернее их нет). а если просто запрос, то там отборы есть.
Результат то они одинаковый выдают или нет?
   slafor
 
6 - 26.04.21 - 21:46
(4) Да, тоже в дерево. Моя задача - увеличить скорость работы, а результат при этом должен быть одинаковым. Потому что потом он обрабатывается отдельно.
(5) Отборы я задаю в самом запросе. Или это неправильно?

Результат одинаковый.
   slafor
 
7 - 27.04.21 - 00:39
(5) Код запроса

ВЫБРАТЬ
    ПродажиОбороты.Склад КАК Склад,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот,
    СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот,
    ПродажиОбороты.Регистратор КАК Регистратор,
    СУММА(ПродажиОбороты.СтоимостьОборот - ПродажиОбороты.СтоимостьБезСкидокОборот) КАК Скидка,
    ПродажиОбороты.ПериодМесяц КАК ПериодМесяц,
    ПродажиОбороты.Продавец КАК Продавец,
    ВЫБОР
        КОГДА ПродажиОбороты.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
            ТОГДА "По заказу покупателя"
        ИНАЧЕ "Без заказа покупателя"
    КОНЕЦ КАК ПоЗаказу
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.Склад,
    ПродажиОбороты.Регистратор,
    ПродажиОбороты.ПериодМесяц,
    ПродажиОбороты.Продавец,
    ВЫБОР
        КОГДА ПродажиОбороты.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
            ТОГДА "По заказу покупателя"
        ИНАЧЕ "Без заказа покупателя"
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ПартииНаСкладахОбороты.Склад КАК Склад,
    ПартииНаСкладахОбороты.Номенклатура КАК Номенклатура,
    ПартииНаСкладахОбороты.Регистратор КАК Регистратор,
    ПартииНаСкладахОбороты.ПериодМесяц КАК ПериодМесяц,
    ПартииНаСкладахОбороты.СуммаПриход КАК СуммаПриход,
    ПартииНаСкладахОбороты.СуммаРасход КАК СуммаРасход,
    -ПартииНаСкладахОбороты.СуммаОборот КАК СуммаОборот,
    -ПартииНаСкладахОбороты.КоличествоОборот КАК КоличествоОборот,
    ПартииНаСкладахОбороты.КоличествоПриход КАК КоличествоПриход,
    ПартииНаСкладахОбороты.КоличествоРасход КАК КоличествоРасход
ПОМЕСТИТЬ Себест
ИЗ
    РегистрНакопления.ПартииНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПартииНаСкладахОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Продажи.Склад КАК Склад,
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    Продажи.СтоимостьОборот КАК СуммаПродаж,
    Продажи.Регистратор КАК Регистратор,
    Продажи.Скидка КАК Скидка,
    Продажи.ПериодМесяц КАК ПериодМесяц,
    Продажи.Склад.Магазин КАК Магазин,
    Продажи.Продавец КАК Продавец,
    Продажи.ПоЗаказу КАК ПоЗаказу,
    СУММА(Себест.КоличествоПриход) КАК КоличествоПриход,
    СУММА(Себест.КоличествоРасход) КАК КоличествоРасход,
    СУММА(Себест.СуммаРасход) КАК СуммаРасход,
    СУММА(Себест.СуммаПриход) КАК СуммаПриход,
    СУММА(ВЫБОР
            КОГДА Продажи.КоличествоОборот > 0
                ТОГДА ВЫРАЗИТЬ(Себест.СуммаРасход / Себест.КоличествоРасход * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
            КОГДА Продажи.КоличествоОборот < 0
                ТОГДА ВЫРАЗИТЬ(Себест.СуммаПриход / Себест.КоличествоПриход * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
        КОНЕЦ) КАК Себестоимость,
    СУММА(ВЫБОР
            КОГДА Продажи.КоличествоОборот = 0
                ТОГДА Продажи.СтоимостьОборот
            КОГДА Продажи.КоличествоОборот > 0
                ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                            КОГДА Себест.СуммаРасход ЕСТЬ NULL
                                    И Себест.КоличествоРасход ЕСТЬ NULL
                                ТОГДА 0
                            ИНАЧЕ Себест.СуммаРасход / Себест.КоличествоРасход
                        КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
            КОГДА Продажи.КоличествоОборот < 0
                ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                            КОГДА Себест.СуммаПриход ЕСТЬ NULL
                                    И Себест.КоличествоПриход ЕСТЬ NULL
                                ТОГДА 0
                            ИНАЧЕ Себест.СуммаПриход / Себест.КоличествоПриход
                        КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
        КОНЕЦ) КАК ВаловаяПрибыль
ПОМЕСТИТЬ Предитог
ИЗ
    Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ Себест КАК Себест
        ПО (Продажи.Номенклатура = Себест.Номенклатура)
            И (Продажи.Регистратор = Себест.Регистратор)

СГРУППИРОВАТЬ ПО
    Продажи.Склад,
    Продажи.Номенклатура,
    Продажи.Регистратор,
    Продажи.ПериодМесяц,
    Продажи.Склад.Магазин,
    Продажи.Продавец,
    Продажи.ПоЗаказу,
    Продажи.КоличествоОборот,
    Продажи.Скидка,
    Продажи.СтоимостьОборот
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Предитог.Склад КАК Склад,
    Предитог.Номенклатура КАК Номенклатура,
    СУММА(Предитог.Количество) КАК Количество,
    СУММА(Предитог.СуммаПродаж) КАК СуммаПродаж,
    Предитог.Регистратор КАК Регистратор,
    СУММА(Предитог.Скидка) КАК Скидка,
    Предитог.ПериодМесяц КАК ПериодМесяц,
    Предитог.Магазин КАК Магазин,
    Предитог.Продавец КАК Продавец,
    Предитог.ПоЗаказу КАК ПоЗаказу,
    СУММА(Предитог.Себестоимость) КАК Себестоимость,
    СУММА(Предитог.ВаловаяПрибыль) КАК ВаловаяПрибыль
ИЗ
    Предитог КАК Предитог

СГРУППИРОВАТЬ ПО
    Предитог.Склад,
    Предитог.Номенклатура,
    Предитог.Регистратор,
    Предитог.ПериодМесяц,
    Предитог.Магазин,
    Предитог.Продавец,
    Предитог.ПоЗаказу

https://yadi.sk/i/YbPyxL_3L6hn4Q
https://yadi.sk/i/Z34JloE1r1r9BA
   slafor
 
8 - 27.04.21 - 00:44
(7) +
Когда я убираю ПродажиОбороты.ПериодМесяц (я тут не знаю, какой период мне будет нужен - это может быть и месяц, и квартал, и 2 месяца, и год) - мне выдаются неправильные данные по себестоимости.
   slafor
 
9 - 27.04.21 - 19:02
По замеру производительности - больше всего времени уходит на строку
   slafor
 
10 - 27.04.21 - 19:02
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
   slafor
 
11 - 28.04.21 - 18:07
Прошу меня извинить, что опять поднимаю эту тему, но я попробовал делать записи замеров времени, чтобы это было видно и можно было понять причину задержек - но получилось все наоборот. Одна и та же база, в базе только я один, запускаю отчет - а в итоге совершенно разные результаты!
Вот один раз запустил, отчет выполнялся почти 40 минут: https://yadi.sk/i/dcGkglLRE39Eyw.
Вот второй раз, почти сразу после первого. Выполняется 9 минут ) : https://yadi.sk/i/Zb0gv0K2t_NVJg .

Фантастика...
   Classic
 
12 - 28.04.21 - 18:27
Программное выполнение всегда дольше "обычного"
Так что все норм
   slafor
 
13 - 28.04.21 - 18:33
(12) А что значит "программное" выполнение? Оно и там и там программное.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.