Имя: Пароль:
1C
 
Подскажите,возможно ли оптимизировать данный запрос?
0 ZSSSP
 
20.10.17
11:36
ВЫБРАТЬ
    ВЗ.Номенклатура,
    ВЗ.Склад,
    МАКСИМУМ(ВЗ.Остаток) КАК Остаток
ПОМЕСТИТЬ ТСОИО
ИЗ
    (ВЫБРАТЬ
        ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
        ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
                ,
                ,
                ,
                ,
                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
                    И Склад.Подразделение.ТипПодразделения = &ТипПодразделения) КАК ТоварыНаСкладахОстаткиИОбороты
    ГДЕ
        (ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход > 0)
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ЗначенияТочкиЗаказаСрезПоследних.Номенклатура,
        ЗначенияТочкиЗаказаСрезПоследних.Склад,
        0,
        0,
        0,
        0,
        0
    ИЗ
        РегистрСведений.ЗначенияТочкиЗаказа.СрезПоследних(
                ,
                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
                    И Склад.Подразделение.ТипПодразделения = &ТипПодразделения) КАК ЗначенияТочкиЗаказаСрезПоследних) КАК ВЗ

СГРУППИРОВАТЬ ПО
    ВЗ.Номенклатура,
    ВЗ.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТСОИО.Номенклатура КАК Номенклатура,
    ТСОИО.Склад КАК Склад,
    ТСОИО.Номенклатура.СостояниеНоменклатуры КАК Состояние,
    ЕСТЬNULL(Продажи.КоличествоОборот, 0) КАК Продажи,
    ЕСТЬNULL(ОстаткиМаг.КоличествоОстаток, 0) КАК ОстатокМаг,
    ЕСТЬNULL(ОстаткиОсн.КоличествоОстаток, 0) КАК ОстатокОсн,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗначенияТочкиЗаказаСрезПоследних.ЗначениеТочкиЗаказа, 0) > 0
            ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК ВМатрице,
    ЕСТЬNULL(ЗначенияТочкиЗаказаСрезПоследних.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаВводаВывода
ИЗ
    ТСОИО КАК ТСОИО
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(
                ,
                ,
                ,
                Подразделение.ТипПодразделения = &ТипПодразделения
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК Продажи
        ПО ТСОИО.Номенклатура = Продажи.Номенклатура
            И ТСОИО.Склад = Продажи.Подразделение.Склад
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                ,
                Склад.Подразделение.ТипПодразделения = &ТипПодразделения
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК ОстаткиМаг
        ПО ТСОИО.Номенклатура = ОстаткиМаг.Номенклатура
            И ТСОИО.Склад = ОстаткиМаг.Склад
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                ,
                Склад = &ОсновнойСклад
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК ОстаткиОсн
        ПО ТСОИО.Номенклатура = ОстаткиОсн.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                ,
                ТипЦен = &ТипЦен
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК Цены
        ПО ТСОИО.Номенклатура = Цены.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияТочкиЗаказа.СрезПоследних(
                ,
                Номенклатура В
                    (ВЫБРАТЬ
                        ТСОИО.Номенклатура
                    ИЗ
                        ТСОИО КАК ТСОИО)) КАК ЗначенияТочкиЗаказаСрезПоследних
        ПО ТСОИО.Номенклатура = ЗначенияТочкиЗаказаСрезПоследних.Номенклатура
            И ТСОИО.Склад = ЗначенияТочкиЗаказаСрезПоследних.Склад
1 Лефмихалыч
 
20.10.17
11:42
как минимум, можно в одну временную выбрать все данные которые по нескольку раз получаются из одной и той же виртуальной таблицы.

Потом "Склад.Подразделение.ТипПодразделения" - просто выбери все нужные склады одним запросом и отбирай по "Склад В &СписокСкладов".

это для начала
2 catena
 
20.10.17
11:45
В первой ВТ какую смсыловую нагрузку несет объединение с регистром ЗначенияТочкиЗаказа?
3 asady
 
20.10.17
11:53
(0) зачем юзать ОстаткиИОбороты если интересует только остаток
4 ZSSSP
 
20.10.17
12:08
Данный запрос вставляется в скд.Мне необходимо оптимизировать данный отчет чтобы человек мог сформировать за год данный отчет по нескольким группам номенклатур.
5 Лефмихалыч
 
20.10.17
12:11
(4) тебя укусил канцелярийный комар
Примени рекомендации (1) и (3) и, если будут еще вопросы, возвращайся
6 ZSSSP
 
20.10.17
13:41
Вот таким образом получилось:
ВЫБРАТЬ
    ВЗ.Номенклатура,
    ВЗ.Склад,
    МАКСИМУМ(ВЗ.Остаток) КАК Остаток,
    СУММА(ВЗ.ОстаткиОсновногоСклада) КАК ОстаткиОсновногоСклада
ПОМЕСТИТЬ ТСОИО
ИЗ
    (ВЫБРАТЬ
        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        ТоварыНаСкладахОстатки.Склад КАК Склад,
        ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
        0 КАК ОстаткиОсновногоСклада
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки(
                &КонецПериода,
                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
                    И Склад.Подразделение.ТипПодразделения = &ТипПодразделения) КАК ТоварыНаСкладахОстатки
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ЗначенияТочкиЗаказаСрезПоследних.Номенклатура,
        ЗначенияТочкиЗаказаСрезПоследних.Склад,
        0,
        0
    ИЗ
        РегистрСведений.ЗначенияТочкиЗаказа.СрезПоследних(
                ,
                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
                    И Склад.Подразделение.ТипПодразделения = &ТипПодразделения) КАК ЗначенияТочкиЗаказаСрезПоследних
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ТоварыНаСкладахОстатки.Номенклатура,
        0,
        0,
        ТоварыНаСкладахОстатки.КоличествоОстаток
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки(
                &КонецПериода,
                Склад = &ОсновнойСклад
                    И Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ТоварыНаСкладахОстатки) КАК ВЗ

СГРУППИРОВАТЬ ПО
    ВЗ.Номенклатура,
    ВЗ.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТСОИО.Номенклатура КАК Номенклатура,
    ТСОИО.Склад КАК Склад,
    ТСОИО.Номенклатура.СостояниеНоменклатуры КАК Состояние,
    ЕСТЬNULL(Продажи.КоличествоОборот, 0) КАК Продажи,
    ЕСТЬNULL(ТСОИО.Остаток, 0) КАК ОстатокМаг,
    ЕСТЬNULL(ТСОИО.ОстаткиОсновногоСклада, 0) КАК ОстатокОсн,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗначенияТочкиЗаказаСрезПоследних.ЗначениеТочкиЗаказа, 0) > 0
            ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК ВМатрице,
    ЕСТЬNULL(ЗначенияТочкиЗаказаСрезПоследних.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаВводаВывода
ИЗ
    ТСОИО КАК ТСОИО
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(
                ,
                ,
                ,
                Подразделение.ТипПодразделения = &ТипПодразделения
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК Продажи
        ПО ТСОИО.Номенклатура = Продажи.Номенклатура
            И ТСОИО.Склад = Продажи.Подразделение.Склад
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                ,
                ТипЦен = &ТипЦен
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ТСОИО.Номенклатура
                        ИЗ
                            ТСОИО КАК ТСОИО)) КАК Цены
        ПО ТСОИО.Номенклатура = Цены.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияТочкиЗаказа.СрезПоследних(
                ,
                Номенклатура В
                    (ВЫБРАТЬ
                        ТСОИО.Номенклатура
                    ИЗ
                        ТСОИО КАК ТСОИО)) КАК ЗначенияТочкиЗаказаСрезПоследних
        ПО ТСОИО.Номенклатура = ЗначенияТочкиЗаказаСрезПоследних.Номенклатура
            И ТСОИО.Склад = ЗначенияТочкиЗаказаСрезПоследних.Склад
7 catena
 
20.10.17
13:43
Еще раз спрошу: вот это зачем?

    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ЗначенияТочкиЗаказаСрезПоследних.Номенклатура,
        ЗначенияТочкиЗаказаСрезПоследних.Склад,
        0,
        0
    ИЗ
        РегистрСведений.ЗначенияТочкиЗаказа.СрезПоследних(
                ,
                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
                    И Склад.Подразделение.ТипПодразделения = &ТипПодразделения) КАК ЗначенияТочкиЗаказаСрезПоследних
8 catena
 
20.10.17
13:43
Чтобы было, что потом группировать?
9 Лефмихалыч
 
20.10.17
13:48
(6) доломал только
10 VS-1976
 
20.10.17
13:49
Вот это и нужно оптимизировать

Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
И Склад.Подразделение.ТипПодразделения = &ТипПодразделения

При этом не пользоваться виртуальными таблицами кроме СрезПоследних в данном случае и то правильно пользоваться СрезПоследних
11 ZSSSP
 
20.10.17
14:01
В чем я его сломал я убрал таблицы остатков и поместил их ВТ или можно обойтись одной таблицей остатков?
12 ZSSSP
 
20.10.17
14:05
Скорее всего для группировки.
13 kittystark
 
20.10.17
20:19
а это зачем?

ГДЕ
        (ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход > 0
                ИЛИ ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход > 0)
14 kittystark
 
20.10.17
20:21
а увидел...  уже убрал
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой