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