← вся теориятеория к собесу · Оптимизация запросов 1С

Параметры виртуальных таблиц 1С против ГДЕ

разбор писал Даниил, автор Сеньорчика

Зачем это спрашивают

Виртуальная таблица регистра считает остатки или обороты по запросу. У неё есть параметры: период и условие, которые работают внутри расчёта, а не после него. Вопрос «условие в параметре или в ГДЕ» задают почти на каждом собесе 1С.

// Так спрашивают: «Где ставить условие на склад: в параметре виртуальной таблицы или в ГДЕ?» «Можно ли в параметре Остатки написать условие на остаток?» «Что вернут Остатки на момент времени документа?» «Почему нельзя разыменовывать поле в параметре?»

Внутри расчёта и после

Условие в параметре платформа передаёт внутрь расчёта: остатки считаются только по нужным товарам и складам. Условие в ГДЕ срабатывает после: сначала таблица посчитает остатки по всему регистру, потом лишнее отбросится.

Для остатков и оборотов результат в обоих случаях одинаковый, разница только в скорости. У среза последних результаты расходятся, это отдельная глава.

Что можно в параметр

В условие параметра Остатки годятся измерения регистра: товар, склад, партия. Условие на сам остаток, например КоличествоОстаток < 0, в параметр не поставить: остатка ещё нет, он считается внутри. Его пишут в ГДЕ.

Список значений передают Номенклатура В (&Товары) с массивом или подзапросом из временной таблицы: Номенклатура В (ВЫБРАТЬ Т.Номенклатура ИЗ ВТ_Товары КАК Т). Разыменование внутри параметра, например Номенклатура.Родитель = &Группа, добавляет соединение прямо в расчёт итогов, и выигрыш от параметра пропадает. Условие на поле справочника лучше собрать во временную таблицу заранее.

Период и граница

Первый параметр Остатки задаёт момент, на который нужен остаток. Дата 31.03.2026 означает 31 марта 00:00:00, и все движения последнего дня останутся за границей. Правую границу берут КонецДня.

Если передать &Документ.МоментВремени(), граница не включает сам момент: видны остатки до документа. Так документ видит, что было на складе перед ним, без собственных движений. Чтобы включить момент, передают Новый Граница(МоментВремени, ВидГраницы.Включая).

Как отвечать: «Где поставить условие на склад для Остатков: в параметре или в ГДЕ?»

В параметре виртуальной таблицы. Там условие участвует в расчёте, и остатки считаются только по нужному складу, а в ГДЕ таблица сначала посчитает остатки по всему регистру и только потом отбросит лишнее. Результат для остатков будет одинаковым, разница в скорости, и на большом регистре она в разы. Условие на сам остаток, например меньше нуля, пишу в ГДЕ, в параметре его ещё нет.

Ответ объясняет механизм, честно говорит, что результат совпадает, и отделяет то, что в параметр поставить нельзя. Это показывает понимание, а не заученное «всегда в параметр».

На чём валят

  • −Передают правую границу 31.03 00:00:00. Теряются движения последнего дня. Берут КонецДня.
  • −Разыменовывают поле в параметре (Номенклатура.Родитель). Внутри расчёта появляется соединение. Отбор собирают во временную таблицу.
  • −Пишут условие на остаток в параметр. Остатка ещё нет, он считается внутри. Условие на ресурс пишут в ГДЕ.
  • −Ставят отбор по измерению в ГДЕ на большом регистре. Таблица считает остатки по всему регистру. Отбор по измерениям в параметр.

Проверь себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #oc_vt_params1 / 5
    Какие поля можно указывать в параметре «Условие» таблицы Остатки регистра накопления?
    A)Вычисленные поля остатков и оборотов
    B)Ресурсы, например КоличествоОстаток
    C)Только реквизиты
    D)Измерения регистра
    показать ответ и разбор
    +D)Измерения регистра

    // разбор: Таблица Остатки строится по итогам, а там есть только измерения и ресурсы-суммы. Условие параметра ограничивает, по каким измерениям считать остатки. Условие на сам остаток, например КоличествоОстаток > 0, применяется к уже посчитанному результату, поэтому пишется в ГДЕ.

  2. #oc_vt_params2 / 5
    Как передать в Остатки() список товаров документа?
    A)Остатки() ГДЕ Товар = &Товары с массивом
    B)Остатки(&Товары)
    C)Остатки(, Товар В (&Товары))
    D)Только в цикле, по одному товару за запрос
    показать ответ и разбор
    +C)`Остатки(, Товар В (&Товары))`

    // разбор: Первый параметр Остатки — момент или граница, второй — условие. В условии допустим оператор В со списком: массивом или подзапросом из временной таблицы, например В (ВЫБРАТЬ Товар ИЗ ВТ_Товары). Один запрос на все товары документа вместо цикла.

  3. #oc_vt_params3 / 5
    Что изменится после правки?
     ВЫБРАТЬ О.Товар, О.КоличествоОстаток
    -ИЗ Остатки(&Дата) КАК О
    -ГДЕ О.Склад = &Склад
    +ИЗ Остатки(&Дата,
    +  Склад = &Склад) КАК О
    A)Результат станет другим: появятся строки других складов
    B)Результат тот же, остатки посчитаются только по складу
    C)Запрос упадёт: Склад нельзя в параметре
    D)Ничего, СУБД всё равно перенесёт условие
    показать ответ и разбор
    +B)Результат тот же, остатки посчитаются только по складу

    // разбор: Склад — измерение регистра, поэтому отбор по нему в параметре даёт тот же результат, но остатки считаются только по одному складу. Платформа не переносит условие из ГДЕ внутрь виртуальной таблицы сама. На регистрах с сотнями складов разница во времени — разы.

  4. #oc_vt_params4 / 5
    Условие в параметре: Остатки(, Товар.Родитель В ИЕРАРХИИ (&Группа)). Что важно знать про такое условие?
    A)Разыменование в параметрах виртуальных таблиц запрещено
    B)Добавит соединение внутри расчёта
    C)Иерархия в параметрах не поддерживается
    D)Условие будет проигнорировано платформой
    показать ответ и разбор
    +B)Добавит соединение внутри расчёта

    // разбор: Обращение через точку внутри параметра превращается в соединение с таблицей справочника внутри подзапроса виртуальной таблицы. Это допустимо, но на больших регистрах дорого. Часто быстрее сначала получить список товаров группы во временную таблицу, а в параметре написать Товар В (ВЫБРАТЬ ... ИЗ ВТ).

  5. #oc_vt_params5 / 5
    Нужны товары с отрицательным остатком на складе. Где какое условие?
    A)Склад в параметре, < 0 в ГДЕ
    B)Оба в параметре
    C)Оба условия в ГДЕ после расчёта остатков
    D)Склад — в ГДЕ, остаток — в параметре таблицы
    показать ответ и разбор
    +A)Склад в параметре, `< 0` в ГДЕ

    // разбор: Склад — измерение: отбор по нему в параметре ограничит расчёт. Остаток — результат расчёта, отбор по нему возможен только после, в ГДЕ. Именно так пишут проверку новой методики контроля остатков: товары документа в параметре, отрицательный остаток в ГДЕ.

дальше

Теорию прочитал. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.