Параметры виртуальных таблиц 1С против ГДЕ
Виртуальная таблица регистра считает остатки или обороты по запросу. У неё есть параметры: период и условие, которые работают внутри расчёта, а не после него. Вопрос «условие в параметре или в ГДЕ» задают почти на каждом собесе 1С.
// Так спрашивают: «Где ставить условие на склад: в параметре виртуальной таблицы или в ГДЕ?» «Можно ли в параметре Остатки написать условие на остаток?» «Что вернут Остатки на момент времени документа?» «Почему нельзя разыменовывать поле в параметре?»
Внутри расчёта и после
Условие в параметре платформа передаёт внутрь расчёта: остатки считаются только по нужным товарам и складам. Условие в ГДЕ срабатывает после: сначала таблица посчитает остатки по всему регистру, потом лишнее отбросится.
Для остатков и оборотов результат в обоих случаях одинаковый, разница только в скорости. У среза последних результаты расходятся, это отдельная глава.
Что можно в параметр
В условие параметра Остатки годятся измерения регистра: товар, склад, партия. Условие на сам остаток, например КоличествоОстаток < 0, в параметр не поставить: остатка ещё нет, он считается внутри. Его пишут в ГДЕ.
Список значений передают Номенклатура В (&Товары) с массивом или подзапросом из временной таблицы: Номенклатура В (ВЫБРАТЬ Т.Номенклатура ИЗ ВТ_Товары КАК Т). Разыменование внутри параметра, например Номенклатура.Родитель = &Группа, добавляет соединение прямо в расчёт итогов, и выигрыш от параметра пропадает. Условие на поле справочника лучше собрать во временную таблицу заранее.
Период и граница
Первый параметр Остатки задаёт момент, на который нужен остаток. Дата 31.03.2026 означает 31 марта 00:00:00, и все движения последнего дня останутся за границей. Правую границу берут КонецДня.
Если передать &Документ.МоментВремени(), граница не включает сам момент: видны остатки до документа. Так документ видит, что было на складе перед ним, без собственных движений. Чтобы включить момент, передают Новый Граница(МоментВремени, ВидГраницы.Включая).
Как отвечать: «Где поставить условие на склад для Остатков: в параметре или в ГДЕ?»
В параметре виртуальной таблицы. Там условие участвует в расчёте, и остатки считаются только по нужному складу, а в ГДЕ таблица сначала посчитает остатки по всему регистру и только потом отбросит лишнее. Результат для остатков будет одинаковым, разница в скорости, и на большом регистре она в разы. Условие на сам остаток, например меньше нуля, пишу в ГДЕ, в параметре его ещё нет.
Ответ объясняет механизм, честно говорит, что результат совпадает, и отделяет то, что в параметр поставить нельзя. Это показывает понимание, а не заученное «всегда в параметр».
На чём валят
- −Передают правую границу 31.03 00:00:00. Теряются движения последнего дня. Берут КонецДня.
- −Разыменовывают поле в параметре (
Номенклатура.Родитель). Внутри расчёта появляется соединение. Отбор собирают во временную таблицу. - −Пишут условие на остаток в параметр. Остатка ещё нет, он считается внутри. Условие на ресурс пишут в ГДЕ.
- −Ставят отбор по измерению в ГДЕ на большом регистре. Таблица считает остатки по всему регистру. Отбор по измерениям в параметр.
Проверь себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Какие поля можно указывать в параметре «Условие» таблицы
Остаткирегистра накопления?A)Вычисленные поля остатков и оборотовB)Ресурсы, например КоличествоОстатокC)Только реквизитыD)Измерения регистрапоказать ответ и разбор
+D)Измерения регистра// разбор: Таблица Остатки строится по итогам, а там есть только измерения и ресурсы-суммы. Условие параметра ограничивает, по каким измерениям считать остатки. Условие на сам остаток, например КоличествоОстаток > 0, применяется к уже посчитанному результату, поэтому пишется в ГДЕ.
- Как передать в
Остатки()список товаров документа?A)Остатки() ГДЕ Товар = &Товарыс массивомB)Остатки(&Товары)C)Остатки(, Товар В (&Товары))D)Только в цикле, по одному товару за запроспоказать ответ и разбор
+C)`Остатки(, Товар В (&Товары))`// разбор: Первый параметр Остатки — момент или граница, второй — условие. В условии допустим оператор В со списком: массивом или подзапросом из временной таблицы, например В (ВЫБРАТЬ Товар ИЗ ВТ_Товары). Один запрос на все товары документа вместо цикла.
- Что изменится после правки?
ВЫБРАТЬ О.Товар, О.КоличествоОстаток -ИЗ Остатки(&Дата) КАК О -ГДЕ О.Склад = &Склад +ИЗ Остатки(&Дата, + Склад = &Склад) КАК ОA)Результат станет другим: появятся строки других складовB)Результат тот же, остатки посчитаются только по складуC)Запрос упадёт: Склад нельзя в параметреD)Ничего, СУБД всё равно перенесёт условиепоказать ответ и разбор
+B)Результат тот же, остатки посчитаются только по складу// разбор: Склад — измерение регистра, поэтому отбор по нему в параметре даёт тот же результат, но остатки считаются только по одному складу. Платформа не переносит условие из ГДЕ внутрь виртуальной таблицы сама. На регистрах с сотнями складов разница во времени — разы.
- Условие в параметре:
Остатки(, Товар.Родитель В ИЕРАРХИИ (&Группа)). Что важно знать про такое условие?A)Разыменование в параметрах виртуальных таблиц запрещеноB)Добавит соединение внутри расчётаC)Иерархия в параметрах не поддерживаетсяD)Условие будет проигнорировано платформойпоказать ответ и разбор
+B)Добавит соединение внутри расчёта// разбор: Обращение через точку внутри параметра превращается в соединение с таблицей справочника внутри подзапроса виртуальной таблицы. Это допустимо, но на больших регистрах дорого. Часто быстрее сначала получить список товаров группы во временную таблицу, а в параметре написать Товар В (ВЫБРАТЬ ... ИЗ ВТ).
- Нужны товары с отрицательным остатком на складе. Где какое условие?A)Склад в параметре,
< 0в ГДЕB)Оба в параметреC)Оба условия в ГДЕ после расчёта остатковD)Склад — в ГДЕ, остаток — в параметре таблицыпоказать ответ и разбор
+A)Склад в параметре, `< 0` в ГДЕ// разбор: Склад — измерение: отбор по нему в параметре ограничит расчёт. Остаток — результат расчёта, отбор по нему возможен только после, в ГДЕ. Именно так пишут проверку новой методики контроля остатков: товары документа в параметре, отрицательный остаток в ГДЕ.
дальше
Теорию прочитал. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.