Имя: Пароль:
1C
1С v8
Оптимизация запроса цен. УТ10.3
0 1СобакаИли2
 
13.12.23
11:32
Добрый день.
По дефолту запрос смотрит на регистр партий товаров и считает сумму по партиям. Решили изменить расчет суммы по закупочной цене.
Почему-то запрос выполняется в 5 раз дольше, чем типовой по партиям, логика аналогична.
Что здесь можно оптимизировать?

ПостроительОтчета.Текст =
"ВЫБРАТЬ
|	ОстаткиТоваров.Номенклатура КАК Номенклатура,
|	ОстаткиТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
|	ОстаткиТоваров.Качество,
|	СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество,
|	СУММА(ОстаткиТоваров.КоличествоОстаток) * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Сумма
|ИЗ
|	РегистрНакопления." + РегОстатки + ".Остатки(&МоментДокумента, Склад = &Склад) КАК ОстаткиТоваров
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментДокумента, ТипЦен = &Закупочная) КАК ЦеныНоменклатурыСрезПоследних
|		ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|			И ОстаткиТоваров.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
|{ГДЕ
|	ОстаткиТоваров.Номенклатура КАК Номенклатура,
|	ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
|
|СГРУППИРОВАТЬ ПО
|	ОстаткиТоваров.Номенклатура,
|	ОстаткиТоваров.ХарактеристикаНоменклатуры,
|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков,
|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент,
|	ОстаткиТоваров.Качество,
|	ЦеныНоменклатурыСрезПоследних.Цена";
1 Волшебник
 
13.12.23
11:32
справа РегистрСведений.ЦеныНоменклатуры.СрезПоследних без отбора по номенклатуре.
Отбор по остаткам тоже не бережёт ресурсы.

Сначала выберите номенклатуру, загоните во временную таблицу. Потом в параметрах виртуальной таблицы используйте отбор "Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТ_Номенклатура)
2 Радим1987
 
13.12.23
11:37
(0) Судя по всему группировка тут лишняя
3 1СобакаИли2
 
13.12.23
11:58
(1) Это текст запроса, он попадает в ПостроительОтчета, в котором есть отбор по номенклатуре.
То есть сам запрос выполняется уже отсюда:
Запрос = ПостроительОтчета.ПолучитьЗапрос();
4 1СобакаИли2
 
13.12.23
11:59
(2) А если номенклатура одна и та же, но с разной характеристикой?
5 1СобакаИли2
 
13.12.23
12:01
Но единственное что, сам отбор не в виртуальной таблице. Вот итоговый запрос:
ВЫБРАТЬ
    ОстаткиТоваров.Номенклатура КАК Номенклатура,
    ОстаткиТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
    ОстаткиТоваров.Качество КАК Качество,
    ОстаткиТоваров.КоличествоОстаток КАК Количество,
    ОстаткиТоваров.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Сумма
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментДокумента, Склад = &Склад) КАК ОстаткиТоваров
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментДокумента, ТипЦен = &Закупочная) КАК ЦеныНоменклатурыСрезПоследних
        ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ОстаткиТоваров.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
ГДЕ
    ОстаткиТоваров.Номенклатура В ИЕРАРХИИ (&Параметр1)
6 Радим1987
 
13.12.23
12:23
"ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Номенклатура,
        |    ХарактеристикиНоменклатуры.Ссылка КАК ХарактеристикаНоменклатуры
        |ПОМЕСТИТЬ ВТДанные
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
        |        ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
        |ГДЕ
        |    Номенклатура.Ссылка В ИЕРАРХИИ(&Параметр1)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
        |    ТоварыНаСкладахОстатки.Качество  КАК Качество,
        |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
        |ПОМЕСТИТЬ ВТОстатки
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
        |            &МоментВремени,
        |            Склад = &Склад
        |                И (Номенклатура, ХарактеристикаНоменклатуры) В
        |                    (ВЫБРАТЬ
        |                        ВТДанные.Номенклатура КАК Номенклатура,
        |                        ВТДанные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
        |                    ИЗ
        |                        ВТДанные КАК ВТДанные)) КАК ТоварыНаСкладахОстатки  + Индекс
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
        |    ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
        |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
        |ПОМЕСТИТЬ ВТЦены
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
        |            &МоментВремени,
        |            ТипЦен = &Закупочная
        |                И (Номенклатура, ХарактеристикаНоменклатуры) В
        |                    (ВЫБРАТЬ
        |                        ВТДанные.Номенклатура КАК Номенклатура,
        |                        ВТДанные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
        |                    ИЗ
        |                        ВТДанные КАК ВТДанные)) КАК ЦеныНоменклатурыСрезПоследних + Индекс
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТОстатки.Номенклатура КАК Номенклатура,
        |    ВТОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
        |    ВТОстатки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
           |    ВТОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
        |    ВТОстатки.Качество КАК Качество,
        |    ВТОстатки.КоличествоОстаток КАК КоличествоОстаток,
        |    ВТОстатки.КоличествоОстаток * ЕСТЬNULL(ВТЦены.Цена, 0) КАК Сумма
        |ИЗ
        |    ВТОстатки КАК ВТОстатки
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
        |        ПО ВТОстатки.Номенклатура = ВТЦены.Номенклатура
        |            И ВТОстатки.Характеристика = ВТЦены.Характеристика";
7 Simod
 
13.12.23
12:26
(6) Соединение и выбор характеристики в первом запросе лишнее. По условию задачи не характеристику не накладывается отбор. Только в условиях соединения.
8 1СобакаИли2
 
13.12.23
12:54
(6) Вот это условие динамическое:
|ГДЕ
|    Номенклатура.Ссылка В ИЕРАРХИИ(&Параметр1)

Может быть другой вид сравнения.
Есть ли стд. функция для преобразования отбора в вид?

ИЗ:
Номенклатура Не в списке "&Параметр1"
В:
НЕ Номенклатура В (&Параметр1)
?
9 Simod
 
13.12.23
13:18
(8) Такой функции нет. Но можно воспользоваться приемом:

|....
|ГДЕ
|    &УсловиеНоменклатура

В зависимости от значения Параметр1 (элемент, группа или <пусто>) можно через СтрЗаменить() подменить текст условия и установить параметр. Для <пусто> это будет просто установить Истина без подмены текста, т.е. превратиться в:

|....
|ГДЕ
|    ИСТИНА
10 Timon1405
 
13.12.23
13:28
(5) попробуйте поменять
РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментДокумента, Склад = &Склад) КАК ОстаткиТоваров
на
РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментДокумента, Склад = &Склад {(Номенклатура) КАК Номенклатура}) КАК ОстаткиТоваров
и покажите итоговый текст запроса
11 1СобакаИли2
 
13.12.23
13:41
(10) ВЫБРАТЬ
    ОстаткиТоваров.Номенклатура КАК Номенклатура,
    ОстаткиТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
    ОстаткиТоваров.Качество КАК Качество,
    ОстаткиТоваров.КоличествоОстаток КАК Количество,
    ОстаткиТоваров.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Сумма
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментДокумента, (Склад = &Склад) И Номенклатура В ИЕРАРХИИ(&Параметр1)) КАК ОстаткиТоваров
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментДокумента, ТипЦен = &Закупочная) КАК ЦеныНоменклатурыСрезПоследних
        ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ОстаткиТоваров.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
ГДЕ
    ОстаткиТоваров.Номенклатура В ИЕРАРХИИ (&Параметр2)
12 1СобакаИли2
 
13.12.23
14:18
(10) Спасибо, суть понял. Не знал про параметры построителя...
Работает уверенней.

         "ВЫБРАТЬ
             |    ОстаткиТоваров.Номенклатура КАК Номенклатура,
             |    ОстаткиТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
             |    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
             |    ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
             |    ОстаткиТоваров.Качество,
             |    ОстаткиТоваров.КоличествоОстаток КАК Количество,
             |    ОстаткиТоваров.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Сумма
             |ИЗ
             |    РегистрНакопления." + РегОстатки + ".Остатки(&МоментДокумента, Склад = &Склад {(Номенклатура) КАК Номенклатура}) КАК ОстаткиТоваров
             |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментДокумента, ТипЦен = &Закупочная {(Номенклатура) КАК Номенклатура}) КАК ЦеныНоменклатурыСрезПоследних
             |        ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
             |            И ОстаткиТоваров.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
             |{ГДЕ
             |    ОстаткиТоваров.Номенклатура КАК Номенклатура,
             |    ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}";