Имя: Пароль:
1C
1С v8
Оптимизация запроса в СКД
0 deathogre
 
27.07.16
10:38
Здравствуйте гуру 1с. Очень помогли мне в прошлой теме. Еще одна задачка. Есть отчет на СКД, стал медленно работать. Можно его оптимизировать?

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

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

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

1. Переделать первые 2 ВТ следующим образом ...
Получить данные с регистра без отбора "Магазин <> ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)" (Получится одна общая таблица и её уже разбить на 2 ВТ как в твоём варианте.

Profit : вместо 2-х обращений к регистру "РегистрСведений.СебестоимостьНоменклатуры" - будет одно обращение => ожидание блокировки уменьшится.

2. В 2-х ВТ сделать Индексирование по полям , по которым ты делаешь соединение в результирующей таблице. Т.е. Номенклатура, Характеристика, Магазин.

Profit : Соединение результирующей таблицы будет отрабатывать по индексам, а не перебором.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс