Имя: Пароль:
1C
1С v8
Оптимизация запроса к регистру накопления
0 kuznkv
 
03.07.15
15:44
подскажите, как оптимизировать запрос, для того, чтобы он выполнялся не 1-2 минуты, а секунд 30
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку
        ИНАЧЕ РасходныйОрдерНаТовары.Ссылка
    КОНЕЦ КАК Распоряжение,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.Дата
        ИНАЧЕ РасходныйОрдерНаТовары.Дата
    КОНЕЦ КАК Дата,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.ДатаВремяРейсаПланС
        ИНАЧЕ РасходныйОрдерНаТовары.ДатаОтгрузки
    КОНЕЦ КАК ДатаОтгрузки,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.Приоритет.Порядок
        ИНАЧЕ РасходныйОрдерНаТовары.Приоритет.Порядок
    КОНЕЦ КАК Приоритет,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.Приоритет
        ИНАЧЕ РасходныйОрдерНаТовары.Приоритет
    КОНЕЦ КАК ПриоритетСсылка,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.Номер
        ИНАЧЕ РасходныйОрдерНаТовары.Номер
    КОНЕЦ КАК Номер,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА ЗНАЧЕНИЕ(Справочник.СкладскиеЯчейки.ПустаяСсылка)
        ИНАЧЕ РасходныйОрдерНаТовары.ЗонаОтгрузки
    КОНЕЦ КАК ЗонаОтгрузки,
    ВЫБОР
        КОГДА РасходныйОрдерНаТовары.ОтгрузкаПоЗаданиюНаПеревозку
                И НЕ &ОтображениеДеталей
            ТОГДА ВЫРАЗИТЬ(РасходныйОрдерНаТовары.ЗаданиеНаПеревозку.ДополнительнаяИнформация КАК СТРОКА(100))
        ИНАЧЕ ВЫРАЗИТЬ(РасходныйОрдерНаТовары.Комментарий КАК СТРОКА(100))
    КОНЕЦ КАК Комментарий,
    РасходныйОрдерНаТовары.Распоряжение.Контрагент КАК Контрагент,
    РасходныйОрдерНаТовары.Распоряжение.ЗонаДоставки КАК ЗонаДоставки
ПОМЕСТИТЬ РаспоряженияНаОтбор
ИЗ
    Документ.РасходныйОрдерНаТовары КАК РасходныйОрдерНаТовары
ГДЕ
    (НЕ &ОтображениеДеталей
            ИЛИ РасходныйОрдерНаТовары.ЗаданиеНаПеревозку = &ЗаданиеНаПеревозку)
    И РасходныйОрдерНаТовары.Склад = &Склад
    И РасходныйОрдерНаТовары.Помещение = &Помещение
    И РасходныйОрдерНаТовары.Проведен
    И РасходныйОрдерНаТовары.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРасходныхОрдеров.КОтбору)
    И РасходныйОрдерНаТовары.ДатаОтгрузки >= &ДатаОтгрузки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ОрдерНаПеремещениеТоваров.Ссылка,
    ОрдерНаПеремещениеТоваров.Дата,
    ОрдерНаПеремещениеТоваров.ДатаОтгрузки,
    ОрдерНаПеремещениеТоваров.Приоритет.Порядок,
    ОрдерНаПеремещениеТоваров.Приоритет,
    ОрдерНаПеремещениеТоваров.Номер,
    ОрдерНаПеремещениеТоваров.ЗонаОтгрузки,
    ВЫРАЗИТЬ(ОрдерНаПеремещениеТоваров.Комментарий КАК СТРОКА(100)),
    NULL,
    NULL
ИЗ
    Документ.ОрдерНаПеремещениеТоваров КАК ОрдерНаПеремещениеТоваров
ГДЕ
    НЕ &ОтображениеДеталей
    И ОрдерНаПеремещениеТоваров.Склад = &Склад
    И ОрдерНаПеремещениеТоваров.ПомещениеОтправитель = &Помещение
    И ОрдерНаПеремещениеТоваров.Проведен
    И ОрдерНаПеремещениеТоваров.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОрдеровНаПеремещение.КОтбору)
    И ОрдерНаПеремещениеТоваров.ДатаОтгрузки >= &ДатаОтгрузки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫБОР
        КОГДА НЕ &ОтображениеДеталей
                И ТоварыКОтборуОстатки.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
                И ВЫРАЗИТЬ(ТоварыКОтборуОстатки.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ОтгрузкаПоЗаданиюНаПеревозку
            ТОГДА ВЫРАЗИТЬ(ТоварыКОтборуОстатки.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ЗаданиеНаПеревозку
        ИНАЧЕ ТоварыКОтборуОстатки.Распоряжение
    КОНЕЦ КАК Распоряжение,
    ТоварыКОтборуОстатки.Номенклатура,
    ТоварыКОтборуОстатки.Характеристика,
    ТоварыКОтборуОстатки.Серия,
    СУММА(ТоварыКОтборуОстатки.КОтборуОстаток) КАК КОтборуОстаток,
    СУММА(ТоварыКОтборуОстатки.ОтбираетсяОстаток) КАК ОтбираетсяОстаток,
    СУММА(ТоварыКОтборуОстатки.ОтобраноОстаток) КАК ОтобраноОстаток
ПОМЕСТИТЬ ТоварыКОтборуОстатки
ИЗ
    РегистрНакопления.ТоварыКОтбору.Остатки(
            ,
            Распоряжение В
                (ВЫБРАТЬ
                    РаспоряженияНаОтбор.Распоряжение
                ИЗ
                    РаспоряженияНаОтбор КАК РаспоряженияНаОтбор)) КАК ТоварыКОтборуОстатки

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОтборРазмещениеТоваровТоварыОтбор.Номенклатура,
    ОтборРазмещениеТоваровТоварыОтбор.Характеристика,
    ВЫБОР
        КОГДА ОтборРазмещениеТоваровТоварыОтбор.СтатусУказанияСерий В (6, 8, 10)
            ТОГДА ОтборРазмещениеТоваровТоварыОтбор.Серия
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    КОНЕЦ КАК Серия,
    СУММА(ОтборРазмещениеТоваровТоварыОтбор.Количество) КАК КоличествоПлан,
    СУММА(ОтборРазмещениеТоваровТоварыОтбор.КоличествоОтобрано) КАК КоличествоОтобрано,
    ВЫБОР
        КОГДА НЕ &ОтображениеДеталей
                И ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
                И ВЫРАЗИТЬ(ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ОтгрузкаПоЗаданиюНаПеревозку
            ТОГДА ВЫРАЗИТЬ(ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ЗаданиеНаПеревозку
        ИНАЧЕ ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение
    КОНЕЦ КАК Распоряжение
ПОМЕСТИТЬ ТоварыВЗаданиях
ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ОтборРазмещениеТоваровТоварыОтбор
ГДЕ
    (ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Проведен
                И ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение В
                    (ВЫБРАТЬ
                        РаспоряженияНаОтбор.Распоряжение
                    ИЗ
                        РаспоряженияНаОтбор
                    ГДЕ
                        НЕ РаспоряженияНаОтбор.Распоряжение ССЫЛКА Документ.ЗаданиеНаПеревозку)
            ИЛИ НЕ &ОтображениеДеталей
                И ВЫРАЗИТЬ(ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ЗаданиеНаПеревозку В
                    (ВЫБРАТЬ
                        РаспоряженияНаОтбор.Распоряжение
                    ИЗ
                        РаспоряженияНаОтбор КАК РаспоряженияНаОтбор
                    ГДЕ
                        РаспоряженияНаОтбор.Распоряжение ССЫЛКА Документ.ЗаданиеНаПеревозку))

СГРУППИРОВАТЬ ПО
    ОтборРазмещениеТоваровТоварыОтбор.Характеристика,
    ВЫБОР
        КОГДА ОтборРазмещениеТоваровТоварыОтбор.СтатусУказанияСерий В (6, 8, 10)
            ТОГДА ОтборРазмещениеТоваровТоварыОтбор.Серия
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    КОНЕЦ,
    ОтборРазмещениеТоваровТоварыОтбор.Номенклатура,
    ВЫБОР
        КОГДА НЕ &ОтображениеДеталей
                И ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
                И ВЫРАЗИТЬ(ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ОтгрузкаПоЗаданиюНаПеревозку
            ТОГДА ВЫРАЗИТЬ(ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение КАК Документ.РасходныйОрдерНаТовары).ЗаданиеНаПеревозку
        ИНАЧЕ ОтборРазмещениеТоваровТоварыОтбор.Ссылка.Распоряжение
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыКОтборуОстатки.Распоряжение,
    ТоварыКОтборуОстатки.Номенклатура КАК Номенклатура,
    ТоварыКОтборуОстатки.Характеристика,
    ТоварыКОтборуОстатки.Серия,
    ТоварыКОтборуОстатки.КОтборуОстаток - ТоварыКОтборуОстатки.ОтобраноОстаток - ТоварыКОтборуОстатки.ОтбираетсяОстаток КАК Количество,
    ВЫБОР
        КОГДА ТоварыКОтборуОстатки.КОтборуОстаток <= ТоварыКОтборуОстатки.ОтобраноОстаток
            ТОГДА 0
        КОГДА ТоварыКОтборуОстатки.КОтборуОстаток <= ТоварыКОтборуОстатки.ОтобраноОстаток + ТоварыКОтборуОстатки.ОтбираетсяОстаток
            ТОГДА 1
        КОГДА ТоварыКОтборуОстатки.КОтборуОстаток <= ТоварыВЗаданиях.КоличествоПлан
            ТОГДА 2
        ИНАЧЕ 100
    КОНЕЦ КАК Состояние,
    РаспоряженияНаОтбор.ДатаОтгрузки,
    РаспоряженияНаОтбор.Приоритет
ПОМЕСТИТЬ СостоянияПоОтбираемымТоварам
ИЗ
    ТоварыКОтборуОстатки КАК ТоварыКОтборуОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ ТоварыВЗаданиях КАК ТоварыВЗаданиях
        ПО ТоварыКОтборуОстатки.Распоряжение = ТоварыВЗаданиях.Распоряжение
            И ТоварыКОтборуОстатки.Номенклатура = ТоварыВЗаданиях.Номенклатура
            И ТоварыКОтборуОстатки.Характеристика = ТоварыВЗаданиях.Характеристика
            И ТоварыКОтборуОстатки.Серия = ТоварыВЗаданиях.Серия
        ПОЛНОЕ СОЕДИНЕНИЕ РаспоряженияНаОтбор КАК РаспоряженияНаОтбор
        ПО ТоварыКОтборуОстатки.Распоряжение = РаспоряженияНаОтбор.Распоряжение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СостоянияПоТоварам.Распоряжение,
    СостоянияПоТоварам.Номенклатура,
    СостоянияПоТоварам.Характеристика,
    СостоянияПоТоварам.Серия,
    СостоянияПоТоварам.Количество,
    СостоянияПоТоварам.Номенклатура.СкладскаяГруппа КАК СкладскаяГруппаНоменклатуры,
    СостоянияПоТоварам.ДатаОтгрузки КАК ДатаОтгрузки,
    СостоянияПоТоварам.Приоритет КАК Приоритет
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
    СостоянияПоОтбираемымТоварам КАК СостоянияПоТоварам
ГДЕ
    СостоянияПоТоварам.Состояние = 100
1 John83
 
03.07.15
15:48
проще по порядку смотреть, какой кусок выполняется дольше и над ним уже думать
2 mikecool
 
03.07.15
15:48
а почему 30, а не 5 секунд??
3 Fragster
 
гуру
03.07.15
15:50
скачать консоль, которая замеряет отдельные куски и посмотреть. например http://devtool1c.ucoz.ru/
4 kuznkv
 
03.07.15
15:51
John83 - код обращения к регистру накоплений. Именно в нем и затык происходит. По отдельности все запросы выполняются моментом. Даже блок запроса к регистру по одному документу летает.
5 kuznkv
 
03.07.15
15:51
mikecool - можно и 5. Даже наверное лучше 5 :)
6 kuznkv
 
03.07.15
15:52
Fragster - сейчас попробую
7 John83
 
03.07.15
15:57
(4) если речь идет про РегистрНакопления.ТоварыКОтбору.Остатки
то могу только посоветовать в параметрах ВТ по возможности сузить отбор по порядку реквизитов.
Т.е. отобрать по первому измерению, потом по второму и т.д.
Для примера
ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(,Номенклатура в (&Номенклатура) и ХарактеристикаНоменклатуры В (&Характеристика))
отработает быстрее, чем просто
ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(, ХарактеристикаНоменклатуры В (&Характеристика))
8 kuznkv
 
03.07.15
16:00
(7) у меня отбор идет уже по списку отобранных распоряжений. Т.е. номенклатура отбирается по условию вхождения в распоряжение(регистратор)
9 John83
 
03.07.15
16:02
(8) какова структура регистра?
10 kuznkv
 
03.07.15
16:07
(9) Измерения:
Распоряжения
Номенклатура
Характеристика
Серия
    Ресурсы:
КОтбору
Отбирается
Отобрано
    Реквизиты:
СерияОтобрано
Упаковка
ОтобраноУпаковок
11 Marine Band
 
03.07.15
16:11
РегистрНакопления.ТоварыКОтбору.Остатки(
            ,
            Распоряжение В
                (ВЫБРАТЬ
                    РаспоряженияНаОтбор.Распоряжение
                ИЗ
                    РаспоряженияНаОтбор КАК РаспоряженияНаОтбор))

Заменить на соединение.

В запросе целый кладезь неоптимального программирования.
12 John83
 
03.07.15
16:12
(10) попробуй при получении своих распоряжений поставить им индекс
PS можешь заодно сравнить с (11)
13 kuznkv
 
03.07.15
16:14
(11) В тестовой базе я так и сделала. Запрос выполняется также. Это первое что я поменяла. :)
14 kuznkv
 
03.07.15
16:14
(12) Ок. Попробую добавить индекс