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