Имя: Пароль:
1C
 
Помогите оптимизировать запрос !
0 antihacker
 
15.08.18
07:11
Всем привет !

Вот  код !

Если НЕ ВРазрезеБюджета Тогда
ПоляДляИтога = "НомерРаздела,Код1,Код2,Код3,Код4,Код5,Код6";
Иначе
ПоляДляИтога = "НомерРаздела,Бюджет,Код1,Код2,Код3,Код4,Код5";
КонецЕсли;    

       |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИмпортФорма127 КАК Бюджеты
    |ПО ИмпортФорма127.Бюджет = Бюджеты.Бюджет  ГДЕ

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
     |    ИмпортФорма127.Бюджет     КАК Бюджет,
    |    ИмпортФорма127.НомерРаздела     КАК НомерРаздела,                
    |    0 КАК Код1,
    |    0 КАК Код2,
    |    ВЫБОР
    |        КОГДА &вхПоКатегория
    |            ТОГДА ИмпортФорма127.КПиКР.КатегорияПоступления
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код3,                
    |    ВЫБОР
    |        КОГДА &вхПоКласс
    |            ТОГДА ИмпортФорма127.КПиКР.КлассПоступления
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код4,
    |    ВЫБОР
    |        КОГДА &вхПоПодкласс
    |            ТОГДА ИмпортФорма127.КПиКР.ПодклассПоступления
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код5,
    |    ВЫБОР
    |        КОГДА &вхПоСпецифике
    |            ТОГДА ИмпортФорма127.КПиКР.СпецификаПоступления
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код6,
    |                
    |    ИмпортФорма127.УтвержденныйБюджет  КАК УтвержденныйБюджет,
    |    ИмпортФорма127.УточненныйБюджет  КАК УточненныйБюджет,
    |    ИмпортФорма127.СкорректированныйБюджет  КАК СкорректированныйБюджет,
    |    ИмпортФорма127.СводныйПланПоступленийПоПлатежам  КАК СводныйПланПоступленийПоПлатежам,
    |    ИмпортФорма127.СводныйПланПоОбязательствам  КАК СводныйПланПоОбязательствам,
    |    ИмпортФорма127.ПринятыеОбязательства  КАК ПринятыеОбязательства,
    |    ИмпортФорма127.НеоплаченныеОбязательства  КАК НеоплаченныеОбязательства,
    |    ИмпортФорма127.ОбщееИсполнение  КАК ОбщееИсполнение
    //|    ((ИмпортФорма127.ОбщееИсполнение*100)/ИмпортФорма127.СкорректированныйБюджет)  КАК ИсполнениеПроцентПоле12
    |    
    |   ПОМЕСТИТЬ ВТ_ИмпортФормаКПиКР
    |    
    |   ИЗ
    |    РегистрСведений.ИмпортФорма127 КАК ИмпортФорма127 ГДЕ ИмпортФорма127.Регистратор В (&вхРегистраторы)  И ИмпортФорма127.НомерРаздела = &НомерРаздела1   И
    |   ВЫБОР
    |   КОГДА &ОтборПоКатегорий
    |      ТОГДА ИмпортФорма127.КПиКР.КатегорияПоступления В (&СписокКатегорий)
    |   ИНАЧЕ ИСТИНА
    |КОНЕЦ
    |И ВЫБОР
    |КОГДА &ОтборПоКлассов
    |      ТОГДА    ИмпортФорма127.КПиКР.КлассПоступления В (&СписокКлассов)
    |ИНАЧЕ ИСТИНА
    |КОНЕЦ
    |И ВЫБОР
    |КОГДА &ОтборПоПодКлассов
    |      ТОГДА    ИмпортФорма127.КПиКР.ПодклассПоступления В (&СписокПодКлассов)
    |ИНАЧЕ ИСТИНА
    |КОНЕЦ
    |И ВЫБОР
    |КОГДА &ОтборПоСпецификеПоступлений
    |      ТОГДА    ИмпортФорма127.КПиКР.СпецификаПоступления В (&СписокСпецификПоступлений)
    |ИНАЧЕ ИСТИНА
    |КОНЕЦ
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |    
    |    ВЫБРАТЬ
     |    ИмпортФорма127.Бюджет                                 КАК Бюджет,
    |    ИмпортФорма127.НомерРаздела                           КАК НомерРаздела,        
    |    ИмпортФорма127.КПиКР.ФКР.АБП.ФункциональнаяГруппа     КАК Код1,
    |    ИмпортФорма127.КПиКР.ФКР.АБП.ФункциональнаяПодгруппа  КАК Код2,
    |    ВЫБОР
    |        КОГДА &вхПоАБП
    |            ТОГДА ИмпортФорма127.КПиКР.ФКР.АБП
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код3,                
    |    ВЫБОР
    |        КОГДА &вхПоПР
    |            ТОГДА ИмпортФорма127.КПиКР.ФКР.Программа
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код4,
    |    ВЫБОР
    |        КОГДА &вхПоППР
    |            ТОГДА ИмпортФорма127.КПиКР.ФКР.Подпрограмма
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код5,
    |    ВЫБОР
    |        КОГДА &вхПоСП
    |            ТОГДА ИмпортФорма127.КПиКР.ЭКР
    |        ИНАЧЕ NULL
    |    КОНЕЦ КАК Код6,
    |                
    |    ИмпортФорма127.УтвержденныйБюджет  КАК УтвержденныйБюджет,
    |    ИмпортФорма127.УточненныйБюджет  КАК УточненныйБюджет,
    |    ИмпортФорма127.СкорректированныйБюджет  КАК СкорректированныйБюджет,
    |    ИмпортФорма127.СводныйПланПоступленийПоПлатежам  КАК СводныйПланПоступленийПоПлатежам,
    |    ИмпортФорма127.СводныйПланПоОбязательствам  КАК СводныйПланПоОбязательствам,
    |    ИмпортФорма127.ПринятыеОбязательства  КАК ПринятыеОбязательства,
    |    ИмпортФорма127.НеоплаченныеОбязательства  КАК НеоплаченныеОбязательства,
    |    ИмпортФорма127.ОбщееИсполнение  КАК ОбщееИсполнение
    //|    ((ИмпортФорма127.ОбщееИсполнение*100)/ИмпортФорма127.СкорректированныйБюджет)  КАК ИсполнениеПроцентПоле12    
    |            
    |    ИЗ
    |    РегистрСведений.ИмпортФорма127 КАК ИмпортФорма127 ГДЕ ИмпортФорма127.Регистратор В (&вхРегистраторы) И ИмпортФорма127.НомерРаздела = &НомерРаздела2  И
    |    ВЫБОР
    |    КОГДА &ОтборПоАБП
    |          ТОГДА ИмпортФорма127.КПиКР.ФКР.АБП В (&СписокАБП)
    |    ИНАЧЕ ИСТИНА
    |    КОНЕЦ
    |    И ВЫБОР
    |    КОГДА &ОтборПоПР
    |      ТОГДА    ИмпортФорма127.КПиКР.ФКР.Программа В (&СписокПР)
    |    ИНАЧЕ ИСТИНА
    |    КОНЕЦ
    |    И ВЫБОР
    |    КОГДА &ОтборПоППР
    |      ТОГДА    ИмпортФорма127.КПиКР.ФКР.ПодПрограмма В (&СписокППР)
    |    ИНАЧЕ ИСТИНА
    |    КОНЕЦ
    |    И ВЫБОР
    |    КОГДА &ОтборПоСП
    |      ТОГДА    ИмпортФорма127.КПиКР.ЭКР В (&СписокСП)
    |    ИНАЧЕ ИСТИНА
    |    КОНЕЦ
    |    ;
    |    ВЫБРАТЬ
     |    ВТ_ИмпортФормаКПиКР.Бюджет     КАК Бюджет,                
    |    ВТ_ИмпортФормаКПиКР.НомерРаздела     КАК НомерРаздела,
    |    ВТ_ИмпортФормаКПиКР.Код1     КАК Код1,
    |    ВТ_ИмпортФормаКПиКР.Код2     КАК Код2,
    |    ВТ_ИмпортФормаКПиКР.Код3     КАК Код3,
    |    ВТ_ИмпортФормаКПиКР.Код4     КАК Код4,
    |    ВТ_ИмпортФормаКПиКР.Код5     КАК Код5,
    |    ВТ_ИмпортФормаКПиКР.Код6     КАК Код6,                
    |    ВТ_ИмпортФормаКПиКР.УтвержденныйБюджет  КАК УтвержденныйБюджет,
    |    ВТ_ИмпортФормаКПиКР.УточненныйБюджет  КАК УточненныйБюджет,
    |    ВТ_ИмпортФормаКПиКР.СкорректированныйБюджет  КАК СкорректированныйБюджет,
    |    ВТ_ИмпортФормаКПиКР.СводныйПланПоступленийПоПлатежам  КАК СводныйПланПоступленийПоПлатежам,
    |    ВТ_ИмпортФормаКПиКР.СводныйПланПоОбязательствам  КАК СводныйПланПоОбязательствам,
    |    ВТ_ИмпортФормаКПиКР.ПринятыеОбязательства  КАК ПринятыеОбязательства,
    |    ВТ_ИмпортФормаКПиКР.НеоплаченныеОбязательства  КАК НеоплаченныеОбязательства,
    |    ВТ_ИмпортФормаКПиКР.ОбщееИсполнение  КАК ОбщееИсполнение,
    |    ВЫБОР
    |   КОГДА ВТ_ИмпортФормаКПиКР.СкорректированныйБюджет <> 0
    |   ТОГДА (ВТ_ИмпортФормаКПиКР.ОбщееИсполнение * 100) / ВТ_ИмпортФормаКПиКР.СкорректированныйБюджет
    |   ИНАЧЕ 0
    |   КОНЕЦ КАК ИсполнениеПроцентПоле11,    
    |    ВЫБОР
    |   КОГДА ВТ_ИмпортФормаКПиКР.СводныйПланПоступленийПоПлатежам <> 0
    |   ТОГДА (ВТ_ИмпортФормаКПиКР.ОбщееИсполнение * 100) / ВТ_ИмпортФормаКПиКР.СводныйПланПоступленийПоПлатежам
    |   ИНАЧЕ 0
    |   КОНЕЦ КАК ИсполнениеПроцентПоле12    
    |    
    |    ИЗ  ВТ_ИмпортФормаКПиКР
    |
    |    УПОРЯДОЧИТЬ ПО
    |    ВТ_ИмпортФормаКПиКР.Бюджет,
    |    ВТ_ИмпортФормаКПиКР.НомерРаздела,        
    |    ВТ_ИмпортФормаКПиКР.Код3.КодКатегории,    
    |    ВТ_ИмпортФормаКПиКР.Код4.КодКласса,
    |    ВТ_ИмпортФормаКПиКР.Код5.КодПодкласса,
    |    ВТ_ИмпортФормаКПиКР.Код6.КодСпецифики,
    |    ВТ_ИмпортФормаКПиКР.Код3.КодАБП,
    |    ВТ_ИмпортФормаКПиКР.Код4.Код,
    |   ВТ_ИмпортФормаКПиКР.Код5.Код,
    |   ВТ_ИмпортФормаКПиКР.Код6.Код
    |    
    |    ИТОГИ
    |    СУММА(УтвержденныйБюджет),
    |    СУММА(УточненныйБюджет),
    |    СУММА(СкорректированныйБюджет),
    |    СУММА(СводныйПланПоступленийПоПлатежам),
    |    СУММА(СводныйПланПоОбязательствам),
    |    СУММА(ПринятыеОбязательства),
    |    СУММА(НеоплаченныеОбязательства),
    |    СУММА(ОбщееИсполнение),    
    |    ВЫБОР
    |   КОГДА СУММА(СводныйПланПоступленийПоПлатежам) <> 0
    |   ТОГДА СУММА(ОбщееИсполнение)/СУММА(СводныйПланПоступленийПоПлатежам)*100
    |   ИНАЧЕ 0
    |   КОНЕЦ КАК ИсполнениеПроцентПоле11,    
    |    ВЫБОР
    |   КОГДА СУММА(СкорректированныйБюджет) <> 0    
    |    ТОГДА СУММА(ОбщееИсполнение)/СУММА(СкорректированныйБюджет)*100
    |   ИНАЧЕ 0
    |   КОНЕЦ КАК ИсполнениеПроцентПоле12    
    |    ПО " + ПоляДляИтога;



ОбщийРезВыборкиНомеруРаздела = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ОбщийРезВыборкиНомеруРаздела.Следующий() Цикл

     ОбщийРезВыборкиПоБюджету = ОбщийРезВыборкиНомеруРаздела.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

     Пока ОбщийРезВыборкиПоБюджету .Следующий() Цикл
           Код1 = ОбщийРезВыборкиПоБюджету.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код1.Следующий() Цикл  
           Код2 = Код1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код2.Следующий() Цикл  
           Код3 = Код2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код3.Следующий() Цикл  
           Код4 = Код3.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код4.Следующий() Цикл  
           Код5 = Код4.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код5.Следующий() Цикл  
           Код6 = Код5.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                  Пока Код6.Следующий() Цикл  
                  КонецЦикла;
                  КонецЦикла;
                  КонецЦикла;
                  КонецЦикла;
                  КонецЦикла;
                  КонецЦикла;
       КонецЦикла;
     КонецЦикла;
КонецЦикла;

Когда ПоляДляИтога = "НомерРаздела,Бюджет,Код1,Код2,Код3,Код4,Код5" все работает прекрасно, а когда ПоляДляИтога = "НомерРаздела,Код1,Код2,Код3,Код4,Код5,Код6"
То

Цикл

                  Пока Код6.Следующий() Цикл  
                  КонецЦикла

не выводит итоги, а детали. Если убрать цикл

Пока Код2.Следующий() Цикл  
           Код3 = Код2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

То все работает прекрасно. Почему ? Ведь уровень группировки в обоих случаях равно на 7.
1 xXeNoNx
 
15.08.18
07:45
(0) шото мне подсказывает что выбор когда в секции ГДЕ - хреновое решение, а еще обращение через 10точек к реквизиту.
2 xXeNoNx
 
15.08.18
07:52
(0) перепиши запрос и возвращайся
3 Borteg
 
15.08.18
07:56
8 обходов по группировкам, а итоговых полей 7