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

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

Виртуальные таблицы 1С: для чего нужны и как с ними работать

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

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

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

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

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

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

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

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

Какие виртуальные таблицы есть у разных объектов

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

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

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

Остатки и обороты: типовые сценарии применения

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

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

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

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

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

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

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

Каждая виртуальная таблица принимает параметры в круглых скобках, строго в определённом порядке. Пропущенные параметры обозначаются запятыми. Для «Остатки» типичный вызов выглядит так: РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад), где первый параметр — момент времени, второй — условие отбора по измерениям.

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

Для таблицы «Обороты» параметры идут в порядке: начало периода, конец периода, периодичность, условие. Периодичность задаётся строкой или системным перечислением: «Период», «Регистратор», «День», «Месяц» и так далее. Если указать «Регистратор», в результате появится поле со ссылкой на документ, сделавший движение.

Пример запроса с виртуальной таблицей

Типовая задача — получить остатки товаров по конкретному складу на заданную дату. Запрос с корректным использованием параметров выглядит так:

ВЫБРАТЬ

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

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

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад) КАК Остатки

ГДЕ

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

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

Для среза последних логика аналогична: РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены). Первый параметр — дата среза, второй — отбор по измерениям. Если дату не указать, срез будет построен на текущий момент, что в отчётах за прошлые периоды даст неверные цены.

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

Производительность: как не замедлить базу

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

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

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

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

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

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

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

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

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

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

Сумма остатков по запросу против типового отчёта
Норма

Значения совпадают при тех же отборах и дате

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

Расхождение — проверьте параметр даты, вид границы и отборы в параметрах

Наличие параметра периода в тексте запроса
Норма

Дата или границы периода переданы явно

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

Скобки параметров пусты — итоги считаются на текущий момент

Положение отборов по измерениям
Норма

Условия по складам, номенклатуре, счетам стоят в параметрах виртуальной таблицы

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

Отборы по измерениям в секции ГДЕ — запрос считает лишние итоги

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

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

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

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

Итог

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

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

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

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

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

Почему запрос к Остатки без параметров работает медленно?

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

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

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

Что вернёт СрезПоследних, если записей по измерению нет?

Комбинация измерений, по которой в регистре нет ни одной записи до даты среза, в результат не попадёт. Поэтому при соединении справочника со срезом последних используют левое соединение и обрабатывают значения NULL — например, подставляют нулевую цену или признак отсутствия данных через функцию ЕСТЬNULL.

Как правильно передать дату, чтобы документ на границе попал в остатки?

Передайте в параметр либо момент времени документа, либо объект Граница с видом «Включая», построенный от нужной даты или документа. Обычная дата со временем 23:59:59 не гарантирует включение документов, проведённых в ту же секунду, потому что момент времени документа включает ещё и ссылку, которая участвует в сравнении.

Есть ли виртуальные таблицы у справочников и документов?

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