Отбор в параметре виртуальной таблицы

1. AlexeyPapanov 459 10.12.16 12:33 Сейчас в теме
Всем привет!
Пишу отчет на СКД для УТ 10.3.
Суть проблемы в запросе: к таблице продаж я приклеиваю таблицы остатков и резервов. В параметрах последних надо накладывать отбор по номенклатуре, чтобы не получать все остатки.
Но я не пойму как это сделать в рамках СКД.
ВЫБРАТЬ
	ПродажиОбороты.ДокументПродажи.Склад,
	ПродажиОбороты.Номенклатура,
	ЕстьNull(СУММА(ПродажиОбороты.КоличествоОборот),0) КАК Продано,
	ЕстьNull(СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),0) КАК Остаток,
	ЕстьNull(СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток),0) КАК Резерв
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Период, ) КАК ПродажиОбороты
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки
		ПО ПродажиОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
			И ПродажиОбороты.ДокументПродажи.Склад = ТоварыНаСкладахОстатки.Склад
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыВРезервеНаСкладахОстатки
		ПО ПродажиОбороты.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
			И ПродажиОбороты.ДокументПродажи.Склад = ТоварыВРезервеНаСкладахОстатки.Склад

СГРУППИРОВАТЬ ПО
	ПродажиОбороты.Номенклатура,
	ПродажиОбороты.ДокументПродажи,
	ПродажиОбороты.ДокументПродажи.Склад
Показать



Я думал сначала сделать запрос по продажам, потом поместить его во временную таблицу, но ее же нельзя использовать в качестве параметра другой виртуальной таблицы.

Конечно можно и так
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, Номенклатура В (Выбрать ...))

но у меня две таблицы, и в обеих делать так запрос тоже коряво.

Как по красоте сделать?
+
По теме из базы знаний
Найденные решения
2. spacecraft 10.12.16 12:48 Сейчас в теме
(1) зачем делать отбор во всех таблицах? При левом соединении с соединением по номенклатуре будет отбираться только Номенклатура, которая есть в левой таблице. Отбор в данном случае вообще нет смысла делать.
AlexeyPapanov; +1
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 10.12.16 12:48 Сейчас в теме
(1) зачем делать отбор во всех таблицах? При левом соединении с соединением по номенклатуре будет отбираться только Номенклатура, которая есть в левой таблице. Отбор в данном случае вообще нет смысла делать.
AlexeyPapanov; +1
3. AlexeyPapanov 459 10.12.16 13:32 Сейчас в теме
(2) а я наивно думал, что платформа сначала получает данные, а потом их склеивает, отсеивая ненужные строки...
+
4. spacecraft 10.12.16 14:37 Сейчас в теме
(3) это будет, если присутствует отбор через секцию ГДЕ. Причем, если эта секция на правую таблицу, то получится выборка аналогичная внутреннему соединению.
uncle_Vasya; AlexeyPapanov; +2
7. VitaliyCeban 461 11.12.16 20:32 Сейчас в теме
(1) https://its.1c.ru/db/metod8dev#content:5842:hdoc:vtable_join
Таблицу продаж помещаете в временную таблицу, затем еще в 2 временные таблицы выбираете данные по остальным регистрам, обязательно используя отбор Номенклатура В (Выбрать ... Из ВТПродажи). Во всех 3-х запросах индексируете поля по которым будет происходить соединение, и в четвером запросе соединяете предыдущие 3.
Это гарантровано актуально для обычных запросов. В СКД компоновщик обычно добавляет отборы сам (если совпадают имена полей). Хотя лучше всегда добавлять самому.
+
5. aleks xantaev 8 11.12.16 19:15 Сейчас в теме
В любом случае сначала машина получает полную выборку а потом только ее склеивает. Я думаю лучшим вариантом будет данные упаковать во временную таблицу в пакетном запросе а потом ее использовать в качестве параметров виртуальной таблицы в остальных запросах пакета. И по тем полям по которым делаете соединение сделайте индексацию во временной таблицы.
+
6. spacecraft 11.12.16 20:27 Сейчас в теме
(5) для начала попробуйте сделать это:
Я думаю лучшим вариантом будет данные упаковать во временную таблицу в пакетном запросе а потом ее использовать в качестве параметров виртуальной таблицы в остальных запросах пакета.

ждем пример запроса.
+
8. spacecraft 11.12.16 21:31 Сейчас в теме
Не поленился и получил планы запросов. С отбором из временной таблицы в параметрах виртуальных таблиц и без.
Для чистоты эксперимента в обоих запросах использовал формирование временной таблицы.
Полные планы приводить не буду. Приведу итог (статистику):
1 вариант. Без отбора в параметрах виртуальных таблиц:
Statistics: RecordsScanned = 5304, ParseTime = 0, ExecuteTime = 11, BuffersMemory = 178142, ResultRecords = 1526, RecordSize = 9

2 вариант. С отбором:
Statistics: RecordsScanned = 6830, ParseTime = 0, ExecuteTime = 12, BuffersMemory = 178142, ResultRecords = 1526, RecordSize = 9

Очень показательно.

Для обоих вариантов статистика по формированию временной таблицы конечно же одинакова:
Statistics: RecordsScanned = 76646, ParseTime = 0, ExecuteTime = 81, BuffersMemory = 113234, ResultRecords = 1526, RecordSize = 57

Может на очень больших таблицах эффект будет другой, но очень сомневаюсь.
Shmell; +1
9. aleks xantaev 8 12.12.16 09:19 Сейчас в теме
(8) Вы делали замер с индексированной временной таблицей?
+
10. spacecraft 12.12.16 09:30 Сейчас в теме
(9) да, но выборка получилась небольшая и индекс не использовался в плане запроса, при чтении из временной таблицы.
Да дело даже не в индексе, количество просканированных записей показательно.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот