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