Имя: Пароль:
1C
1С v8
Можно ли как-то такое оптимизировать?
0 al_zzz
 
21.02.12
19:46
Задача - получить динамику по магазинам группы и ещё много всего.
Получил такую громоздкую конструкцию пакетных запросов, но из песни слово не выкинешь. Прошу сразу ногами не пинать, так как впрограммирую на снеговике две недели.
ТекстЗапроса = "ВЫБРАТЬ
       |    Склады.Ссылка КАК Ссылка,
       |    Склады.Родитель КАК Родитель
       |ПОМЕСТИТЬ ПодСкладОтдел
       |ИЗ
       |    Справочник.Склады КАК Склады
       |ГДЕ
       |    (НЕ Склады.ПометкаУдаления)
       |    И (НЕ Склады.ЭтоГруппа)
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ПодСкладОтдел.Ссылка КАК Отдел,
       |    ВЫБОР
       |        КОГДА ПодСкладОтдел.Родитель.Родитель.ЭтоГруппа
       |            ТОГДА ПодСкладОтдел.Родитель.Родитель
       |        ИНАЧЕ ПодСкладОтдел.Родитель
       |    КОНЕЦ КАК Склад
       |ПОМЕСТИТЬ ВТ_Склад
       |ИЗ
       |    ПодСкладОтдел КАК ПодСкладОтдел
       |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
       |        ПО ПодСкладОтдел.Родитель = Склады.Ссылка
       |{ГДЕ
       |    ПодСкладОтдел.Ссылка.*}
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ВТ_Склад.Отдел КАК Отдел,
       |    ВТ_Склад.Склад КАК Склад
       |ПОМЕСТИТЬ СкладОтдел
       |{ВЫБРАТЬ
       |    Отдел.*,
       |    Склад.*}
       |ИЗ
       |    ВТ_Склад КАК ВТ_Склад
       |ГДЕ
       |    ВТ_Склад.Склад = &РозничныйСклад
       |{ГДЕ
       |    ВТ_Склад.Склад.* КАК РозничныйСклад}
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ РАЗЛИЧНЫЕ
       |    ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
       |    ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК ОстатокОПТ
       |ПОМЕСТИТЬ ОстатокОПТ_3
       |{ВЫБРАТЬ
       |    Номенклатура.*,
       |    ОстатокОПТ}
       |ИЗ
       |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
       |        ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
       |ГДЕ
       |    ТоварыВРезервеНаСкладахОстатки.Склад = &СкладОПТ
       |    И ТоварыНаСкладахОстатки.Склад = &СкладОПТ
       |    И ТоварыНаСкладахОстатки.КоличествоОстаток > ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)
       |{ГДЕ
       |    ТоварыВРезервеНаСкладахОстатки.Склад КАК СкладОПТ,
       |    ТоварыНаСкладахОстатки.Склад КАК СкладОПТ}
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ РАЗЛИЧНЫЕ
       |    ТоварыНаСкладахОстатки.Номенклатура,
       |    СкладОтдел.Склад,
       |    ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК ОстатокРОЗН
       |ПОМЕСТИТЬ ОстатокРОЗН_4
       |{ВЫБРАТЬ
       |    ОстатокРОЗН}
       |ИЗ
       |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
       |        ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
       |            И ТоварыНаСкладахОстатки.Склад = ТоварыВРезервеНаСкладахОстатки.Склад
       |        ЛЕВОЕ СОЕДИНЕНИЕ СкладОтдел КАК СкладОтдел
       |        ПО ТоварыНаСкладахОстатки.Склад = СкладОтдел.Отдел
       |{ГДЕ
       |    ТоварыВРезервеНаСкладахОстатки.Склад КАК СкладОПТ,
       |    ТоварыНаСкладахОстатки.Склад КАК СкладОПТ}
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ РАЗЛИЧНЫЕ
       |    НоменклатураНормы.Ссылка КАК Ссылка,
       |    НоменклатураНормы.Склад КАК Склад,
       |    НоменклатураНормы.Норма КАК Норма,
       |    НоменклатураНормы.ОптимальнаяНорма КАК ОптимальнаяНорма
       |ПОМЕСТИТЬ НоменклатураСкладНорма_2
       |{ВЫБРАТЬ
       |    Ссылка.*,
       |    Склад.*,
       |    Норма,
       |    ОптимальнаяНорма}
       |ИЗ
       |    Справочник.Номенклатура.Нормы КАК НоменклатураНормы
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СкладОтдел КАК СкладОтдел
       |        ПО НоменклатураНормы.Склад = СкладОтдел.Склад
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    НоменклатураСкладНорма_2.Ссылка,
       |    НоменклатураСкладНорма_2.Склад,
       |    НоменклатураСкладНорма_2.Норма,
       |    НоменклатураСкладНорма_2.ОптимальнаяНорма,
       |    ОстатокОПТ_3.ОстатокОПТ,
       |    ОстатокРОЗН_4.ОстатокРОЗН
       |ИЗ
       |    НоменклатураСкладНорма_2 КАК НоменклатураСкладНорма_2
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстатокОПТ_3 КАК ОстатокОПТ_3
       |        ПО НоменклатураСкладНорма_2.Ссылка = ОстатокОПТ_3.Номенклатура
       |        ЛЕВОЕ СОЕДИНЕНИЕ ОстатокРОЗН_4 КАК ОстатокРОЗН_4
       |        ПО НоменклатураСкладНорма_2.Ссылка = ОстатокРОЗН_4.Номенклатура
       |            И НоменклатураСкладНорма_2.Склад = ОстатокРОЗН_4.Склад";    
   Иначе //Получаем данные по динамике на розничном складе  
       ТекстЗапроса = "ВЫБРАТЬ
                      |    СкладОтдел.Отдел КАК Склад,
                      |    НоменклатураСкладНорма_2.Ссылка КАК Номенклатура
                      |ПОМЕСТИТЬ ТЗНоменклатур
                      |ИЗ
                      |    НоменклатураСкладНорма_2 КАК НоменклатураСкладНорма_2,
                      |    СкладОтдел КАК СкладОтдел
                      |;
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ТЗНоменклатур.Склад,
                      |    ТЗНоменклатур.Номенклатура,
                      |    t.Дата
                      |ПОМЕСТИТЬ ТаблицаДата
                      |ИЗ
                      |    (ВЫБРАТЬ
                      |        ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Дата
                      |    {ВЫБРАТЬ
                      |        Дата}
                      |    ИЗ
                      |        (ВЫБРАТЬ
                      |            0 КАК a
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            1
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            2
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            3
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            4
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            5
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            6
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            7
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            8
                      |        
                      |        ОБЪЕДИНИТЬ
                      |        
                      |        ВЫБРАТЬ
                      |            9) КАК aa
                      |            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                      |                0 КАК b
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                1
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                2
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                3
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                4
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                5
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                6
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                7
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                8
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                9) КАК bb
                      |            ПО (ИСТИНА)
                      |            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                      |                0 КАК c
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                1
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                2
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                3
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                4
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                5
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                6
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                7
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                8
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                9) КАК cc
                      |            ПО (ИСТИНА)
                      |            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                      |                0 КАК d
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                1
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                2
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                3
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                4
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                5
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                6
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                7
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                8
                      |            
                      |            ОБЪЕДИНИТЬ
                      |            
                      |            ВЫБРАТЬ
                      |                9) КАК dd
                      |            ПО (ИСТИНА)
                      |    ГДЕ
                      |        aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК t,
                      |    ТЗНоменклатур КАК ТЗНоменклатур
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ВложенныйЗапрос.Склад,
                      |    ВложенныйЗапрос.Номенклатура,
                      |    ВложенныйЗапрос.НачалоПериода КАК НачалоПериода,
                      |    МАКСИМУМ(ВложенныйЗапрос.Количество) КАК Количество
                      |ПОМЕСТИТЬ Остатки
                      |ИЗ
                      |    (ВЫБРАТЬ
                      |        КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ) КАК НачалоПериода,
                      |        ТоварыНаСкладахОстатки.Склад КАК Склад,
                      |        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
                      |        ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
                      |    ИЗ
                      |        РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоПериода, ) КАК ТоварыНаСкладахОстатки
                      |    
                      |    ОБЪЕДИНИТЬ ВСЕ
                      |    
                      |    ВЫБРАТЬ
                      |        НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ),
                      |        ТоварыНаСкладахОстаткиИОбороты.Склад,
                      |        ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                      |        ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
                      |    ИЗ
                      |        РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты) КАК ВложенныйЗапрос
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ВложенныйЗапрос.НачалоПериода,
                      |    ВложенныйЗапрос.Номенклатура,
                      |    ВложенныйЗапрос.Склад
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    Остатки.НачалоПериода,
                      |    МИНИМУМ(ДОБАВИТЬКДАТЕ(ЕСТЬNULL(ОстаткиКонец.НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1)), СЕКУНДА, -1)) КАК КонецПериода,
                      |    Остатки.Склад,
                      |    Остатки.Номенклатура,
                      |    Остатки.Количество
                      |ПОМЕСТИТЬ ОстаткиПериодами
                      |ИЗ
                      |    Остатки КАК Остатки
                      |        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК ОстаткиКонец
                      |        ПО Остатки.Номенклатура = ОстаткиКонец.Номенклатура
                      |            И Остатки.НачалоПериода < ОстаткиКонец.НачалоПериода
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    Остатки.НачалоПериода,
                      |    Остатки.Номенклатура,
                      |    Остатки.Количество,
                      |    Остатки.Склад
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ТаблицаДата.Дата,
                      |    ТаблицаДата.Склад КАК Склад,
                      |    ТаблицаДата.Номенклатура КАК Номенклатура,
                      |    ВЫБОР
                      |        КОГДА ЕСТЬNULL(ОстаткиПериодами.Количество, 0) > 0
                      |            ТОГДА 1
                      |        ИНАЧЕ 0
                      |    КОНЕЦ КАК Количество
                      |ПОМЕСТИТЬ ОстаткиПоОтделамПоДням
                      |ИЗ
                      |    ТаблицаДата КАК ТаблицаДата
                      |        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПериодами КАК ОстаткиПериодами
                      |        ПО ТаблицаДата.Номенклатура = ОстаткиПериодами.Номенклатура
                      |            И (ТаблицаДата.Дата МЕЖДУ ОстаткиПериодами.НачалоПериода И ОстаткиПериодами.КонецПериода)
                      |            И ТаблицаДата.Склад = ОстаткиПериодами.Склад
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ОстаткиПоОтделамПоДням.Склад,
                      |    ОстаткиПоОтделамПоДням.Номенклатура,
                      |    СУММА(ОстаткиПоОтделамПоДням.Количество) КАК Количество
                      |ПОМЕСТИТЬ ДниВНаличииПоСкладам
                      |ИЗ
                      |    ОстаткиПоОтделамПоДням КАК ОстаткиПоОтделамПоДням
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ОстаткиПоОтделамПоДням.Склад,
                      |    ОстаткиПоОтделамПоДням.Номенклатура
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ПродажиОбороты.Номенклатура,
                      |    СУММА(ПродажиОбороты.КоличествоОборот) КАК Продажа,
                      |    ПродажиОбороты.ДокументПродажи.Склад КАК Склад
                      |ПОМЕСТИТЬ ПродажиПоСкладам
                      |ИЗ
                      |    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СкладОтдел КАК ВТ_Склад
                      |        ПО ПродажиОбороты.ДокументПродажи.Склад = ВТ_Склад.Отдел
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ПродажиОбороты.Номенклатура,
                      |    ПродажиОбороты.ДокументПродажи.Склад
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ДниВНаличииПоСкладам.Номенклатура,
                      |    ДниВНаличииПоСкладам.Склад,
                      |    IsNull(ПродажиПоСкладам.Продажа, 0) КАК Продажа,
                      |    ДниВНаличииПоСкладам.Количество
                      |ПОМЕСТИТЬ ИтогБезЦен
                      |ИЗ
                      |    ДниВНаличииПоСкладам КАК ДниВНаличииПоСкладам
                      |        ЛЕВОЕ СОЕДИНЕНИЕ ПродажиПоСкладам КАК ПродажиПоСкладам
                      |        ПО ДниВНаличииПоСкладам.Склад = ПродажиПоСкладам.Склад
                      |            И ДниВНаличииПоСкладам.Номенклатура = ПродажиПоСкладам.Номенклатура
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
                      |    СРЕДНЕЕ(ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
                      |ПОМЕСТИТЬ Цены
                      |ИЗ
                      |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                      |ГДЕ
                      |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ЦеныНоменклатурыСрезПоследних.Номенклатура
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ИтогБезЦен.Номенклатура КАК Номенклатура,
                      |    ИтогБезЦен.Склад КАК Склад,
                      |    ИтогБезЦен.Продажа КАК Продажа,
                      |    ИтогБезЦен.Количество КАК ДнейВНаличии,
                      |    ВЫБОР КОГДА ИтогБезЦен.Количество=0 ТОГДА 0
                      |    ИНАЧЕ ИтогБезЦен.Продажа/ИтогБезЦен.Количество
                      |    КОНЕЦ КАК Динамика,
                      |    Цены.Цена
                      |ИЗ
                      |    ИтогБезЦен КАК ИтогБезЦен
                      |        ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
                      |        ПО ИтогБезЦен.Номенклатура = Цены.Номенклатура
                      |ГДЕ ИтогБезЦен.Продажа<>0 И ИтогБезЦен.Количество<>0
                      |УПОРЯДОЧИТЬ ПО
                      |    Номенклатура,
                      |    Склад";
1 PR
 
21.02.12
19:47
Взрыв мозга
2 simol
 
21.02.12
19:48
(0) Берешь консоль от TormozIT и смотришь какой подзапрос больше тормозит, его и ускоряешь
3 BOZKURT
 
21.02.12
19:50
(0) пожалей наш и без того измученный мозх..
4 Aleks73
 
21.02.12
19:51
(0) Чё сказать-то хотел ?
Можно ли оптимизировать ? Я не знаю как остальные, но лично я не возражаю.
5 al_zzz
 
21.02.12
20:06
(1) Во-во мой тоже взорвался, когда такое выдал. :-)
(4) Я рад.
6 al_zzz
 
21.02.12
20:07
На клюшках для подсчета дней в наличии имелось очень элегантное решение. К сожалению, для 1с8 оно не подходит.
7 Doomer
 
21.02.12
20:08
(5)Не нужно ничего оптимизировать. Этот запрос нужно отправить в 1С в отдел разрабатывающий типовые конфы. Это будет для них образец какие запросы нужно клипать, чтобы никто ничего не понял.
8 Beduin
 
21.02.12
20:10
(7) В зарплатном отделе, такой запрос за своего примут.
9 Юрий Лазаренко
 
21.02.12
20:27
(8) Неа. Там посмотрят, поржут и скажут: "Неееее, такой легкотней мы не занимаемся!" ))))
10 KarpovDeniska
 
21.02.12
21:40
Выбрать склады.родитель где не склады это группа можешь оптимизировать. ))))