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

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

Как создать виртуальную таблицу в 1С

Разбираем, что такое виртуальные таблицы в 1С, как их создавать в запросах и запросах СКД, какие параметры использовать и каких ошибок избегать.

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

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

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

Что такое виртуальная таблица и какие виды существуют

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

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

Регистр накопления (Остатки)Остатки, Обороты, ОстаткиИОбороты

Остатки требуют вид регистра «Остатки»

Регистр сведений (периодический)СрезПервых, СрезПоследних

Доступны только при установленной периодичности

Регистр бухгалтерииОстатки, Обороты, ОстаткиИОбороты, ОборотыДтКт

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

Регистр расчётаДанныеГрафика, ФактическийПериодДействия

Связаны с периодом действия записей

Как включить виртуальные таблицы в конфигураторе

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

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

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки";

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

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

Результат = Запрос.Выполнить().Выгрузить();

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

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

Параметры виртуальных таблиц и фильтрация

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

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

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

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

Быстро: отбор применяется при построении таблицы. Ограничение: условия только по измерениям и реквизитам таблицы

Секция ГДЕ

Гибко: можно фильтровать по любым полям результата, включая соединения. Минус: сначала строится вся таблица, потом фильтруется

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

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

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

Типичные ошибки
01
Не передан период — остатки считаются на текущую дату вместо нужной, отчёт расходится с данными
02
Отбор в ГДЕ вместо параметров — лишняя нагрузка на СУБД и медленный запрос
03
Вызов виртуальной таблицы внутри цикла — кратный рост времени выполнения
04
Обращение к СрезПоследних у непериодического регистра — ошибка «таблица не найдена»
05
Игнорирование границы периода: остаток на начало дня не включает движения этого дня

Проверка результата и производительность

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

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

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

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

Суммы остатков
Норма

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

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

Расхождения — проверьте период и границу периода

Время выполнения
Норма

Запрос на рабочих данных выполняется за секунды

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

Минуты ожидания — проверьте отборы в параметрах и итоги

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

Только нужные склады/номенклатура по условию отбора

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

Лишние строки — условие задано в ГДЕ, а не в параметрах

Альтернативы и смежные приёмы

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

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

Маршрут решения

Как выбрать подход

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

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

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

Частые вопросы

Можно ли создать собственную виртуальную таблицу в конфигураторе?

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

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

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

Чем СрезПоследних отличается от СрезПервых?

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

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

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

Можно ли использовать виртуальные таблицы в СКД?

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

Что означает параметр «Периодичность» в таблице Обороты?

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