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

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

Зачем нужны виртуальные таблицы 1С и как ими пользоваться

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

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

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

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

Что такое виртуальная таблица и как она устроена

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

Например, регистр накопления «ТоварыНаСкладах» физически хранит каждое движение: каждую строку прихода и расхода с указанием документа-регистратора. Чтобы узнать остаток номенклатуры, без виртуальной таблицы пришлось бы суммировать все приходы, вычитать все расходы и группировать по номенклатуре и складу. Виртуальная таблица «ТоварыНаСкладах.Остатки» делает это одной строкой в запросе, причём платформа использует предрассчитанные итоги, что ускоряет выборку.

Важно понимать: виртуальные таблицы существуют не у всех объектов. Они есть у регистров накопления, регистров сведений, регистров бухгалтерии и расчёта, а также у некоторых других объектов (например, таблица «Границы» у последовательностей). У справочников и документов виртуальных таблиц нет — их данные читаются напрямую из физических таблиц.

Какие виды виртуальных таблиц существуют

Набор виртуальных таблиц зависит от вида регистра и его настроек. У регистра накопления с видом «Остатки» доступны таблицы «Остатки», «Обороты» и «ОстаткиИОбороты». У регистра накопления с видом «Обороты» — только «Обороты», потому что остатки по такому регистру не вычисляются по определению.

У регистров сведений набор другой: «СрезПервых» и «СрезПоследних» — для периодических регистров, а также «Обороты» появляется, если включён соответствующий режим. У регистров бухгалтерии — целое семейство: «Остатки», «Обороты», «ОстаткиИОбороты», «ОборотыДтКт» и другие, с учётом специфики счетов и субконто.

Виртуальная таблицаГде доступнаЧто возвращает
ОстаткиРегистры накопления (остатки), бухгалтерииОстатки по измерениям на момент времени
ОборотыРегистры накопления, сведений, бухгалтерииПриход, расход и обороты за период
ОстаткиИОборотыРегистры накопления (остатки), бухгалтерииНачальный остаток, обороты и конечный остаток за период
СрезПервыхПериодические регистры сведенийПервые значения ресурсов на момент времени
СрезПоследнихПериодические регистры сведенийПоследние актуальные значения ресурсов на момент времени
ОборотыДтКтРегистры бухгалтерииОбороты между дебетом и кредитом счетов

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

Зачем передавать параметры виртуальной таблице

Параметры виртуальной таблицы указываются в круглых скобках сразу после её имени. Это главный инструмент управления производительностью: параметры применяются платформой до выборки данных, то есть отсекают лишние строки на самом раннем этапе. Отбор же в секции ГДЕ применяется уже после того, как виртуальная таблица целиком построена.

Классический пример: запрос к таблице «Остатки» без параметров вычислит остатки по всем складам и всей номенклатуре базы. Если отчёт касается одного склада, платформа всё равно сделает полную работу, а потом выбросит 99% результата. Передача склада в параметр «Условие» или через отбор в параметрах сокращает объём вычислений в разы.

bsl
ВЫБРАТЬ
	Остатки.Номенклатура,
	Остатки.КоличествоОстаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки

У большинства виртуальных таблиц первый параметр — период (момент времени, на который строятся данные). Дальше идут: условие отбора в виде строки, список счетов или субконто для регистров бухгалтерии, периодичность для «ОстаткиИОбороты». Точный состав параметров виден в конструкторе запроса и в синтакс-помощнике — не полагайтесь на память, порядок параметров у разных таблиц различается.

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

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

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

Маршрут решения

Как выбрать действие

Нужны остатки только по части измерений (один склад, группа товаров)Передайте условие отбора в параметры виртуальной таблицы
Нужны данные за период с начальным и конечным сальдоИспользуйте ОстаткиИОбороты с явными датами начала и конца
Запрос тормозит на большой базеПроверьте план запроса в консоли и перенесите отборы из ГДЕ в параметры
Нужны детальные движения по документамНе используйте виртуальную таблицу — читайте физическую таблицу движений регистра

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

Типичные ошибки при работе с виртуальными таблицами

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

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

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

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

Практический порядок построения запроса с виртуальной таблицей

Работу над запросом удобно вести в консоли запросов на копии базы. Начинайте с минимального набора полей, добавляйте параметры по одному и после каждого шага проверяйте и результат, и скорость выполнения. Так проще локализовать место, где запрос начал тормозить или возвращать неверные данные.

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

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

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

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

Суммы и количества в результате запроса
Норма

Совпадают с типовым отчётом на ту же дату и с теми же отборами

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

Расхождения — проверяйте границу периода и условия в параметрах

Скорость выполнения запроса
Норма

Запрос выполняется за секунды на рабочем объёме данных

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

Минуты ожидания — вероятно, отборы в ГДЕ вместо параметров

Состав строк при левом соединении
Норма

Присутствуют строки с пустыми остатками, если они нужны по логике

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

Строки без остатков пропали — отбор по полю виртуальной таблицы стоит в ГДЕ

Когда виртуальная таблица не нужна

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

Сравнение вариантов

Виртуальная таблица (Остатки, Обороты)

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

Физическая таблица регистра

Подходит для детальных движений по документам. Ограничение — агрегацию и расчёт остатков придётся делать вручную

Типовой отчёт на СКД

Подходит для пользовательской аналитики без написания кода. Ограничение — меньше гибкости при программной обработке результата

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

Итог

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

Виртуальные таблицы 1С дают быстрый доступ к остаткам, оборотам и срезам без ручной агрегации движений. Их эффективность зависит от параметров: период и отборы передавайте в скобках после имени таблицы, а не в секции ГДЕ. Проверяйте результат сверкой с типовым отчётом и планом запроса.

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

Чем виртуальная таблица отличается от временной таблицы?

Виртуальная таблица формируется платформой из данных регистра в момент обращения и существует только внутри одного обращения к ней. Временная таблица создаётся самим разработчиком командой «ПОМЕСТИТЬ», хранится в менеджере временных таблиц и доступна во всех последующих запросах пакета до её уничтожения.

Можно ли соединять две виртуальные таблицы в одном запросе?

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

Почему запрос к таблице «Остатки» возвращает пустой результат?

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

Что передавать в параметр периода: дату или момент времени?

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

Работают ли виртуальные таблицы в запросах к внешним источникам данных?

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

Влияет ли режим разделения итогов на виртуальные таблицы?

Да, в клиент-серверном варианте включённый режим разделения итогов позволяет платформе обновлять итоги регистров без блокировок при параллельной работе пользователей, что косвенно ускоряет обращения к таблицам «Остатки» в многопользовательской среде. Это настройка администрирования, а не запроса, и менять её стоит осознанно, с учётом нагрузки на базу.