К статье
Практический материал

Разработка и Конфигурация · 11 мин

Для чего нужны временные таблицы в запросе 1С

Для чего нужны временные таблицы в запросах 1С: ускорение выборок, упрощение сложных запросов, менеджер временных таблиц, типичные ошибки и примеры кода.

Временная таблица в запросе 1С — это промежуточный набор данных, который создаётся конструкцией «ПОМЕСТИТЬ В», существует в оперативной памяти сервера и используется в последующих запросах пакета. Она не сохраняется в базе данных, не требует предварительного описания структуры и автоматически уничтожается при закрытии менеджера временных таблиц или явной командой «УНИЧТОЖИТЬ».

Главная причина применения временных таблиц — производительность и читаемость. Когда один и тот же отбор данных нужен несколько раз, гораздо эффективнее один раз вычислить его и сохранить во временную таблицу, чем повторять тяжёлое соединение или подзапрос в каждом месте. Кроме того, разбиение монолитного запроса на логические этапы через промежуточные таблицы делает код понятнее и проще в отладке.

Без временных таблиц разработчик вынужден строить громоздкие вложенные подзапросы, которые оптимизатор СУБД нередко выполняет неоптимально: повторно обращается к одним и тем же физическим таблицам, строит лишние соединения. Временная таблица фиксирует промежуточный результат, и дальнейшие шаги работают уже с компактным набором данных.

Что такое временная таблица и как она работает

Временная таблица создаётся прямо в тексте запроса с помощью предложения «ПОМЕСТИТЬ В ИмяТаблицы». Результат выборки материализуется в памяти (на сервере 1С или СУБД — зависит от режима работы) и доступен под указанным именем во всех последующих запросах того же пакета или менеджера временных таблиц.

Жизненный цикл временной таблицы ограничен. Она существует, пока открыт менеджер временных таблиц, либо до явного уничтожения командой «УНИЧТОЖИТЬ ИмяТаблицы». После закрытия менеджера все созданные в нём таблицы удаляются автоматически, поэтому утечки данных между сеансами исключены.

Важно понимать: временная таблица не является объектом метаданных. Её структура определяется составом полей выборки, которая её заполнила, и не может быть изменена отдельно. Если нужна другая структура — создаётся новая таблица.

Основные задачи, которые решают временные таблицы

Ускорение повторяющихся выборок

Если в запросе один и тот же сложный отбор (например, остатки по списку складов с отбором по дате) используется в нескольких соединениях или подзапросах, СУБД может вычислять его многократно. Поместив результат во временную таблицу один раз, вы гарантируете, что тяжёлая операция выполнится единожды, а дальше пойдут обращения к уже готовому компактному набору.

Передача таблицы значений в запрос

Одна из самых востребованных возможностей — передать в запрос данные, которых нет в базе: список контрагентов, отобранных пользователем, таблицу из внешнего файла, результат предыдущих вычислений в коде. Таблица значений передаётся параметром и помещается во временную таблицу, после чего с ней можно соединяться как с обычной таблицей.

bsl
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);
Запрос.Текст =
"ВЫБРАТЬ
|	Таб.Номенклатура КАК Номенклатура,
|	Таб.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Отбор
|ИЗ
|	&ТаблицаТоваров КАК Таб
|;
|////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	Остатки.Номенклатура КАК Номенклатура,
|	Остатки.КоличествоОстаток КАК Остаток
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(
|			,
|			Номенклатура В
|				(ВЫБРАТЬ
|					ВТ_Отбор.Номенклатура
|				ИЗ
|					ВТ_Отбор)) КАК Остатки";
Результат = Запрос.Выполнить().Выгрузить();

Декомпозиция сложной логики

Многошаговые расчёты — например, сначала отбор документов за период, затем вычисление оборотов по ним, затем сравнение с планом — естественно раскладываются на цепочку временных таблиц. Каждый шаг можно выполнить и проверить отдельно, что критично при отладке отчётов с десятком логических этапов.

Как создать и использовать временную таблицу

Базовый синтаксис состоит из двух частей: запрос-источник с предложением «ПОМЕСТИТЬ В» и последующие запросы, обращающиеся к созданной таблице по имени. Запросы разделяются точкой с запятой и выполняются как единый пакет одним вызовом «Выполнить()» или «ВыполнитьПакет()».

Порядок работы с временной таблицей
  1. 1
    Создайте объект Запрос и при необходимости задайте МенеджерВременныхТаблиц
  2. 2
    Напишите запрос-источник с предложением ПОМЕСТИТЬ В ИмяТаблицы
  3. 3
    Добавьте через точку с запятой запросы, использующие эту таблицу
  4. 4
    Установите параметры и выполните запрос или пакет
  5. 5
    Проверьте содержимое промежуточной таблицы через Выгрузить() при отладке
  6. 6
    Уничтожьте временную таблицу командой УНИЧТОЖИТЬ, если она больше не нужна

Если временная таблица нужна нескольким разным объектам «Запрос» по очереди, им передаётся один общий менеджер временных таблиц. Первый запрос создаёт таблицу, второй читает. Это стандартный приём при поэтапном построении отчётов в коде.

Имена временных таблиц принято начинать с префикса «ВТ_» — это не требование платформы, а устоявшееся соглашение, которое помогает сразу отличать временные таблицы от физических таблиц базы при чтении текста запроса.

Когда временные таблицы действительно ускоряют запрос

Выигрыш появляется не всегда. Временная таблица оправдана, когда промежуточный результат заметно меньше исходных данных и используется более одного раза, либо когда он позволяет заменить тяжёлый вложенный подзапрос на соединение с компактной таблицей.

Обратная ситуация: если во временную таблицу помещается почти весь регистр без отбора, вы получаете лишнее копирование большого объёма данных в память и, возможно, замедление вместо ускорения. Правило простое — сначала максимально сузьте данные отборами, и только потом материализуйте результат.

Временная таблица или вложенный подзапрос

Временная таблица

Подходит, когда результат используется несколько раз, нужна отладка промежуточных данных или передача таблицы значений из кода. Ограничение — расход памяти на материализацию.

Вложенный подзапрос

Подходит для простых одноразовых отборов, которые оптимизатор СУБД способен выполнить эффективно. Ограничение — при многократном использовании может вычисляться повторно и ухудшать читаемость.

Виртуальная таблица регистра

Подходит для остатков и оборотов с отбором по периоду и измерениям. Ограничение — не заменяет произвольную многошаговую логику расчёта.

Типичные ошибки при работе с временными таблицами

Самая частая ошибка — обращение к временной таблице в запросе, у которого не установлен тот же менеджер временных таблиц. Платформа выдаёт ошибку «Таблица не найдена», хотя в тексте запроса всё написано верно. Проверяйте, что свойство «МенеджерВременныхТаблиц» заполнено до выполнения.

Вторая распространённая проблема — неуничтоженные временные таблицы в длинных цепочках запросов. Каждая таблица занимает память сервера; в массовых обработках это приводит к росту потребления памяти и замедлению. Уничтожайте таблицы сразу после последнего использования.

Типичные ошибки
01
Запрос без общего менеджера временных таблиц — ошибка «Таблица не найдена» при очевидно верном тексте
02
Помещение во временную таблицу миллионов записей без отбора — перерасход памяти и замедление вместо ускорения
03
Отсутствие команды УНИЧТОЖИТЬ в циклах и массовых обработках — накопление таблиц в памяти сервера
04
Соединение с временной таблицей без индексирования ключевых полей через ИНДЕКСИРОВАТЬ ПО — медленные соединения на больших объёмах
05
Пересоздание таблицы с тем же именем без уничтожения предыдущей — ошибка выполнения запроса

Ещё один тонкий момент — индексация. Для временных таблиц, по которым идут соединения, полезно указывать «ИНДЕКСИРОВАТЬ ПО» с полями связи. На малых объёмах разница незаметна, на больших — может быть кратной. Однако индексировать следует только те поля, которые реально участвуют в соединениях и отборах.

Как проверить содержимое и результат

Главное преимущество временных таблиц при отладке — возможность посмотреть промежуточный результат. Достаточно временно заменить «ПОМЕСТИТЬ В» на обычную выборку или выполнить отдельный запрос «ВЫБРАТЬ * ИЗ ВТ_Имя» через тот же менеджер и выгрузить результат в таблицу значений.

В консоли запросов (типовой или из инструментов разработчика) пакетный запрос с временными таблицами отлаживается пошагово: выполняете первую часть пакета, смотрите содержимое временной таблицы, затем следующую. Это позволяет локализовать ошибку в конкретном шаге расчёта.

Контрольные точки

Как проверить результат

Существование таблицы
Норма

Запрос выполняется без ошибки «Таблица не найдена»

Тревожный признак

Ошибка — проверьте менеджер временных таблиц и порядок пакета

Содержимое промежуточной таблицы
Норма

Выборка из ВТ возвращает ожидаемое число строк и корректные значения

Тревожный признак

Пустой результат или лишние строки — ошибка в отборах источника

Производительность
Норма

Пакет с временной таблицей выполняется быстрее варианта с вложенными подзапросами

Тревожный признак

Замедление — таблица слишком велика, отборы нужно применить раньше

Ограничения и меры предосторожности

Временные таблицы расходуют оперативную память сервера. В клиент-серверном варианте большие временные таблицы могут создавать нагрузку на СУБД и рабочие процессы сервера 1С. В регламентных заданиях и массовых обработках всегда оценивайте объём материализуемых данных и уничтожайте таблицы после использования.

Временная таблица недоступна вне своего менеджера: её нельзя «передать» другому сеансу или сохранить между вызовами сервера. Если промежуточные данные должны жить дольше одного вызова, используйте таблицу значений в коде или хранилище, а не временные таблицы.

Частые вопросы

Чем временная таблица отличается от таблицы значений?

Таблица значений — объект встроенного языка, живёт в коде и заполняется программно. Временная таблица — объект запроса, создаётся конструкцией ПОМЕСТИТЬ В и существует внутри менеджера временных таблиц. Таблицу значений можно передать в запрос параметром и превратить во временную таблицу для соединений с данными базы.

Можно ли использовать временную таблицу в другом запросе?

Да, если второму запросу присвоен тот же объект МенеджерВременныхТаблиц. Первый запрос создаёт таблицу, второй читает её по имени. Без общего менеджера платформа выдаст ошибку «Таблица не найдена».

Нужно ли явно уничтожать временные таблицы?

При закрытии менеджера временных таблиц они удаляются автоматически. Но в длинных пакетах, циклах и массовых обработках таблицы стоит уничтожать командой УНИЧТОЖИТЬ сразу после последнего использования — это освобождает память сервера ещё до завершения всей операции.

Всегда ли временная таблица ускоряет запрос?

Нет. Выигрыш есть, когда промежуточный результат компактен и используется многократно. Если во временную таблицу помещается большой объём без отбора, получается лишнее копирование данных и возможное замедление. Эффект проверяется замером времени выполнения на реальных данных.

Что делает конструкция ИНДЕКСИРОВАТЬ ПО?

Она создаёт индекс по указанным полям временной таблицы, что ускоряет соединения и отборы по этим полям на больших объёмах. Индексировать следует только поля, реально участвующие в соединениях, — лишние индексы тратят память и время на построение.

Итог

Что важно запомнить

Временные таблицы в запросе 1С — инструмент для хранения промежуточных результатов: они ускоряют повторно используемые выборки, упрощают сложные расчёты и позволяют передать таблицу значений из кода в запрос. Создавайте их через ПОМЕСТИТЬ В, сужайте данные отборами до материализации, используйте общий менеджер временных таблиц между запросами и уничтожайте таблицы после использования.