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

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

Виртуальные таблицы в 1C: назначение, виды и правила использования

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

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

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

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

Какие виды виртуальных таблиц существуют

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

Для регистров накопления с видом «Остатки» доступны таблицы Остатки, Обороты и ОстаткиИОбороты. Для регистров накопления с видом «Обороты» — только Обороты. Регистры сведений с периодичностью предоставляют СрезПервых и СрезПоследних. Регистры бухгалтерии дают самый богатый набор: Остатки, Обороты, ОстаткиИОбороты, ОборотыДтКт, а также таблицу ДвиженияССубконто.

Отдельно стоит упомянуть виртуальные таблицы задач (ЗадачиПоИсполнителю) и бизнес-процессов, а также таблицы регистров расчёта — ДанныеГрафика, ФактическийПериодДействия, БазовыеДанные. Они используются реже, но принцип работы у них тот же.

Синтаксис обращения и параметры

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

) КАК Остатки

У таблицы Остатки регистра накопления первый параметр — период, на который считаются остатки, второй — условие отбора, далее идут перечисления измерений. У Обороты добавляются начало и конец периода и параметр периодичности (Регистратор, День, Месяц и так далее). У СрезПоследних первый параметр — дата среза, второй — условие.

Если параметр не нужен, его можно опустить, но позиционность сохраняется: Остатки(, Склад = &Склад) — остатки на текущий момент с отбором по складу. Точный состав параметров каждой таблицы удобно смотреть в конструкторе запроса: при выборе виртуальной таблицы он показывает список параметров с типами.

bsl
ВЫБРАТЬ
	Срез.Номенклатура,
	Срез.Цена
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены) КАК Срез

Почему отбор нужно ставить в параметры, а не в ГДЕ

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

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

Ограничение: в параметрах виртуальной таблицы можно отбирать только по измерениям регистра. Отбор по ресурсам и реквизитам (например, «только остатки больше нуля») допустим лишь в секции ГДЕ, потому что значение ресурса появляется только после вычисления таблицы.

Типичные сценарии использования

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

Получение остатков на дату

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

Анализ оборотов за период

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

Получение актуальных значений из регистра сведений

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

Что выбрать для отчёта

Остатки

Нужно состояние на одну дату: складские остатки, взаиморасчёты. Не показывает динамику.

Обороты

Нужна активность за период: продажи, поступления. Не даёт начального и конечного сальдо.

ОстаткиИОбороты

Нужна полная картина: сальдо на начало, движения, сальдо на конец. Тяжелее двух предыдущих таблиц.

СрезПоследних

Нужно актуальное значение на дату из периодического регистра сведений: цена, курс, статус.

Соединения с виртуальными таблицами и подводные камни

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

Частая ошибка — соединение двух виртуальных таблиц, вычисляемых по разным датам или с разными отборами, когда платформа строит оба полных среза. Если обе таблицы основаны на одном регистре, проверьте, нельзя ли обойтись одной таблицей ОстаткиИОбороты или одной выборкой с группировкой.

Ещё один нюанс — использование виртуальных таблиц в пакетных запросах и временных таблицах. Если одна и та же выборка нужна в нескольких местах запроса, выгоднее один раз поместить её во временную таблицу (ПОМЕСТИТЬ) и дальше работать с ней, чем вычислять виртуальную таблицу повторно.

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

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

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

Скорость оценивайте на базе с реальным объёмом данных. Запрос, который на пустой тестовой базе выполняется мгновенно, на рабочей базе может работать минутами именно из-за виртуальных таблиц без отборов. В технологическом журнале и при замерах производительности обращайте внимание на длительные обращения к таблицам регистров.

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

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

Отбор по измерениям
Норма

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

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

Условие только в секции ГДЕ

Дата среза или остатков
Норма

Передан явный параметр даты из логики отчёта

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

Дата не задана — данные на текущий момент

Скорость на рабочем объёме
Норма

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

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

Проверка только на пустой тестовой базе

Сверка данных
Норма

Результат совпадает со стандартным отчётом по регистру

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

Расхождения без объяснимой причины

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

Можно ли обратиться к виртуальной таблице вне запроса, из кода напрямую?

Нет. Виртуальные таблицы доступны только внутри текста запроса на встроенном языке запросов 1С. Из кода вы выполняете запрос и получаете результат выборки или таблицу значений, но самой виртуальной таблицы как объекта кода не существует.

Почему у моего регистра сведений нет таблицы СрезПоследних?

Срезы доступны только у периодических регистров сведений. Если у регистра свойство «Периодичность» установлено в «Непериодический», виртуальные таблицы СрезПервых и СрезПоследних платформа не создаёт — для него нет понятия актуальности на дату.

Что вернёт таблица Остатки, если не указать дату?

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

Можно ли в параметрах виртуальной таблицы использовать список значений?

Да. Передайте в параметр запроса массив или список значений и используйте условие вида Склад В (&СписокСкладов). Также поддерживается вариант В ИЕРАРХИИ для отбора по группе иерархического справочника.

Что быстрее: виртуальная таблица или группировка по таблице движений?

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

Работают ли виртуальные таблицы в СКД?

Да. В схеме компоновки данных набор данных «Запрос» содержит обычный запрос, и все правила виртуальных таблиц действуют. Дополнительно СКД умеет автоматически подставлять периоды из настроек отчёта, но отборы по измерениям по-прежнему следует размещать в параметрах виртуальной таблицы.

Итог

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

Виртуальная таблица — вычисляемая платформой выборка остатков, оборотов или срезов, а не реальная таблица базы. Главное правило производительности: отбор по измерениям передавайте в параметрах виртуальной таблицы, а не в секции ГДЕ. Корректность результата сверяйте со стандартным отчётом, скорость проверяйте на базе с реальным объёмом данных.