К статье
Практический материал

Разработка и Конфигурация · 10 мин

Параметры виртуальной таблицы 1С: что это и как с ними работать

Что такое параметры виртуальной таблицы 1С, зачем они нужны, как передавать период, отбор и условия в запросах. Примеры, ошибки и советы по оптимизации.

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

Параметры виртуальной таблицы указываются в круглых скобках после её имени в тексте запроса. Они определяют период расчёта, условия отбора, метод дополнения периодов и другие настройки. От того, насколько корректно заданы эти параметры, зависят и правильность результата, и скорость выполнения запроса: ошибка в параметрах способна замедлить отчёт в десятки раз или дать неверные цифры.

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

Что такое виртуальная таблица и зачем ей параметры

Когда разработчик пишет запрос к регистру накопления вида «Остатки», он обращается не к хранимой таблице, а к механизму платформы, который на лету рассчитывает остатки по итогам и движениям. Аналогично работают таблицы «Обороты», «СрезПервых», «СрезПоследних», «ОстаткиИОбороты», таблицы фактического периода действия у регистров расчёта.

Чтобы платформа понимала, на какую дату считать остатки или за какой интервал считать обороты, ей передаются параметры. Без них платформа применит значения по умолчанию — например, срез последних без указания периода вернёт самые свежие записи на текущий момент, а обороты без периодов будут рассчитаны за всё время ведения учёта, что почти всегда не нужно и ресурсоёмко.

Какие виртуальные таблицы имеют параметры

Набор параметров зависит от типа регистра и конкретной виртуальной таблицы. Синтаксис-помощник в конфигураторе показывает точный список для каждой таблицы, но общая картина выглядит так:

Виртуальная таблицаТипичные параметрыНазначение
РегистрНакопления.ОстаткиПериод, УсловиеОстатки на момент времени
РегистрНакопления.ОборотыНачалоПериода, КонецПериода, Периодичность, УсловиеОбороты за интервал
РегистрНакопления.ОстаткиИОборотыНачало, Конец, Периодичность, МетодДополнения, УсловиеОстатки и обороты с детализацией
РегистрСведений.СрезПервых / СрезПоследнихПериод, УсловиеПервое или последнее значение на дату
РегистрРасчёта.ФактическийПериодДействияУсловиеФактические периоды с учётом вытеснения

Важно понимать, что позиция параметра фиксирована: если нужно задать только условие, а период оставить по умолчанию, пропущенные параметры указываются как пустые места через запятую либо пропускаются с сохранением позиции. Нарушение порядка приводит к ошибке компиляции запроса или к неожиданной интерпретации значений.

Как передавать параметры: синтаксис и примеры

Параметры записываются в скобках сразу после имени виртуальной таблицы. Значения обычно передаются через параметры запроса (со знаком «&»), реже — литералами или выражениями. Типичный пример для остатков:

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&ДатаОстатков,

Склад = &Склад

) КАК Остатки

Здесь первый параметр — момент времени, на который считаются остатки, второй — условие отбора по измерению «Склад». Перед выполнением запроса значения устанавливаются методом УстановитьПараметр:

Запрос.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса));

Запрос.УстановитьПараметр("Склад", ВыбранныйСклад);

Для таблицы «Обороты» дополнительно задаётся периодичность — группировка оборотов по месяцам, дням, регистратору. Для «ОстаткиИОбороты» есть метод дополнения, определяющий, как заполнять периоды без движений. Эти параметры перечисляются строго в порядке, описанном в документации.

Как правильно задать параметры
  1. 1
    Откройте синтаксис-помощник и найдите описание нужной виртуальной таблицы
  2. 2
    Определите обязательные параметры: период, границы, периодичность
  3. 3
    Перенесите отборы по измерениям в параметр-условие вместо секции ГДЕ
  4. 4
    Установите значения через УстановитьПараметр до выполнения запроса
  5. 5
    Проверьте результат на тестовых данных с известными итогами

Параметр-условие против секции ГДЕ

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

На больших регистрах это даёт кратную разницу в скорости. Кроме производительности есть и функциональный аспект: для таблицы «Обороты» условие в ГДЕ по ресурсу может отфильтровать строки с нулевыми оборотами, которых в параметризованной выборке вообще не возникло бы, — логика результата меняется.

Где задавать отбор

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

Отбор применяется при формировании выборки. Быстро, корректно, рекомендуемый способ для измерений регистра.

Секция ГДЕ

Фильтрация готового результата. Допустимо для полей соединённых таблиц и вычисляемых выражений, но для измерений регистра — медленно и рискованно.

Период и границы: тонкости задания дат

Параметр периода для остатков и срезов — это момент времени. Если передать дату без времени, она интерпретируется как начало дня, и движения, сделанные в течение этого дня, в остатки не попадут. Классическая ошибка — получить «вчерашние» остатки при запросе на сегодняшнюю дату. Надёжные варианты: передавать КонецДня(Дата), объект Граница с видом «Включая» или конкретный момент времени документа.

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

Контроль результата и типичные ошибки

После написания запроса результат стоит сверить с эталоном: стандартным отчётом конфигурации или ручным расчётом по небольшому набору данных. Проверяйте три вещи: попали ли в выборку все нужные записи, не потеряны ли записи с нулевыми значениями, совпадают ли итоги при смене даты на границу периода.

Типичные ошибки
01
Отбор по измерениям в секции ГДЕ — запрос работает медленно, а для оборотов логика результата искажается
02
Дата без времени как период остатков — движения текущего дня теряются
03
Пропуск позиционных параметров без запятых — значение попадает не в тот параметр
04
Неустановленный параметр запроса — ошибка выполнения или NULL в результате
05
Отбор по ресурсу в параметре-условии — многие таблицы допускают условие только по измерениям и реквизитам, проверяйте синтаксис-помощник

Отдельно отметим параметр-условие с вложенными запросами и таблицами значений: конструкция вида «Номенклатура В (&СписокНоменклатуры)» работает, но при больших списках эффективнее передать таблицу значений параметром и соединиться с ней, поместив её во временную таблицу.

Контрольные точки

Как проверить результат

Итоги по остаткам
Норма

Совпадают со стандартным отчётом на ту же границу времени

Тревожный признак

Расхождение ровно на движения одного дня — неверно задан период

Скорость выполнения
Норма

Запрос отрабатывает за приемлемое время на рабочем объёме

Тревожный признак

Заметное замедление при росте данных — отборы вынесены в ГДЕ

Полнота выборки
Норма

Все ожидаемые измерения присутствуют

Тревожный признак

Пропали позиции без движений — проверьте метод дополнения и тип соединения

Практические рекомендации по оптимизации

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

Второе правило — не запрашивайте лишнюю детализацию. Если нужны обороты за месяц в целом, не указывайте периодичность «День»: каждая дополнительная гранулярность увеличивает объём расчёта. Третье — для периодических регистров сведений выбирайте между СрезПоследних и соединением с таблицей регистра осознанно: при большом количестве записей срез по многим измерениям может быть тяжёлым, и иногда выгоднее хранить актуальные значения дублирующим образом.

При отладке запроса с параметрами виртуальной таблицы удобно временно вывести саму виртуальную таблицу целиком (SELECT * с ограничением) и посмотреть, что реально сформировала платформа. Это быстрее, чем гадать, почему итоговый запрос вернул не те строки.
ПЗ
Практическое замечание

FAQ

Чем параметр виртуальной таблицы отличается от параметра запроса?

Параметр запроса (со знаком &) — это переменная, значение которой задаётся через УстановитьПараметр. Параметр виртуальной таблицы — это позиция в скобках после имени таблицы, куда обычно и подставляется параметр запроса. То есть одно — механизм передачи значения, другое — место его применения.

Можно ли не указывать параметры вообще?

Да, все параметры имеют значения по умолчанию. Но умолчания редко подходят: остатки будут рассчитаны на текущий момент, обороты — за всё время. Явное задание параметров делает запрос предсказуемым и быстрым.

Почему условие по ресурсу регистра в параметрах вызывает ошибку?

В большинстве виртуальных таблиц условие допускает отбор только по измерениям и реквизитам, а не по ресурсам. Отбор по ресурсам (например, «КоличествоОстаток > 0») корректно размещать в секции ГДЕ или в конструкции ИМЕЮЩИЕ при группировке.

Как получить остатки на конкретный документ?

Передайте в параметр периода момент времени документа (ссылка приводится к моменту времени автоматически) или объект Граница с нужным видом — «Включая» или «Исключая», в зависимости от того, должны ли движения самого документа учитываться в остатках.

Что делать, если запрос с параметрами всё равно медленный?

Проверьте, что отборы действительно в параметрах, а не в ГДЕ; уменьшите периодичность и состав выбираемых полей; убедитесь, что по отбираемым измерениям нет соединений, отменяющих использование индексов. Для тяжёлых отчётов рассмотрите предварительное помещение отфильтрованных данных во временные таблицы.

Итог

Что важно запомнить

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