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