Оптимизация запроса по остаткам на каждый день (остаток, цена пересчитанная)
Есть запрос который получается остатки на каждую дату и цены по ним,идет пересчет потом через валюту
Тема может и заезжена до дыр,но все таки(
Подскажите,как можно оптимизировать?что то в голову не лезет.
PS
Вывожу его через СКД ?
КомпоновщикМакета.Выполнить отрабатывает быстро,моментально почти,а вот ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
тормозит
Прошу совета
Тема может и заезжена до дыр,но все таки(
ВЫБРАТЬ
ТоргОбъекты.Ссылка КАК ТорговыйОб,
СоставТоргОбъекта.Ссылка КАК СкладТорговогоОбъекта,
СоставТоргОбъекта.Склад КАК Склад
ПОМЕСТИТЬ ТорговыйОбъектТаблица
ИЗ
Справочник.ТорговыйОбъект КАК ТоргОбъекты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ТорговыйОбъект.СоставТорговогоОбъекта КАК СоставТоргОбъекта
ПО ТоргОбъекты.Ссылка = СоставТоргОбъекта.Ссылка
ГДЕ
НЕ ТоргОбъекты.ПометкаУдаления
СГРУППИРОВАТЬ ПО
ТоргОбъекты.Ссылка,
СоставТоргОбъекта.Ссылка,
СоставТоргОбъекта.Склад
ИНДЕКСИРОВАТЬ ПО
Склад,
СкладТорговогоОбъекта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПредприятияСоставПрелприятия.Ссылка КАК Предприятие,
ПредприятияСоставПрелприятия.Организация КАК Организация
ПОМЕСТИТЬ ТЗ_Предприятий
ИЗ
Справочник.Предприятия.СоставПреприятия КАК ПредприятияСоставПрелприятия
ГДЕ
НЕ ПредприятияСоставПрелприятия.Ссылка.ПометкаУдаления
СГРУППИРОВАТЬ ПО
ПредприятияСоставПрелприятия.Организация,
ПредприятияСоставПрелприятия.Ссылка
ИНДЕКСИРОВАТЬ ПО
Организация
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПринадлежностьСкладовСрезПоследних.Склад,
ПринадлежностьСкладовСрезПоследних.Организация
ПОМЕСТИТЬ СкладыОрганизаций
ИЗ
РегистрСведений.ПринадлежностьСкладов.СрезПоследних(&КонецПериода, Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)) КАК ПринадлежностьСкладовСрезПоследних
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
ПОМЕСТИТЬ ТЗ_Дат
ИЗ
(ВЫБРАТЬ
0 КАК a
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК aa
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК b
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК bb
ПО (ИСТИНА)
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК c
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК cc
ПО (ИСТИНА)
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК d
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК dd
ПО (ИСТИНА)
ГДЕ
aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
НАЧАЛОПЕРИОДА(ТЗ_Дат.Период, ДЕНЬ) КАК ДатаКалендаря
ПОМЕСТИТЬ Дни
ИЗ
ТЗ_Дат КАК ТЗ_Дат
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Движения.Номенклатура,
ДНИ.ДатаКалендаря КАК Период,
СУММА(ВЫБОР
КОГДА Движения.Период = &НачалоПериода
ТОГДА Движения.КоличествоКонечныйОстаток
ИНАЧЕ ВЫБОР
КОГДА Движения.Период <= ДНИ.ДатаКалендаря
ТОГДА Движения.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ) КАК КоличествоОстаток,
Движения.Склад,
СкладыОрганизаций.Организация,
ЕСТЬNULL(ТорговыйОбъектТаблица.СкладТорговогоОбъекта, ЗНАЧЕНИЕ(справочник.ТорговыйОбъект.пустаяСсылка)) КАК ТорговаяТочка,
ЕСТЬNULL(ТЗ_Предприятий.Предприятие, ЗНАЧЕНИЕ(справочник.Предприятия.пустаяСсылка)) КАК Предприятие,
ЗНАЧЕНИЕ(Справочник.Предприятия.ПустаяСсылка) КАК ПусстаяСсылка
ПОМЕСТИТЬ ТЗ_Остатки
ИЗ
Дни КАК ДНИ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)) КАК Движения
ЛЕВОЕ СОЕДИНЕНИЕ СкладыОрганизаций КАК СкладыОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ ТЗ_Предприятий КАК ТЗ_Предприятий
ПО СкладыОрганизаций.Организация = ТЗ_Предприятий.Организация
ПО Движения.Склад = СкладыОрганизаций.Склад
ЛЕВОЕ СОЕДИНЕНИЕ ТорговыйОбъектТаблица КАК ТорговыйОбъектТаблица
ПО Движения.Склад = ТорговыйОбъектТаблица.Склад
ПО (Движения.Период <= ДНИ.ДатаКалендаря)
СГРУППИРОВАТЬ ПО
Движения.Номенклатура,
ДНИ.ДатаКалендаря,
Движения.Склад,
СкладыОрганизаций.Организация,
ЕСТЬNULL(ТорговыйОбъектТаблица.СкладТорговогоОбъекта, ЗНАЧЕНИЕ(справочник.ТорговыйОбъект.пустаяСсылка)),
ЕСТЬNULL(ТЗ_Предприятий.Предприятие, ЗНАЧЕНИЕ(справочник.Предприятия.пустаяСсылка))
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТЗ_Остатки.Склад,
ТЗ_Остатки.Период КАК Период,
ТЗ_Остатки.Номенклатура КАК Номенклатура,
ЦеныНоменклатуры.Валюта КАК Валюта,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.ЕдиницаИзмерения,
ТЗ_Остатки.Организация,
ТЗ_Остатки.ТорговаяТочка,
ТЗ_Остатки.Предприятие,
ТЗ_Остатки.ПусстаяСсылка,
ТЗ_Остатки.КоличествоОстаток
ПОМЕСТИТЬ ТЗ_ТоварСЦеной
ИЗ
ТЗ_Остатки КАК ТЗ_Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ТЗ_Остатки.Номенклатура = ЦеныНоменклатуры.Номенклатура
И (ЦеныНоменклатуры.ТипЦен.Код = "А00000004")
И (ЦеныНоменклатуры.Период В
(ВЫБРАТЬ
МАКСИМУМ(ЦеныНоменклатуры.Период)
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
ЦеныНоменклатуры.Период <= ТЗ_Остатки.Период
И ЦеныНоменклатуры.Номенклатура = ТЗ_Остатки.Номенклатура
И ЦеныНоменклатуры.ТипЦен.Код = "А00000004"))
ИНДЕКСИРОВАТЬ ПО
Период,
Номенклатура,
Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТЗ_ТоварСЦеной.Период,
ТЗ_ТоварСЦеной.Склад,
ТЗ_ТоварСЦеной.Номенклатура,
ЕСТЬNULL(ВЫРАЗИТЬ(ТЗ_ТоварСЦеной.Цена * ТЗ_ТоварСЦеной.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ТЗ_ТоварСЦеной.ЕдиницаИзмерения.Коэффициент * (КурсыВалют.Курс / КурсыВалют.Кратность) * 1 * ТЗ_ТоварСЦеной.КоличествоОстаток КАК ЧИСЛО(15, 2)), 0) КАК Стоимость,
ТЗ_ТоварСЦеной.Организация,
ТЗ_ТоварСЦеной.ТорговаяТочка,
ТЗ_ТоварСЦеной.Предприятие,
ТЗ_ТоварСЦеной.ПусстаяСсылка,
ТЗ_ТоварСЦеной.КоличествоОстаток
ИЗ
ТЗ_ТоварСЦеной КАК ТЗ_ТоварСЦеной
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ТЗ_ТоварСЦеной.Валюта = КурсыВалют.Валюта
И (КурсыВалют.ВалютаКотировки.Код = "978")
И (КурсыВалют.Период В
(ВЫБРАТЬ
МАКСИМУМ(КурсыВалют.Период)
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Период <= ТЗ_ТоварСЦеной.Период
И КурсыВалют.Валюта = ТЗ_ТоварСЦеной.Валюта
И КурсыВалют.ВалютаКотировки.Код = "978"))
ПоказатьПодскажите,как можно оптимизировать?что то в голову не лезет.
PS
Вывожу его через СКД ?
КомпоновщикМакета.Выполнить отрабатывает быстро,моментально почти,а вот ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
тормозит
Прошу совета
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
я создаю Вт-шки по простым подзапросам, а потом делаю ОДИН сложный запрос с вложенными запросами по этим Вт-шками. Образно можно представить это как метод "матрешки".
важно, чтобы во вложенных запросах были только Вт-шки и уже не было виртуальных или физических таблиц.
"Матрешка" оптимизирует как объем запроса так и его время выполнения
важно, чтобы во вложенных запросах были только Вт-шки и уже не было виртуальных или физических таблиц.
"Матрешка" оптимизирует как объем запроса так и его время выполнения
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот