Виртуальные таблицы в 1С:Предприятие 8.3 — это мощный инструмент, который позволяет получать данные из системы без физического хранения в базе. Они формируются "на лету" при выполнении запроса, что значительно ускоряет работу с большими объемами информации. Если вы когда-нибудь сталкивались с необходимостью получить остатки товаров на определенную дату, обороты по счетам или движения документов за период — виртуальные таблицы станут вашим спасением.
Основное преимущество такого подхода — отсутствие необходимости в предварительной обработке данных. Система сама собирает актуальную информацию из регистров накопления, бухгалтерии или расчетов прямо во время выполнения запроса. Это особенно ценно для отчетов, где требуются свежие данные без промежуточного хранения. Однако у виртуальных таблиц есть и свои нюансы: они могут тормозить при неправильном использовании или сложных условиях отбора.
В этой статье мы разберем:
- 🔹 Что такое виртуальные таблицы и чем они отличаются от обычных
- 🔹 Где их можно применять в типовой конфигурации
- 🔹 Пошаговую инструкцию по созданию в конструкторе запросов
- 🔹 Оптимизацию производительности при работе с большими данными
1. Виртуальные таблицы vs обычные таблицы БД: ключевые отличия
Прежде чем переходить к практике, важно понять фундаментальную разницу между виртуальными и физическими таблицами в 1С. Обычные таблицы (например, справочники или документы) хранят данные непосредственно в базе данных SQL. Их структура фиксирована, а изменения требуют миграций. Виртуальные же таблицы — это динамические представления данных, которые формируются на основе:
- 📊 Регистров накопления (остатки, обороты)
- 💰 Регистров бухгалтерии (движения по счетам)
- 📈 Регистров расчета (начисления зарплаты, больничные)
- 📄 Документов (движения по регистрам)
Главное преимущество виртуальных таблиц — они всегда актуальны. Например, таблица ОстаткиТоваров покажет текущие остатки на складах без необходимости предварительного расчета. Но есть и обратная сторона: при сложных запросах с множеством joins или агрегаций производительность может падать, так как данные не кешируются.
2. Где применяются виртуальные таблицы в типовой конфигурации
В стандартных конфигурациях 1С:Управление торговлей, 1С:Бухгалтерия или 1С:Зарплата и управление персоналом виртуальные таблицы активно используются в:
| Область применения | Примеры виртуальных таблиц | Типовая конфигурация |
|---|---|---|
| Учет товаров | ОстаткиТоваров, ОборотыТоваров | УТ 11, ERP 2 |
| Бухгалтерский учет | ОборотыПоСчетам, СальдоПоСчетам | БП 3.0 |
| Зарплата | НачисленияПоСотрудникам, Удержания | ЗУП 3.1 |
| Производство | ЗаказыНаПроизводство, МатериалыВПроизводстве | ERP 2 |
Например, отчет "Ведомость по товарам на складах" в 1С:УТ построена именно на виртуальной таблице остатков. Это позволяет показывать актуальные данные без предварительного расчета. А в 1С:Бухгалтерии таблица ОборотноСальдоваяВедомость использует виртуальные данные по счетам для формирования стандартных бухгалтерских отчетов.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Розница 2.3) виртуальные таблицы могут иметь ограничения по периодам. Перед использованием проверьте настройки регистров в конфигураторе — параметр Периодичность влияет на доступные виды виртуальных таблиц (по дням, месяцам или кварталам).
3. Пошаговая инструкция: как создать запрос с виртуальной таблицей
Рассмотрим процесс на примере получения остатков товаров на текущую дату. Для этого:
Откройте Конструктор запросов (
Файл → Новый → Запросв конфигураторе или через менюВсе функциив пользовательском режиме).В списке таблиц найдите раздел "Виртуальные таблицы" и выберите нужный регистр. Для нашего примера это
РегистрНакопления.ТоварыНаСкладах.Раскройте список виртуальных таблиц для этого регистра. Нас интересует
Остатки(илиОстаткиИОбороты, если нужны и движения).Перенесите в запрос необходимые поля:
Товар,Склад,Количество. Добавьте параметр&Датадля фильтрации по дате.
Готовый запрос будет выглядеть так:
ВЫБРАТЬ
ОстаткиТоваров.Товар КАК Товар,
ОстаткиТоваров.Склад КАК Склад,
ОстаткиТоваров.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК ОстаткиТоваров
ГДЕ
ОстаткиТоваров.КоличествоОстаток > 0
Указан корректный регистр накопления|
Добавлен параметр даты (&Дата)|
Отобраны только ненулевые остатки|
Поля имеют понятные псевдонимы (КАК)
-->
Для выполнения запроса нажмите F5 или кнопку "Выполнить". Система сформирует виртуальную таблицу с актуальными остатками на указанную дату. Обратите внимание, что при большом количестве номенклатуры запрос может выполняться несколько секунд — это нормально для виртуальных таблиц.
4. Работа с параметрами виртуальных таблиц
Одной из ключевых особенностей виртуальных таблиц является возможность передачи параметров, которые влияют на результат. Например, для таблицы остатков обязательно нужно указать дату, на которую требуются данные. Рассмотрим основные виды параметров:
- 📅 Дата — для таблиц остатков и оборотов (
Остатки(&Дата)) - 📊 Период — для оборотных таблиц (
Обороты(&НачалоПериода, &КонецПериода)) - 🔍 Отбор — дополнительные условия фильтрации (
Остатки.Товар В (&СписокТоваров)) - 📈 Агрегация — группировка по полям (
СГРУППИРОВАТЬ ПО Товар)
Пример запроса с несколькими параметрами:
ВЫБРАТЬ
ОборотыТоваров.Товар КАК Товар,
СУММА(ОборотыТоваров.КоличествоОборот) КАК КоличествоПродано
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоМесяца, &КонецМесяца) КАК ОборотыТоваров
ГДЕ
ОборотыТоваров.Склад В (&СписокСкладов)
СГРУППИРОВАТЬ ПО
ОборотыТоваров.Товар
Если вам нужны данные за длительный период (например, год), разбивайте запрос на несколько частей по месяцам. Это значительно ускорит выполнение за счет уменьшения объема обрабатываемых данных.
Важно: параметры даты в виртуальных таблицах регистров бухгалтерии должны соответствовать периодичности регистра. Если регистр ведется помесячно, указание точной даты (например, 15.05.2026) приведет к округлению до начала месяца.
5. Оптимизация производительности при работе с виртуальными таблицами
Несмотря на удобство, виртуальные таблицы могут тормозить при обработке больших объемов данных. Вот ключевые рекомендации по оптимизации:
Используйте отборы — сужайте выборку по складам, организациям или типам номенклатуры. Чем меньше данных обрабатывается, тем быстрее выполнится запрос.
Избегайте JOIN'ов — соединение виртуальной таблицы с другими таблицами (особенно с большими справочниками) может значительно замедлить выполнение. По возможности используйте подзапросы.
Разбивайте периоды — вместо запроса оборотов за год делайте несколько запросов по кварталам, а затем объединяйте результаты в СКД.
Кешируйте результаты — если данные не меняются часто, сохраняйте результаты запроса в временную таблицу и работайте с ней.
Пример оптимизированного запроса для больших объемов:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Остатки.Товар КАК Товар,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекДата) КАК Остатки
ГДЕ
Остатки.Склад В (&АктивныеСклады)
И Остатки.Товар.ЭтоГруппа = ЛОЖЬ
ИНДЕКСИРОВАТЬ ПО
Товар,
Склад
// Далее работаем с временной таблицей ВТ_Остатки
ВЫБРАТЬ
ВТ_Остатки.Товар КАК Товар,
СУММА(ВТ_Остатки.Остаток) КАК ИтогоОстаток
ИЗ
ВТ_Остатки КАК ВТ_Остатки
СГРУППИРОВАТЬ ПО
ВТ_Остатки.Товар
⚠️ Внимание: В конфигурациях с большим количеством движений по регистрам (например, оптовые базы с миллионами строк в месяц) виртуальные таблицы могут блокировать базу на время выполнения запроса. В таких случаях рассмотрите возможность использования рассчитанных полей или предварительного расчета в фоне.
6. Типичные ошибки и как их избежать
При работе с виртуальными таблицами разработчики часто сталкиваются с типичными проблемами. Вот наиболее распространенные из них и способы решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Запрос выполняется слишком долго | Отсутствуют отборы по ключевым полям (склад, организация) | Добавьте условия в секцию ГДЕ для сужения выборки |
| Некорректные остатки на дату | Указана дата, не соответствующая периодичности регистра | Проверьте настройки регистра в конфигураторе (день/месяц/квартал) |
| Ошибка "Поле не найдено" | Опечатка в имени виртуальной таблицы или поля | Используйте подсказку в конструкторе запросов для проверки синтаксиса |
| Дублирование строк в результате | Отсутствует группировка по ключевым полям | Добавьте СГРУППИРОВАТЬ ПО или используйте РАЗЛИЧНЫЕ |
Одна из самых коварных ошибок — несоответствие типов данных при соединении виртуальной таблицы с другими источниками. Например, если в виртуальной таблице поле Товар имеет тип СправочникСсылка.Номенклатура, а вы пытаетесь соединить его с полем типа Строка, получите ошибку. Всегда проверяйте типы в конструкторе запросов.
Как проверить структуру виртуальной таблицы?
В конструкторе запросов выделите виртуальную таблицу в списке источников и нажмите кнопку "Показать данные". Система отобразит структуру полей с их типами. Это поможет избежать ошибок при написании запроса.
7. Практический пример: отчет по остаткам с виртуальной таблицей
Давайте создадим полноценный отчет, который показывает остатки товаров на складах с возможностью фильтрации по группе номенклатуры. Для этого:
Создайте новый отчет в конфигураторе (
Файл → Новый → Отчет).В конструкторе схемы компоновки данных (СКД) добавьте новый Набор данных — Запрос.
Напишите запрос к виртуальной таблице остатков:
ВЫБРАТЬОстатки.Товар КАК Товар,
Остатки.Товар.Наименование КАК НаименованиеТовара,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество,
Остатки.Товар.Родитель КАК ГруппаТоваров
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток > 0
И (&ГруппаТоваров = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ИЛИ Остатки.Товар.Родитель В (&ГруппаТоваров))
В параметрах отчета создайте:
- 📅
ДатаОтчета(типДата, значение по умолчанию — текущая дата) - 📦
ГруппаТоваров(типСправочникСсылка.Номенклатура, множественный выбор)
- 📅
Настройте структуру отчета в СКД: добавьте группировки по Группе товаров и Складу, расчеты итогов.
Такой отчет будет динамически показывать остатки с возможностью фильтрации по дате и группе номенклатуры. При этом все данные берутся напрямую из регистра без предварительной обработки.
Использование виртуальных таблиц в СКД позволяет создавать гибкие отчеты без написания сложного кода. Достаточно правильно составить запрос и настроить параметры компоновки.
FAQ: Частые вопросы по виртуальным таблицам в 1С
Можно ли создать свою виртуальную таблицу в 1С?
Нет, виртуальные таблицы формируются автоматически на основе регистров накопления, бухгалтерии или расчета. Однако вы можете создать предопределенную виртуальную таблицу в конфигураторе, если требуется специфическая логика отбора или представление данных. Для этого используется объект ВиртуальнаяТаблица в модулях.
Почему виртуальная таблица возвращает пустой результат?
Это может происходить по нескольким причинам:
- 🗓️ Указана дата, на которую нет движений в регистре
- 🔍 Слишком строгие отборы (например, по несуществующему складу)
- 🛠️ Ошибки в синтаксисе запроса (неверное имя таблицы или поля)
- 🔄 Регистр не имеет периодичности (проверьте настройки в конфигураторе)
Проверьте запрос в отладочном режиме (Отладка → Пошаговая отладка) или выполните его в конструкторе с выводом плана выполнения.
Как ускорить запрос к виртуальной таблице с большим объемом данных?
Основные способы оптимизации:
- Добавьте индексы по полям, используемым в отборах (
ИНДЕКСИРОВАТЬ ПОв запросе). - Разбейте большой период на более мелкие интервалы (например, по месяцам).
- Используйте временные таблицы для промежуточных результатов.
- Ограничьте количество возвращаемых полей (берите только необходимые).
- Для регулярных отчетов настройте фоновое задание по предварительному расчету данных.
Можно ли обновить данные в виртуальной таблице?
Нет, виртуальные таблицы предназначены только для чтения. Они формируются на основе текущего состояния регистров и не поддерживают операции ВСТАВИТЬ, ОБНОВИТЬ или УДАЛИТЬ. Для изменения данных используйте документы или прямую запись в регистры через объектную модель.
Где хранится описание виртуальных таблиц в конфигурации?
Описание виртуальных таблиц генерируется системой на основе:
- 📋 Структуры регистров (накопления, бухгалтерии, расчета)
- 📝 Параметров периодичности (день, месяц, квартал)
- 🔧 Настроек измерений и ресурсов в конфигураторе
Посмотреть доступные виртуальные таблицы можно в синтакс-помощнике (F1 в конструкторе запросов) или через меню Все функции → Виртуальные таблицы.