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