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

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

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

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

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

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

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

Как устроены виртуальные таблицы и почему они «виртуальные»

Физически в базе данных регистр накопления хранит таблицу движений (каждая строка — проводка документа) и таблицу итогов. Когда в запросе указывается, например, РегистрНакопления.ТоварыНаСкладах.Остатки, платформа не читает отдельный объект «Остатки» — она формирует выборку из таблицы итогов или движений, группируя данные по измерениям и отсекая лишнее по переданным параметрам.

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

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

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

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

Остатки и обороты регистра накопления

Таблица «Остатки» возвращает значения ресурсов на указанную дату в разрезе измерений. «Обороты» агрегирует приход и расход за произвольный интервал с заданной периодичностью (день, месяц, квартал). «ОстаткиИОбороты» объединяет оба показателя: начальный остаток, приход, расход и конечный остаток за период — это стандартный источник для складских и финансовых отчётов.

Срезы регистра сведений

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

Таблицы регистра бухгалтерии

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

Тип регистраВиртуальные таблицыТипичное применение
Накопления (остатки)Остатки, Обороты, ОстаткиИОборотыСкладские остатки, взаиморасчёты
Накопления (обороты)ОборотыВыручка, объёмы продаж
Сведений (периодический)СрезПервых, СрезПоследнихКурсы валют, цены, ставки
БухгалтерииОстатки, Обороты, ОстаткиИОбороты, ОборотыДтКт, ДвиженияССубконтоПроводки, сальдо по счетам
РасчётаФактическийПериодДействия, ДанныеГрафикаРасчёт зарплаты, начисления

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

Параметры указываются в круглых скобках сразу после имени виртуальной таблицы. Например, для «Остатки» это период и условие отбора, для «Оборотов» — начало и конец периода, периодичность и отбор. Пропускать параметры нельзя: отсутствующие значения заменяются амперсандом-заполнителем или оставляются пустыми, но сама структура скобок сохраняется.

ВЫБРАТЬ

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

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

ИЗ

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

&Период,

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

) КАК Остатки

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

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

Когда виртуальная таблица ускоряет запрос, а когда тормозит

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

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

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

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

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

Параметры виртуальной таблицы
Норма

Период и отбор по измерениям заданы в скобках

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

Скобки пустые, отбор только в ГДЕ

Дата остатков
Норма

Передан конец дня или граница с документом

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

Передано начало дня, остатки «не сходятся»

Итоги регистра
Норма

Итоги рассчитаны на нужную дату

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

Платформа досчитывает итоги при каждом запросе

Типичные ошибки при работе с виртуальными таблицами

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

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

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

Практический порядок написания запроса к виртуальной таблице

Начинайте с определения задачи: нужен моментальный снимок (остатки, срез) или динамика за период (обороты). От этого зависит выбор таблицы. Затем определите, какие измерения реально нужны в результате, и перенесите отборы по ним в параметры. Только после этого добавляйте соединения с другими таблицами и итоговую группировку.

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

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

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

Ответы на частые вопросы

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

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

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

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

Почему запрос к остаткам возвращает пустой результат?

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

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

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

Что выбрать: Обороты или ОстаткиИОбороты?

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

Итог

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

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