Виртуальные таблицы в 1С:Предприятие — это мощный инструмент, который позволяет получать данные из системы без создания физических таблиц в базе. Они генерируются "на лету" при выполнении запроса, что значительно ускоряет работу с большими объемами информации. Но чтобы эффективно их использовать, нужно разбираться в параметрах виртуальных таблиц — специальных настройках, которые определяют, какие именно данные и в каком формате будут возвращены.
Эта статья поможет разобраться, зачем нужны параметры виртуальных таблиц, какие из них наиболее востребованы в практике 1С-разработчиков, и как их правильно применять в запросах. Мы рассмотрим не только базовые понятия, но и нюансы работы с ВиртуальнаяТаблица(), типичные ошибки, а также приведём реальные примеры кода. Особое внимание уделим параметрам, которые часто вызывают затруднения у начинающих специалистов.
Что такое виртуальные таблицы в 1С и зачем они нужны
Виртуальные таблицы — это временные структуры данных, которые формируются системой 1С:Предприятие по запросу пользователя. В отличие от обычных таблиц базы данных, они не хранятся на диске, а создаются динамически на основе текущего состояния объектов конфигурации. Это позволяет:
- 🔹 Экономить ресурсы — нет необходимости хранить промежуточные данные в физических таблицах.
- 🔹 Упрощать запросы — многие стандартные отчёты (например, оборотно-сальдовая ведомость) построены на виртуальных таблицах.
- 🔹 Получать актуальные данные — виртуальная таблица всегда отражает текущее состояние регистров, документов или справочников.
- 🔹 Ускорять разработку — не нужно писать сложные SQL-запросы для агрегации данных.
Основное применение виртуальных таблиц — это работа с регистрами накопления, бухгалтерии и расчётов. Например, таблица Обороты регистра ТоварыНаСкладах позволяет получить остатки и движения товаров за период без ручного суммирования всех приходных и расходных документов.
Если вам нужно получить данные за длительный период (например, год), виртуальная таблица с параметром Период будет работать быстрее, чем ручной обход всех документов в цикле.
Основные параметры виртуальных таблиц: полный список
Параметры виртуальных таблиц передаются в функцию ВиртуальнаяТаблица() и определяют, какие именно данные будут извлечены. Все параметры можно разделить на несколько групп:
- Параметры отбора — ограничивают данные по периодам, организациям, валютам и другим критериям.
- Параметры агрегации — настраивают уровень детализации (по дням, месяцам, в целом).
- Параметры представления — влияют на формат выходных данных (например, включение дополнительных полей).
- Специальные параметры — используются для нестандартных задач (например,
ТольконезакрытыеПериоды).
Ниже приведена таблица с наиболее востребованными параметрами и их назначением:
| Параметр | Тип данных | Описание | Пример использования |
|---|---|---|---|
Период |
Дата, Массив дат | Определяет временной интервал, за который возвращаются данные. Может быть single-датой или диапазоном. | |
Организация |
СправочникСсылка.Организации | Фильтрует данные по конкретной организации (актуально для многопользовательских баз). | |
Измерения |
Массив строк | Указывает, какие измерения регистра должны быть включены в результат (например, ["Склад", "Номенклатура"]). |
|
Ресурсы |
Массив строк | Определяет, какие ресурсы (количество, сумма и т.д.) нужно вывести. | |
ТолькоНеНулевыеОстатки |
Булево | Если Истина, в результат попадают только записи с ненулевыми остатками. |
|
Важно понимать, что некоторые параметры являются обязательными для определённых типов виртуальных таблиц. Например, для таблицы Обороты регистра накопления всегда нужно указывать параметр Период, иначе система не сможет определить временной интервал для агрегации данных.
Как использовать параметры в запросах: практические примеры
Рассмотрим несколько реальных примеров запросов с виртуальными таблицами, где параметры играют ключевую роль.
Пример 1. Получение остатков товара на складе по организации
Допустим, нам нужно получить остатки номенклатуры на складе "Основной" для организации "ООО Альфа" на текущую дату. Запрос будет выглядеть так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Период,
| Организация = &Организация,
| Склад = &Склад
| ) КАК ОстаткиТоваровОстатки";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Организация", Справочники.Организации.НайтиПоНаименованию("ООО Альфа"));
Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("Основной"));
Результат = Запрос.Выполнить();
Пример 2. Обороты по контрагентам за квартал с детализацией по месяцам
Если требуется получить обороты по регистру ВзаиморасчётыСКонтрагентами за 1-й квартал 2026 года с разбивкой по месяцам, используем параметры Период и УровеньДетализации:
Запрос.Текст =
"ВЫБРАТЬ
| ОборотыПоКонтрагентам.Период КАК Месяц,
| ОборотыПоКонтрагентам.Контрагент КАК Контрагент,
| ОборотыПоКонтрагентам.СуммаОборотДт КАК Дебет,
| ОборотыПоКонтрагентам.СуммаОборотКт КАК Кредит
|ИЗ
| РегистрБухгалтерии.ВзаиморасчетыСКонтрагентами.Обороты(
| &НачалоПериода, &КонецПериода, Месяц
| ) КАК ОборотыПоКонтрагентам";
Запрос.УстановитьПараметр("НачалоПериода", Дата(2026, 01, 01));
Запрос.УстановитьПараметр("КонецПериода", Дата(2026, 03, 31));
Типичные ошибки при работе с параметрами виртуальных таблиц
Даже опытные разработчики иногда допускают ошибки при работе с виртуальными таблицами. Вот наиболее распространённые из них:
- ❌ Неуказанный обязательный параметр — например, забыли передать
Периоддля таблицыОбороты. Это приведёт к ошибке выполнения запроса. - ❌ Неправильный тип данных — передача строки вместо даты или ссылки на справочник вместо массива.
- ❌ Избыточные параметры — указание ненужных измерений или ресурсов, что замедляет выполнение запроса.
- ❌ Неучтённые права доступа — если у пользователя нет прав на просмотр данных по организации, виртуальная таблица вернёт пустой результат.
Одна из самых коварных ошибок — это несоответствие периодов в параметрах и фактических данных. Например, если вы запрашиваете обороты за период, в котором ещё не были проведены документы, результат будет пустым, но ошибки не возникнет. Чтобы избежать этого, всегда проверяйте:
Указан ли период (даты не пустые)?
Совпадают ли типы данных параметров с ожидаемыми?
Есть ли у пользователя права на запрашиваемые данные?
Не превышает ли запрашиваемый период разумные границы (например, 10 лет)?-->
Ещё одна частая проблема — неверная интерпретация параметра УровеньДетализации. Если указать День для большого периода (например, год), запрос может выполняться очень долго или даже привести к переполнению памяти.
⚠️ Внимание
В версиях 1С:Предприятие 8.3.20+ появились новые параметры для виртуальных таблиц, такие как
ТолькоАктивныеЗаписидля регистров сведений. Уточняйте актуальный список параметров в синтакс-помощнике вашей версии платформы.
Оптимизация запросов с виртуальными таблицами
Виртуальные таблицы могут существенно нагружать сервер, особенно если запрашиваются большие периоды или сложные агрегации. Вот несколько советов по оптимизации:
- Ограничивайте период — вместо запроса за "всю историю" берите только необходимый интервал.
- Используйте отбор по организациям — если данные нужны только по одной организации, всегда указывайте её в параметрах.
- Сокращайте количество измерений — если вам не нужна детализация по складу, не включайте его в запрос.
- Применяйте
ТолькоНеНулевыеОстатки— это сокращает объём возвращаемых данных. - Избегайте вложенных виртуальных таблиц — если можно обойтись одним запросом, не делите его на несколько.
Пример оптимизированного запроса для получения остатков по номенклатуре:
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Период,
| Организация = &Организация,
| ТолькоНеНулевыеОстатки = Истина
| ) КАК Остатки
|ГДЕ
| Остатки.Номенклатура В (&СписокНоменклатуры)";
Запрос.УстановитьПараметр("СписокНоменклатуры", МассивНоменклатуры);
Такой подход сокращает время выполнения запроса в несколько раз по сравнению с запросом без отборов.
Всегда проверяйте план выполнения запроса в консоли запросов (кнопка "Показать план"). Если в плане есть операции Полное сканирование, это сигнал о необходимости оптимизации.
Разница между виртуальными таблицами в 8.2 и 8.3
С выходом версии 1С:Предприятие 8.3 виртуальные таблицы претерпели значительные изменения. Основные отличия:
| Характеристика | 1С 8.2 | 1С 8.3 |
|---|---|---|
| Синтаксис вызова | РегистрНакопления.Имя.Остатки() |
РегистрНакопления.Имя.ОстаткиИОбороты() (объединённые таблицы) |
Поддержка УровеньДетализации |
Ограниченная (только День/Месяц) | Расширенная (День, Неделя, Месяц, Квартал, Год, Секунда) |
Параметр ТолькоАктивныеЗаписи |
Нет | Да (для регистров сведений) |
| Производительность | Медленнее при больших объёмах данных | Оптимизированный механизм кэширования |
В 8.3 также появилась возможность использовать виртуальные таблицы для динамических списков, что упростило создание отчётов с гибкими настройками периодов и группировок.
Однако есть и обратная сторона: некоторые старые запросы, написанные для 8.2, могут не работать в 8.3 без модификации. Например, если в 8.2 вы использовали:
РегистрНакопления.Продажи.Обороты(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()))
то в 8.3 этот код может вернуть ошибку, и его нужно заменить на:
РегистрНакопления.Продажи.Обороты(, НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()))
Продвинутые техники: динамические параметры и программное формирование запросов
Для сложных задач иногда требуется динамически формировать параметры виртуальных таблиц в зависимости от условий. Например, если нужно получить данные по разным регистрам в зависимости от типа документа.
Пример динамического формирования запроса:
ТипДанных = ПолучитьТипДанныхИзНастроек(); // Например, "Остатки" или "Обороты"
Регистр = ОпределитьРегистрПоТипу(ТипДанных); // Функция возвращает имя регистра
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Данные.Номенклатура КАК Номенклатура,
| Данные.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления." + Регистр + "." + ТипДанных + "(
| &Период,
| Организация = &Организация
| ) КАК Данные";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Организация", ТекущаяОрганизация());
Такой подход позволяет создавать универсальные обработки, которые работают с разными регистрами без переписывания кода.
Ещё одна продвинутая техника — это использование временных таблиц для промежуточных расчётов. Например, если нужно сначала получить список номенклатуры по какому-то критерию, а затем запросить по нему остатки:
// Шаг 1: Получаем список номенклатуры
Запрос1 = Новый Запрос("ВЫБРАТЬ Номенклатура ИЗ Справочник.Номенклатура ГДЕ ПометкаУдаления = ЛОЖЬ");
Результат1 = Запрос1.Выполнить();
СписокНоменклатуры = Результат1.ВыгрузитьКолонку("Номенклатура");
// Шаг 2: Запрашиваем остатки только по отобранной номенклатуре
Запрос2.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Период,
| Номенклатура В (&СписокНоменклатуры)
| ) КАК Остатки";
⚠️ Внимание
При динамическом формировании запросов всегда экранируйте имена объектов (особенно если они берутся из пользовательского ввода), чтобы избежать SQL-инъекций. Используйте функцию
ЭкранироватьСтоку()или параметры запроса.
FAQ: Частые вопросы о параметрах виртуальных таблиц 1С
Можно ли использовать виртуальные таблицы в отчётах на СКД?
Да, виртуальные таблицы активно используются в системе компоновки данных (СКД). Для этого в настройках схемы компоновки нужно указать виртуальную таблицу как источник данных и передать необходимые параметры через параметры отчёта. Например, в отчёте "Оборотно-сальдовая ведомость" параметры периода и организации передаются именно так.
Почему запрос с виртуальной таблицей выполняется очень долго?
Причин может быть несколько:
- Слишком большой период (например, запрос остатков за 10 лет).
- Отсутствие отборов по организациям или складам, что приводит к сканированию всех данных.
- Использование уровня детализации
СекундаилиДеньдля длительных периодов. - Нехватка индексов в базе данных (актуально для больших баз).
Рекомендация: разбейте запрос на части, используйте параметр ТолькоНеНулевыеОстатки и проверьте план выполнения.
Как передать массив значений в параметр виртуальной таблицы?
Для передачи массива (например, списка номенклатуры) используйте конструкцию В (&ИмяПараметра) в тексте запроса и метод УстановитьПараметр:
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Номенклатура В (&СписокНоменклатуры)";
Запрос.УстановитьПараметр("СписокНоменклатуры", МассивНоменклатуры);
Убедитесь, что элементы массива имеют правильный тип (например, ссылки на справочник Номенклатура).
Что такое параметр ТолькоАктивныеЗаписи и когда его использовать?
Этот параметр доступен для виртуальных таблиц регистров сведений и позволяет получить только актуальные (незакрытые) записи. Он полезен, когда:
- В регистре хранятся исторические данные с датами начала и окончания действия.
- Нужно исключить устаревшие записи (например, старые курсы валют).
- Требуется ускорить запрос, исключив обработку неактуальных данных.
Пример:
РегистрСведений.КурсыВалют.СрезПоследних(
,
Валюта В (&СписокВалют),
ТолькоАктивныеЗаписи = Истина
)
Можно ли создать свою виртуальную таблицу в 1С?
Нет, механизм виртуальных таблиц жёстко зашит в платформу 1С:Предприятие, и создать пользовательскую виртуальную таблицу невозможно. Однако вы можете:
- Создавать объединённые запросы из нескольких виртуальных таблиц.
- Использовать временные таблицы для промежуточных расчётов.
- Разрабатывать расширения конфигурации, добавляющие новые регистры, для которых платформа автоматически сгенерирует виртуальные таблицы.