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