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

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

Виртуальные таблицы регистров 1С: устройство, виды и практика запросов

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

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

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

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

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

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

Ключевые свойства виртуальных таблиц:

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

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

Виды виртуальных таблиц по типам регистров

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

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

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

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

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

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

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

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

Граница и момент времени

Для получения остатков «на конец дня» используют конструкцию КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) или объект Граница с видом «Включая». Ошибка в границе на одну секунду или на включение/исключение документа — классическая причина расхождения отчёта с данными формы документа.

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

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

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

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

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

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

Левое соединение и NULL

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

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

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

Запрос к .Остатки выполняется секундамиИтоги, скорее всего, неактуальны или отбор не передан в параметры

Проверьте месяц расчёта итогов в управлении итогами и перенесите условия в параметры виртуальной таблицы

Остатки на прошлую дату считаются медленноРасчёт идёт от текущей границы итогов назад по движениям

Проверьте, не отключено ли хранение итогов за нужный период

Отчёт «зависает» при большом периодеВыбрана периодичность с детализацией до регистратора на большом объёме

Укрупните периодичность или ограничьте состав измерений отбором

Дополнительные факторы скорости:

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

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

Большинство проблем с виртуальными таблицами — не ошибки платформы, а следствие невнимательности к параметрам и контексту выполнения запроса.

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

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

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

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

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

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

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

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

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

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

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

Сумма остатков по запросу
Норма

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

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

Расходится — проверьте границу периода и включение документов

Время выполнения запроса
Норма

Доли секунды на типовом объёме данных с отбором в параметрах

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

Секунды и больше — условия в ГДЕ вместо параметров или неактуальные итоги

Строки без движений в «ОстаткиИОбороты»
Норма

Присутствуют или отсутствуют согласно выбранному методу дополнения

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

«Дырки» в периодах при методе «Движения» там, где ожидались границы

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

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

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

Почему запрос к «СрезПоследних» возвращает не те значения?

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

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

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

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

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

Что выбрать для отчёта: «ОстаткиИОбороты» или два отдельных запроса?

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

Почему в «Оборотах» нет поля остатка, а в «Остатках» нет оборотов?

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

Итог

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

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