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