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

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

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

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

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

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

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

Что такое виртуальная таблица и почему она «виртуальная»

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

Для сравнения: таблица движений регистра накопления — физическая. В клиент-серверном варианте она реально существует в базе MS SQL Server, PostgreSQL или Oracle под служебным именем вида _AccumRg..., и её содержимое можно увидеть средствами СУБД. Виртуальная таблица Остатки в СУБД отсутствует — есть только таблица итогов, из которой платформа вычисляет остатки на нужную дату.

Где физически хранятся данные, из которых строятся виртуальные таблицы

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

В файловом варианте базы эти таблицы находятся внутри единого файла 1Cv8.1CD, и прямого доступа к ним штатными средствами нет. В клиент-серверном варианте они хранятся в базе данных СУБД под техническими именами, соответствие которых объектам метаданных можно получить функцией ПолучитьСтруктуруХраненияБазыДанных(). Однако работать с этими таблицами напрямую через SQL категорически не рекомендуется: структура хранения может меняться между релизами платформы, а прямая запись в обход платформы нарушит целостность данных.

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

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

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

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

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

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

Типичная ошибка — накладывать условия через ГДЕ вместо параметров виртуальной таблицы. Запрос ВЫБРАТЬ * ИЗ РегистрНакопления.Товары.Остатки ГДЕ Склад = &Склад сначала вычисляет остатки по всем складам, а потом отбрасывает лишние строки. Правильный вариант — передать условие в параметры: Остатки(&Период, Склад = &Склад).

bsl
ВЫБРАТЬ
	Остатки.Номенклатура,
	Остатки.КоличествоОстаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки
Типичные ошибки
01
Отбор через ГДЕ вместо параметров виртуальной таблицы — платформа вычисляет таблицу целиком, запрос резко замедляется
02
Обращение к Остаткам без указания периода — получение данных на текущую границу итогов может не совпадать с ожидаемой датой
03
Попытка найти виртуальную таблицу в СУБД средствами SQL — её там нет, время потрачено впустую
04
Соединение виртуальной таблицы с таблицей движений без отбора — декартово разрастание результата и тяжёлый запрос

Как посмотреть содержимое виртуальной таблицы на практике

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

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

Порядок действий
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Найдите нужный регистр и разверните список его таблиц — виртуальные будут рядом с таблицей движений
  3. 3
    Перетащите виртуальную таблицу в запрос и задайте параметры: период, условия отбора
  4. 4
    Выполните запрос и проверьте результат
  5. 5
    При расхождениях сравните с выборкой из таблицы движений за тот же период

Роль итогов: почему остатки считаются быстро, а иногда нет

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

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

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

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

Скорость запроса к Остаткам
Норма

Запрос выполняется быстро при заданных параметрах

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

Запрос «висит» даже с отбором — вероятно, итоги не рассчитаны

Период рассчитанных итогов
Норма

Граница итогов близка к текущей дате

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

Итоги рассчитаны на давний период — требуется пересчёт

Результат среза последних
Норма

Возвращаются актуальные значения на дату среза

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

Пустой результат при наличии записей — проверьте параметр периода

Ограничения и альтернативы виртуальным таблицам

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

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

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

Виртуальная таблица Остатки

Подходит для получения остатков на дату с отборами; требует рассчитанных итогов для скорости

Таблица движений регистра

Подходит для анализа проводок конкретного документа; не даёт готовых остатков

Временная таблица

Подходит для многошаговых запросов; требует ручного управления и пакетного запроса

Итог

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

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

Часто задаваемые вопросы

Можно ли найти виртуальную таблицу в базе SQL Server?

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

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

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

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

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

Чем отличаются Остатки от ОстаткиИОбороты?

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

Как узнать, какие физические таблицы соответствуют регистру?

Используйте функцию ПолучитьСтруктуруХраненияБазыДанных() — она возвращает таблицу соответствия объектов метаданных и имён таблиц СУБД. Это полезно для диагностики и анализа планов запросов, но не для прямого изменения данных.

Работают ли виртуальные таблицы в файловой базе так же, как в клиент-серверной?

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