Имя: Пароль:
1C
1С v8
Оптимизация запроса получения остатков на каждый день.
0 serg-lom89
 
11.01.18
10:27
добрый день

прошу помощи по оптимизации запроса для получения остатков на каждый день.

вот запрос который получает остатки (количество )


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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Склад
;



вот запрос
Который получается для литража

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Движения.Номенклатура КАК Номенклатура,
    ДНИ.Период КАК Дата_,
    ВЫБОР
        КОГДА Движения.Период = &НачалоПериода
            ТОГДА Движения.КоличествоКонечныйОстаток
        ИНАЧЕ ВЫБОР
                КОГДА Движения.Период <= ДНИ.Период
                    ТОГДА Движения.КоличествоОборот
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ * Движения.Номенклатура.ЕдиницаХраненияОстатков.Литраж КАК КоличествоОстаток,
    0 КАК ПересчитаннаяЦена,
    0 КАК Стоимость,
    Движения.Склад КАК Склад,
    ЕСТЬNULL(СкладыОрганизаций.Организация, ЗНАЧЕНИЕ(справочник.организации.пустаяссылка)) КАК ОрганизацияСкладов
ПОМЕСТИТЬ втБезЦены
ИЗ
    Дни КАК ДНИ,
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный) {(Склад), (Номенклатура), (Номенклатура.НоменклатурнаяГруппа), (Номенклатура.НоменклатурнаяГруппа.Поставщик), (Номенклатура.ОсновнойПоставщик), (Номенклатура.Закрыт), (Номенклатура.Распродажа)}) КАК Движения
        ЛЕВОЕ СОЕДИНЕНИЕ СкладыОрганизаций КАК СкладыОрганизаций
        ПО Движения.Склад = СкладыОрганизаций.Склад

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Склад

понятно что все получается через точку и это не есть хорошо.
Подскажите как можно оптимизировать?
1 Borteg
 
11.01.18
10:30
(0) РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный) {(Склад), (Номенклатура), (Номенклатура.НоменклатурнаяГруппа),

сначала в запросе определить все склады которые там нужны, потом передать склад в (вложенный запрос по складам)
2 serg-lom89
 
11.01.18
10:32
(1)
вопрос в том что если по всем складам
3 Borteg
 
11.01.18
10:32
(2) Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)
4 Borteg
 
11.01.18
10:33
(3) эта конструкция адски усложняет оптимизатору жизнь и сам запрос. Если там будут уже склады в которых значение не виртуальный будет намного лучше
5 cw014
 
11.01.18
10:36
А зачем тут дни тянутся без связи?
6 serg-lom89
 
11.01.18
10:45
(5) потом вывожу периодичностью по дням
7 serg-lom89
 
11.01.18
11:05
что то не могу "допереть" насчет условия по датам
8 Borteg
 
11.01.18
11:29
(7) склады переделал уже? у зачемвообще оптимизируешь? запрос выполняет долго?
9 Вафель
 
11.01.18
11:44
а почему дни и движения никак не соединяются?
10 Вафель
 
11.01.18
11:45
(8) не поможет с вероятностью 99.9999%
11 Timon1405
 
11.01.18
11:48
12 Borteg
 
11.01.18
12:34
(10) поможет 100%, скорей всего это скд и связь там произведена.
13 Antony8x
 
11.01.18
12:39
(12) Что сомнительно в плане производительности
14 breezee
 
11.01.18
12:56
(1) Лучше во внутреннее соединение, так вроде (!ВРОДЕ!) быстрее будет работать
15 VS-1976
 
11.01.18
13:26
Так как конструктор непонятно как построит запрос ( может быть очень ужасный план исполнения ), то лучше сделать что-то подобное. Не перетендую на истину. В выборке { Номенклатура }, не всегда хорошо если иерархия большая, это сильно сказывается на произодительности...

ВЫБРАТЬ
    спрСклад.Ссылка КАК Склад

ПОМЕСТИТЬ втФильтрПоСкладам

ИЗ
    Справочник.Склады КАК спрСклад
ГДЕ
    ТипСклада <> ЗНАЧЕНИЕ( перечисление.типыСкладов.виртуальный )
{ ГДЕ
    спрСклад.Ссылка КАК Склад }
;

ВЫБРАТЬ
    Склад,
    Номенклатура,
    ...

ПОМЕСТИТЬ втДанные

ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты( &НачалоПериода, &КонецПериода, ДЕНЬ, , Склад В ( ВЫБРАТЬ Склад ИЗ втФильтрПоСкладам ) {Номенклатура} )
;

ВЫБРАТЬ
    втНоменклатура.Номенклатура

ПОМЕСТИТЬ втФильтрПоНоменклатуре

ИЗ
    ( ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура ИЗ втДанные ) КАК втНоменклатура

    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
        по спрНоменклатура.Ссылка = втНоменклатура.Номенклатура
{ ГДЕ
    спрНоменклатура.НоменклатурнаяГруппа,
    Номенклатура.НоменклатурнаяГруппа.Поставщик КАК Поставщик,
    спрНоменклатура.Закрыт,
    спрНоменклатура.ОсновнойПоставщик,
    спрНоменклатура.Распродажа }

ИНДЕКСИРОВАТЬ ПО
    втНоменклатура.Номенклатура
;

ВЫБРАТЬ
    ...
ИЗ
    втДанные

    СОЕДИНЕНИЕ втФильтрПоНоменклатуре
        ПО втФильтрПоНоменклатуре.Номенклатура = втДанные.Номенклатура
16 VS-1976
 
11.01.18
13:54
Ошибка

Номенклатура.НоменклатурнаяГруппа.Поставщик КАК Поставщик,

Читать как

спрНоменклатура.НоменклатурнаяГруппа.Поставщик КАК Поставщик,
17 Радим1987
 
11.01.18
13:59
Если СКД то лучше использовать 2 НабораДанных и в первым даты+ некоторые параметры во втором остатки из регистра  РегистрНакопления.ТоварыНаСкладах.ОСТАТКИ
18 Timon1405
 
11.01.18
14:02
(17) то есть фактически поиметь запрос в цикле + что еще печальнее, соединение наборов происходит на клиенте.
19 VS-1976
 
11.01.18
14:02
(17) На каждый день в течении месяца, при больших движения за день? Вы хотите к примеру за 31 день взять остатки? Это может сильно замедлить...
20 Радим1987
 
11.01.18
14:05
(19) Личный опыт одним запросом медленнее, чем 2 мя наборами
21 VS-1976
 
11.01.18
14:06
(18) Остатки вычисляются так: Остаток текущий - движения до даты..., а ОстаткиИОбороты ( Остаток + Сгруппированные Движения ) для периода ДЕНЬ рассчитываются после выборки, а не отбираются на каждый день...
22 Радим1987
 
11.01.18
14:11
(21) Это тоже самое на каждый день
23 VS-1976
 
11.01.18
14:11
(22) С чего ты взял что тоже самое, я всё расписал. Прочти несколько раз до просветления
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой