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