|   |   | 
| 
 | Оптимизация запроса цен. УТ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) КАК Сумма |ИЗ | РегистрНакопления." + РегОстатки + ".Остатки(&МоментДокумента, Склад = &Склад {(Номенклатура) КАК Номенклатура}) КАК ОстаткиТоваров | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментДокумента, ТипЦен = &Закупочная {(Номенклатура) КАК Номенклатура}) КАК ЦеныНоменклатурыСрезПоследних | ПО ОстаткиТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура | И ОстаткиТоваров.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры |{ГДЕ | ОстаткиТоваров.Номенклатура КАК Номенклатура, | ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}"; | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |