Версия для печати темы (https://pro1c.org.ua/index.php?s=8af6e1342c508e5c19fb5feb97f2fc9f&showtopic=19463)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Помогите оптимизировать код

Автор: Zlyukka 22.08.14, 7:48



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


В таком варианте код работает, но очень медленно. Кто может подсказать какие – то варианты по оптимизации.

Автор: logist 22.08.14, 8:13

Сделать отчет на СКД не предлагать?

Автор: Zlyukka 22.08.14, 8:20

Цитата(logist @ 22.08.14, 8:13) *
Сделать отчет на СКД не предлагать?

Ненуна

Автор: logist 22.08.14, 8:22

Цитата(Zlyukka @ 22.08.14, 8:20) *
Ненуна

В таком случае тут вряд ли можно что-то оптимизировать. Разве что данные брать не из документа а из регистра (если он есть и делает нужные движения)

Автор: Zlyukka 22.08.14, 8:32

Цитата(logist @ 22.08.14, 8:22) *
В таком случае тут вряд ли можно что-то оптимизировать. Разве что данные брать не из документа а из регистра (если он есть и делает нужные движения)

Да тормозит не столько запрос , сколько вывод в цикле когда перебирает данные.

Автор: logist 22.08.14, 8:33

Цитата(Zlyukka @ 22.08.14, 8:32) *
сколько вывод в цикле когда перебирает данные.

На этот вопрос я уже ответил выше wink.gif

Автор: Zlyukka 22.08.14, 10:23

Решение:

Пока ОбщВыб.Следующий() Цикл
        ДискКлВыб=ОбщВыб.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ДисконтКл");
        ВсегоКарт=ДискКлВыб.Количество();
        ТекКарт=0;
        Пока ДискКлВыб.Следующий() Цикл
            ТекКарт=ТекКарт+1;
            Состояние("Обрабатываю "+ОКР(ТекКарт*100/ВсегоКарт)+"% карт");
            ОСЗ.Параметры.Карт=ДискКлВыб.ДисконтКл.КартНом;
            Таб.Вывести(ОСЗ);
            //ПВыб=ДискКлВыб.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период");
            //Пока ПВыб.Следующий() Цикл                   
            //    Кол=ПВыб.Время;
            //    Сум=ПВыб.Сумма;                            
            //    ОСМ.Параметры.Заполнить(Новый Структура("Кол,Сум",Кол,Сум));
            //    Таб.Присоединить(ОСМ);
            //КонецЦикла;
            
            Пока ПериодВыб.Следующий() Цикл    
                Кол=0;
                Сум=0;
                ОбработкаПрерыванияПользователя();
                ДисВыб=ДискКлВыб.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период");
                Пока ДисВыб.НайтиСледующий(Новый Структура("Период", ПериодВыб.Период)) Цикл
                    Кол=ДисВыб.Время;
                    Сум=ДисВыб.Сумма;
                КонецЦикла;
                ОСМ.Параметры.Заполнить(Новый Структура("Кол,Сум",Кол,Сум));
                Таб.Присоединить(ОСМ);                
            КонецЦикла;         
            ПериодВыб.Сбросить();
        КонецЦикла;
    КонецЦикла;

Автор: zetovich 22.08.14, 12:33

Условие нужно пихать в
"|ИЗ
| Документ.ПродажиТочек.Товары(<сюда>) КАК ПродажиТочекТовары"
а то у Вас сначала выбирается все а потом накладывается условие, а нужно выбирать уже с условием.

а вообще, да СКД пора бы учить...
п.с. универсальный отчет в конце концов..

Автор: Zlyukka 22.08.14, 12:41

Цитата(zetovich @ 22.08.14, 12:33) *
Условие нужно пихать в
"|ИЗ
| Документ.ПродажиТочек.Товары(<сюда>) КАК ПродажиТочекТовары"
а то у Вас сначала выбирается все а потом накладывается условие, а нужно выбирать уже с условием.

а вообще, да СКД пора бы учить...
п.с. универсальный отчет в конце концов..

А вы с регистрами не путаете? Если нет, то более подробный пример условия. И СКД не всегда подходит.

Автор: zetovich 22.08.14, 19:26

Цитата(Zlyukka @ 22.08.14, 13:41) *
А вы с регистрами не путаете? Если нет, то более подробный пример условия. И СКД не всегда подходит.

Именно, перепутал smile.gif
а что говорит замер производительности? На что больше времени уходит?

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua