Есть временная таблица с номенклатурой вт_Номенклатура. К ней хочу добавить остатки. Вопрос: нужно ли в виртуальную таблицу остатков добавлять условие Номенклатура В(вт_Номенклатура), если при соединении с временной таблицей я все равно напишу Регистр.Номенклатура = вт_Номенклатура.Номенклатура? Будет ли это более оптимизированно?
---
Не знаю, почему сразу сам не проверил, но сейчас проверил - соединение без условия в виртуальной таблице в моем случае отработало в 60 раз медленнее, чем с условием.
---
Не знаю, почему сразу сам не проверил, но сейчас проверил - соединение без условия в виртуальной таблице в моем случае отработало в 60 раз медленнее, чем с условием.
---
Любой отбор при построении виртуальной таблицы сокращает её размер и поэтому эффективен.
---
Ну в другом запросе почему-то условие на В(ВременнаяТаблица) у меня отрабатывало ОЧЕНЬ долго, зато стоило мне выполнить этот запрос отдельно, выгрузить оттуда результат в массив и подставить в качестве параметра, так оно выполнялось очень быстро.
---
https://its.1c.ru/db/v8std#content:733:hdoc
---
Там не было ответа на вопрос, да и пример неподходящий (в левой таблице не может не быть номенклатуры из правой таблицы).
---
Однозначно перед условием связи нужно указать условия для виртуальной таблицы. СНАЧАЛА выполняются условия для виртуальной таблицы (она обрезается по условиям) а потом происходит связь таблиц.
---
Сейчас я так сделал в запросе своем - у меня он стал выполняться дольше на 10 секунд...
---
```1c
    "ВЫБРАТЬ
    | УчетРезервовТМЦОбороты.Заказ КАК ЗаказНаПроизводство,
    | УчетРезервовТМЦОбороты.Номенклатура КАК Номенклатура,
    | УчетРезервовТМЦОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОбороты.Склад КАК Склад,
    | СУММА(УчетРезервовТМЦОбороты.КоличествоПриход) КАК РезервПриход,
    | СУММА(УчетРезервовТМЦОбороты.КоличествоРасход) КАК РезервРасход
    |ПОМЕСТИТЬ вт_ОборотыРезервов
    |ИЗ
    | РегистрНакопления.УчетРезервовТМЦ.Обороты(&НачалоПериода, &КонецПериода, , Заказ ССЫЛКА Документ.ЗаказНаПроизводство) КАК УчетРезервовТМЦОбороты
    |
    |СГРУППИРОВАТЬ ПО
    | УчетРезервовТМЦОбороты.Заказ,
    | УчетРезервовТМЦОбороты.Номенклатура,
    | УчетРезервовТМЦОбороты.ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОбороты.Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | вт_ОборотыРезервов.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
    | вт_ОборотыРезервов.Номенклатура КАК Номенклатура,
    | вт_ОборотыРезервов.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | вт_ОборотыРезервов.Склад КАК Склад,
    | вт_ОборотыРезервов.РезервПриход КАК РезервПриход,
    | вт_ОборотыРезервов.РезервРасход КАК РезервРасход,
    | УчетРезервовТМЦОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиИОборотыРезервов
    |ИЗ
    | вт_ОборотыРезервов КАК вт_ОборотыРезервов
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетРезервовТМЦ.Остатки(
    | &КонецПериода,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОборотыРезервов.Номенклатура
    | ИЗ
    | вт_ОборотыРезервов)
    | И Заказ В
    | (ВЫБРАТЬ
    | вт_ОборотыРезервов.ЗаказНаПроизводство
    | ИЗ
    | вт_ОборотыРезервов)) КАК УчетРезервовТМЦОстатки
    | ПО вт_ОборотыРезервов.ЗаказНаПроизводство = УчетРезервовТМЦОстатки.Заказ
    | И вт_ОборотыРезервов.Номенклатура = УчетРезервовТМЦОстатки.Номенклатура
    | И вт_ОборотыРезервов.ХарактеристикаНоменклатуры = УчетРезервовТМЦОстатки.ХарактеристикаНоменклатуры
    | И вт_ОборотыРезервов.Склад = УчетРезервовТМЦОстатки.Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ПартииТоваровНаСкладахОбороты.Номенклатура КАК Номенклатура,
    | ПартииТоваровНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ПартииТоваровНаСкладахОбороты.Склад КАК Склад,
    | ПартииТоваровНаСкладахОбороты.КоличествоПриход КАК ОстатокПриход,
    | ПартииТоваровНаСкладахОбороты.КоличествоРасход КАК ОстатокРасход
    |ПОМЕСТИТЬ вт_ОборотыОстатков
    |ИЗ
    | РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
    | &НачалоПериода,
    | &КонецПериода,
    | ,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОстаткиИОборотыРезервов.Номенклатура
    | ИЗ
    | вт_ОстаткиИОборотыРезервов)) КАК ПартииТоваровНаСкладахОбороты,
    | вт_ОстаткиИОборотыРезервов КАК вт_ОстаткиИОборотыРезервов
    |ГДЕ
    | ПартииТоваровНаСкладахОбороты.Номенклатура В (вт_ОстаткиИОборотыРезервов.Номенклатура)
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | вт_ОборотыОстатков.Номенклатура КАК Номенклатура,
    | вт_ОборотыОстатков.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | вт_ОборотыОстатков.Склад КАК Склад,
    | вт_ОборотыОстатков.ОстатокПриход КАК ОстатокПриход,
    | вт_ОборотыОстатков.ОстатокРасход КАК ОстатокРасход,
    | ПартииТоваровНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиИОборотыОстатков
    |ИЗ
    | вт_ОборотыОстатков КАК вт_ОборотыОстатков
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    | &КонецПериода,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОборотыОстатков.Номенклатура
    | ИЗ
    | вт_ОборотыОстатков)) КАК ПартииТоваровНаСкладахОстатки
    | ПО вт_ОборотыОстатков.Номенклатура = ПартииТоваровНаСкладахОстатки.Номенклатура
    | И вт_ОборотыОстатков.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстатки.ХарактеристикаНоменклатуры
    | И вт_ОборотыОстатков.Склад = ПартииТоваровНаСкладахОстатки.Склад"
```
---
Нельзя делать соединения с виртуальными таблицами. Вытащи УчетРезервовТМЦ.Остатки и ПартииТоваровНаСкладах.Остатки тоже в отдельные ВТ. Вот их потом и соединяй, не забыв проиндексировать их по полям связи. И будет тебе счастье.
---
Сделал, еще дольше стало =(

```1c
    "ВЫБРАТЬ
    | УчетРезервовТМЦОбороты.Заказ КАК ЗаказНаПроизводство,
    | УчетРезервовТМЦОбороты.Номенклатура КАК Номенклатура,
    | УчетРезервовТМЦОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОбороты.Склад КАК Склад,
    | СУММА(УчетРезервовТМЦОбороты.КоличествоПриход) КАК РезервПриход,
    | СУММА(УчетРезервовТМЦОбороты.КоличествоРасход) КАК РезервРасход
    |ПОМЕСТИТЬ вт_ОборотыРезервов
    |ИЗ
    | РегистрНакопления.УчетРезервовТМЦ.Обороты(&НачалоПериода, &КонецПериода, , Заказ ССЫЛКА Документ.ЗаказНаПроизводство) КАК УчетРезервовТМЦОбороты
    |
    |СГРУППИРОВАТЬ ПО
    | УчетРезервовТМЦОбороты.Заказ,
    | УчетРезервовТМЦОбороты.Номенклатура,
    | УчетРезервовТМЦОбороты.ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОбороты.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    | ЗаказНаПроизводство,
    | Номенклатура,
    | ХарактеристикаНоменклатуры,
    | Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | УчетРезервовТМЦОстатки.Заказ КАК ЗаказНаПроизводство,
    | УчетРезервовТМЦОстатки.Номенклатура КАК Номенклатура,
    | УчетРезервовТМЦОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОстатки.Склад КАК Склад,
    | СУММА(УчетРезервовТМЦОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиРезервов
    |ИЗ
    | РегистрНакопления.УчетРезервовТМЦ.Остатки(
    | &КонецПериода,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОборотыРезервов.Номенклатура
    | ИЗ
    | вт_ОборотыРезервов)
    | И Заказ В
    | (ВЫБРАТЬ
    | вт_ОборотыРезервов.ЗаказНаПроизводство
    | ИЗ
    | вт_ОборотыРезервов)) КАК УчетРезервовТМЦОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | УчетРезервовТМЦОстатки.Заказ,
    | УчетРезервовТМЦОстатки.Номенклатура,
    | УчетРезервовТМЦОстатки.ХарактеристикаНоменклатуры,
    | УчетРезервовТМЦОстатки.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    | ЗаказНаПроизводство,
    | Номенклатура,
    | ХарактеристикаНоменклатуры,
    | Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | вт_ОборотыРезервов.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
    | вт_ОборотыРезервов.Номенклатура КАК Номенклатура,
    | вт_ОборотыРезервов.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | вт_ОборотыРезервов.Склад КАК Склад,
    | вт_ОборотыРезервов.РезервПриход КАК РезервПриход,
    | вт_ОборотыРезервов.РезервРасход КАК РезервРасход,
    | вт_ОстаткиРезервов.КоличествоОстаток КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиИОборотыРезервов
    |ИЗ
    | вт_ОборотыРезервов КАК вт_ОборотыРезервов
    | ЛЕВОЕ СОЕДИНЕНИЕ вт_ОстаткиРезервов КАК вт_ОстаткиРезервов
    | ПО вт_ОборотыРезервов.ЗаказНаПроизводство = вт_ОстаткиРезервов.ЗаказНаПроизводство
    | И вт_ОборотыРезервов.Номенклатура = вт_ОстаткиРезервов.Номенклатура
    | И вт_ОборотыРезервов.ХарактеристикаНоменклатуры = вт_ОстаткиРезервов.ХарактеристикаНоменклатуры
    | И вт_ОборотыРезервов.Склад = вт_ОстаткиРезервов.Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ПартииТоваровНаСкладахОбороты.Номенклатура КАК Номенклатура,
    | ПартииТоваровНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ПартииТоваровНаСкладахОбороты.Склад КАК Склад,
    | ПартииТоваровНаСкладахОбороты.КоличествоПриход КАК ОстатокПриход,
    | ПартииТоваровНаСкладахОбороты.КоличествоРасход КАК ОстатокРасход
    |ПОМЕСТИТЬ вт_ОборотыОстатков
    |ИЗ
    | РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
    | &НачалоПериода,
    | &КонецПериода,
    | ,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОстаткиИОборотыРезервов.Номенклатура
    | ИЗ
    | вт_ОстаткиИОборотыРезервов)) КАК ПартииТоваровНаСкладахОбороты,
    | вт_ОстаткиИОборотыРезервов КАК вт_ОстаткиИОборотыРезервов
    |ГДЕ
    | ПартииТоваровНаСкладахОбороты.Номенклатура В (вт_ОстаткиИОборотыРезервов.Номенклатура)
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Номенклатура,
    | ХарактеристикаНоменклатуры,
    | Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,
    | ПартииТоваровНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ПартииТоваровНаСкладахОстатки.Склад КАК Склад,
    | СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиОстатков
    |ИЗ
    | РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    | &КонецПериода,
    | Номенклатура В
    | (ВЫБРАТЬ
    | вт_ОборотыОстатков.Номенклатура
    | ИЗ
    | вт_ОборотыОстатков)) КАК ПартииТоваровНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | ПартииТоваровНаСкладахОстатки.Номенклатура,
    | ПартииТоваровНаСкладахОстатки.ХарактеристикаНоменклатуры,
    | ПартииТоваровНаСкладахОстатки.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Номенклатура,
    | ХарактеристикаНоменклатуры,
    | Склад
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | вт_ОборотыОстатков.Номенклатура КАК Номенклатура,
    | вт_ОборотыОстатков.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | вт_ОборотыОстатков.Склад КАК Склад,
    | вт_ОборотыОстатков.ОстатокПриход КАК ОстатокПриход,
    | вт_ОборотыОстатков.ОстатокРасход КАК ОстатокРасход,
    | вт_ОстаткиОстатков.КоличествоОстаток КАК КоличествоОстаток
    |ПОМЕСТИТЬ вт_ОстаткиИОборотыОстатков
    |ИЗ
    | вт_ОборотыОстатков КАК вт_ОборотыОстатков
    | ЛЕВОЕ СОЕДИНЕНИЕ вт_ОстаткиОстатков КАК вт_ОстаткиОстатков
    | ПО вт_ОборотыОстатков.Номенклатура = вт_ОстаткиОстатков.Номенклатура
    | И вт_ОборотыОстатков.ХарактеристикаНоменклатуры = вт_ОстаткиОстатков.ХарактеристикаНоменклатуры
    | И вт_ОборотыОстатков.Склад = вт_ОстаткиОстатков.Склад"
```
---
К оборотом присоединяете остатки. Почему сразу не взять ВТ Остатки и Обороты?
---
Потому что по заказу много оборотов по одной номенклатуре, а мне нужен итог (сколько было до начала выполнения заказа, сколько по нему прихода, расхода, сколько получилось). Если брать таблицу остатков и оборотов, а затем сгруппировать и просуммировать колонки, то в начальном и конечном остатке неверные данные получатся.
---
Условие: Номенклатура В (ВЫБРАТЬ вт_ОборотыРезервов.Номенклатура ИЗ вт_ОборотыРезервов) И ЗАКАЗ В (ВЫБРАТЬ вт_ОборотыРезервов.ЗаказНаПроизводство ИЗ вт_ОборотыРезервов.ЗаказНаПроизводство) неправило.
---
Что не так?
---
Правильно: (Номенклатура, Заказ) В (Выбрать вт_ОборотыРезервов.Номенклатура, вт_ОборотыРезервов.Номенклатура.ЗаказНаПроизводство ИЗ вт_ОборотыРезервов)