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