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

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

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

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

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

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

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

Какие виртуальные таблицы есть в платформе 1С 8.3

Набор виртуальных таблиц зависит от типа объекта метаданных. У регистров накопления с видом «Остатки» доступны таблицы Остатки и ОстаткиИОбороты; у регистров оборотных — только Обороты. У регистров сведений, подчиненных регистратору, есть СрезПервых и СрезПоследних. У регистров расчета — ДанныеГрафика, ФактическийПериодДействия, таблицы перерасчетов. У последовательностей — таблица Границы.

Также виртуальные таблицы есть у задач (ЗадачиПоИсполнителю) и у бизнес-процессов. У планов счетов с регистром бухгалтерии доступны специализированные таблицы: Остатки, Обороты, ОстаткиИОбороты, ОборотыДтКт с поддержкой субконто и корреспондирующих счетов.

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

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

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

Пример корректного обращения с параметрами:

ВЫБРАТЬ

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

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

ИЗ

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

&Период,

Склад = &Склад) КАК Остатки

Здесь отбор по складу передан вторым параметром внутри обращения — платформа рассчитает остатки только по нужному складу. Если бы условие стояло в секции ГДЕ, расчет выполнялся бы по всем складам базы.

Срезы первых и последних регистров сведений

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

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

Границы, перерасчеты и другие специализированные таблицы

Таблица Границы последовательности показывает, до какого момента последовательность актуальна. Она нужна при восстановлении последовательностей и в механизмах, завязанных на границу актуальности итогов.

Таблицы перерасчетов регистров расчета (Перерасчет.ФактическийПериодДействия и пользовательские таблицы перерасчетов) показывают записи, требующие пересчета после изменения базы расчета. В типовых механизмах зарплаты они используются для автоматического доначисления.

Таблица ОборотыДтКт регистра бухгалтерии возвращает обороты между корреспондирующими счетами — она незаменима для анализа проводок вида «счет А в счет Б», но требует аккуратной настройки отборов по обоим счетам и субконто.

Параметры виртуальных таблиц: главное правило производительности

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

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

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

Виртуальные таблицы и временные таблицы: как комбинировать

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

Избегайте соединения двух «тяжелых» виртуальных таблиц напрямую. Лучше материализовать результат одной из них во временную таблицу с индексом по полю соединения — это дает оптимизатору СУБД предсказуемый план.

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

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

Для отладки используйте консоль запросов в режиме предприятия: она показывает текст запроса, параметры и результат. Для анализа производительности включайте технологический журнал с событиями DBMSSQL/DBPOSTGRS или используйте замеры производительности в конфигураторе — так видно, какой именно SQL-запрос генерирует платформа и сколько он выполняется.

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

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

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

Время выполнения запроса с отбором
Норма

Стабильно быстро при росте объема регистра

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

Растет пропорционально числу записей в регистре

Текст условия в запросе
Норма

Отбор по измерениям в параметрах виртуальной таблицы

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

Все отборы собраны в секции ГДЕ

План запроса на СУБД
Норма

Используются индексы итоговых таблиц

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

Полное сканирование таблицы регистра

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

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

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

Почему запрос с остатками работает медленно, хотя записей немного?

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

Чем отличается Остатки от ОстаткиИОбороты?

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

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

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

Можно ли получить остатки на конец дня, а не на момент документа?

Да, передайте в параметр периода объект Граница с видом «Включая» для конкретного момента или дату конца дня с соответствующей границей. Для остатков на конец дня обычно используют конструкцию с Граница(КонецПериода, Включая).

Итог

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

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