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