Разработка и Конфигурация · 10 мин
Параметры виртуальной таблицы 1С: что это и как с ними работать
Что такое параметры виртуальной таблицы 1С, зачем они нужны, как передавать период, отбор и условия в запросах. Примеры, ошибки и советы по оптимизации.
Виртуальные таблицы в 1С — это не физические таблицы базы данных, а программно формируемые выборки, которые платформа строит на основе реальных данных регистров. Остатки, обороты, срезы первых и последних — всё это виртуальные таблицы, к которым разработчик обращается в запросе так же, как к обычным. Особенность в том, что почти у каждой виртуальной таблицы есть параметры — значения, которые управляют тем, как именно платформа сформирует выборку.
Параметры виртуальной таблицы указываются в круглых скобках после её имени в тексте запроса. Они определяют период расчёта, условия отбора, метод дополнения периодов и другие настройки. От того, насколько корректно заданы эти параметры, зависят и правильность результата, и скорость выполнения запроса: ошибка в параметрах способна замедлить отчёт в десятки раз или дать неверные цифры.
Разобраться в параметрах нужно каждому, кто пишет запросы к регистрам накопления, сведений и расчёта. Ниже — системное описание: какие параметры бывают, как их передавать, чем параметры отличаются от условия в секции ГДЕ и каких ошибок стоит избегать.
Что такое виртуальная таблица и зачем ей параметры
Когда разработчик пишет запрос к регистру накопления вида «Остатки», он обращается не к хранимой таблице, а к механизму платформы, который на лету рассчитывает остатки по итогам и движениям. Аналогично работают таблицы «Обороты», «СрезПервых», «СрезПоследних», «ОстаткиИОбороты», таблицы фактического периода действия у регистров расчёта.
Чтобы платформа понимала, на какую дату считать остатки или за какой интервал считать обороты, ей передаются параметры. Без них платформа применит значения по умолчанию — например, срез последних без указания периода вернёт самые свежие записи на текущий момент, а обороты без периодов будут рассчитаны за всё время ведения учёта, что почти всегда не нужно и ресурсоёмко.
Какие виртуальные таблицы имеют параметры
Набор параметров зависит от типа регистра и конкретной виртуальной таблицы. Синтаксис-помощник в конфигураторе показывает точный список для каждой таблицы, но общая картина выглядит так:
| Виртуальная таблица | Типичные параметры | Назначение |
|---|---|---|
| РегистрНакопления.Остатки | Период, Условие | Остатки на момент времени |
| РегистрНакопления.Обороты | НачалоПериода, КонецПериода, Периодичность, Условие | Обороты за интервал |
| РегистрНакопления.ОстаткиИОбороты | Начало, Конец, Периодичность, МетодДополнения, Условие | Остатки и обороты с детализацией |
| РегистрСведений.СрезПервых / СрезПоследних | Период, Условие | Первое или последнее значение на дату |
| РегистрРасчёта.ФактическийПериодДействия | Условие | Фактические периоды с учётом вытеснения |
Важно понимать, что позиция параметра фиксирована: если нужно задать только условие, а период оставить по умолчанию, пропущенные параметры указываются как пустые места через запятую либо пропускаются с сохранением позиции. Нарушение порядка приводит к ошибке компиляции запроса или к неожиданной интерпретации значений.
Как передавать параметры: синтаксис и примеры
Параметры записываются в скобках сразу после имени виртуальной таблицы. Значения обычно передаются через параметры запроса (со знаком «&»), реже — литералами или выражениями. Типичный пример для остатков:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаОстатков,
Склад = &Склад
) КАК Остатки
Здесь первый параметр — момент времени, на который считаются остатки, второй — условие отбора по измерению «Склад». Перед выполнением запроса значения устанавливаются методом УстановитьПараметр:
Запрос.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса));
Запрос.УстановитьПараметр("Склад", ВыбранныйСклад);
Для таблицы «Обороты» дополнительно задаётся периодичность — группировка оборотов по месяцам, дням, регистратору. Для «ОстаткиИОбороты» есть метод дополнения, определяющий, как заполнять периоды без движений. Эти параметры перечисляются строго в порядке, описанном в документации.
- 1Откройте синтаксис-помощник и найдите описание нужной виртуальной таблицы
- 2Определите обязательные параметры: период, границы, периодичность
- 3Перенесите отборы по измерениям в параметр-условие вместо секции ГДЕ
- 4Установите значения через УстановитьПараметр до выполнения запроса
- 5Проверьте результат на тестовых данных с известными итогами
Параметр-условие против секции ГДЕ
Самая частая методическая ошибка — фильтровать результат виртуальной таблицы через секцию ГДЕ вместо передачи условия в параметры. Разница принципиальна: условие в параметрах применяется до формирования выборки, платформа сразу отсекает лишние записи. Секция ГДЕ фильтрует уже сформированную таблицу, то есть платформа сначала рассчитывает остатки по всем измерениям, а потом выбрасывает ненужное.
На больших регистрах это даёт кратную разницу в скорости. Кроме производительности есть и функциональный аспект: для таблицы «Обороты» условие в ГДЕ по ресурсу может отфильтровать строки с нулевыми оборотами, которых в параметризованной выборке вообще не возникло бы, — логика результата меняется.
Где задавать отбор
Отбор применяется при формировании выборки. Быстро, корректно, рекомендуемый способ для измерений регистра.
Фильтрация готового результата. Допустимо для полей соединённых таблиц и вычисляемых выражений, но для измерений регистра — медленно и рискованно.
Период и границы: тонкости задания дат
Параметр периода для остатков и срезов — это момент времени. Если передать дату без времени, она интерпретируется как начало дня, и движения, сделанные в течение этого дня, в остатки не попадут. Классическая ошибка — получить «вчерашние» остатки при запросе на сегодняшнюю дату. Надёжные варианты: передавать КонецДня(Дата), объект Граница с видом «Включая» или конкретный момент времени документа.
Для оборотов границы интервала трактуются иначе: начало периода включается, конец периода обычно нужно задавать с точностью до секунды конца дня или использовать границы. Несогласованные границы — источник расхождений между отчётами, построенными разными запросами.
Контроль результата и типичные ошибки
После написания запроса результат стоит сверить с эталоном: стандартным отчётом конфигурации или ручным расчётом по небольшому набору данных. Проверяйте три вещи: попали ли в выборку все нужные записи, не потеряны ли записи с нулевыми значениями, совпадают ли итоги при смене даты на границу периода.
Отдельно отметим параметр-условие с вложенными запросами и таблицами значений: конструкция вида «Номенклатура В (&СписокНоменклатуры)» работает, но при больших списках эффективнее передать таблицу значений параметром и соединиться с ней, поместив её во временную таблицу.
Как проверить результат
Совпадают со стандартным отчётом на ту же границу времени
Расхождение ровно на движения одного дня — неверно задан период
Запрос отрабатывает за приемлемое время на рабочем объёме
Заметное замедление при росте данных — отборы вынесены в ГДЕ
Все ожидаемые измерения присутствуют
Пропали позиции без движений — проверьте метод дополнения и тип соединения
Практические рекомендации по оптимизации
Главное правило: всё, что можно передать в параметры виртуальной таблицы, должно быть передано в параметры. Это касается периодов, отборов по измерениям и условий по регистраторам. Секцию ГДЕ оставляйте для условий по полям других таблиц соединения и для вычисляемых выражений.
Второе правило — не запрашивайте лишнюю детализацию. Если нужны обороты за месяц в целом, не указывайте периодичность «День»: каждая дополнительная гранулярность увеличивает объём расчёта. Третье — для периодических регистров сведений выбирайте между СрезПоследних и соединением с таблицей регистра осознанно: при большом количестве записей срез по многим измерениям может быть тяжёлым, и иногда выгоднее хранить актуальные значения дублирующим образом.
При отладке запроса с параметрами виртуальной таблицы удобно временно вывести саму виртуальную таблицу целиком (SELECT * с ограничением) и посмотреть, что реально сформировала платформа. Это быстрее, чем гадать, почему итоговый запрос вернул не те строки.
FAQ
Чем параметр виртуальной таблицы отличается от параметра запроса?
Параметр запроса (со знаком &) — это переменная, значение которой задаётся через УстановитьПараметр. Параметр виртуальной таблицы — это позиция в скобках после имени таблицы, куда обычно и подставляется параметр запроса. То есть одно — механизм передачи значения, другое — место его применения.
Можно ли не указывать параметры вообще?
Да, все параметры имеют значения по умолчанию. Но умолчания редко подходят: остатки будут рассчитаны на текущий момент, обороты — за всё время. Явное задание параметров делает запрос предсказуемым и быстрым.
Почему условие по ресурсу регистра в параметрах вызывает ошибку?
В большинстве виртуальных таблиц условие допускает отбор только по измерениям и реквизитам, а не по ресурсам. Отбор по ресурсам (например, «КоличествоОстаток > 0») корректно размещать в секции ГДЕ или в конструкции ИМЕЮЩИЕ при группировке.
Как получить остатки на конкретный документ?
Передайте в параметр периода момент времени документа (ссылка приводится к моменту времени автоматически) или объект Граница с нужным видом — «Включая» или «Исключая», в зависимости от того, должны ли движения самого документа учитываться в остатках.
Что делать, если запрос с параметрами всё равно медленный?
Проверьте, что отборы действительно в параметрах, а не в ГДЕ; уменьшите периодичность и состав выбираемых полей; убедитесь, что по отбираемым измерениям нет соединений, отменяющих использование индексов. Для тяжёлых отчётов рассмотрите предварительное помещение отфильтрованных данных во временные таблицы.
Что важно запомнить
Параметры виртуальной таблицы задаются в скобках после её имени и управляют периодом, отбором и детализацией выборки. Отборы по измерениям переносите в параметры, даты задавайте с учётом времени и границ, результат сверяйте со стандартными отчётами.