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

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

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

Архитектура и область видимости временных таблиц

Внутренняя реализация временных таблиц в 1С: Предприятие 8 зависит от используемой системы управления базами данных (СУБД). В файловом варианте базы данных эти таблицы создаются во временном каталоге профиля пользователя, тогда как в клиент-серверном варианте (MS SQL, PostgreSQL, Oracle) они создаются непосредственно в пространстве имен СУБД как локальные временные объекты. Это обеспечивает высокую скорость доступа, так как данные не проходят через сетевой интерфейс между сервером 1С и сервером баз данных лишний раз.

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

⚠️ Внимание: Несмотря на автоматическую очистку при разрыве соединения, длительное удержание соединения с открытыми тяжелыми временными таблицами может занимать место во временном табличном пространстве (tempdb) сервера SQL. Мониторьте размер tempdb при массовых операциях.

Структура таблицы определяется типами данных колонок, которые выводятся из первого запроса, формирующего таблицу, или описываются явно через конструктор запроса.

💡

При создании временной таблицы старайтесь сразу отбирать только необходимые поля. Лишние колонки увеличивают объем занимаемой памяти и замедляют последующую запись данных.

Синтаксис создания и инициализация структуры

Процесс создания временной таблицы начинается с ключевого слова ВЫБРАТЬ и модификатора В. Синтаксис требует указания имени таблицы после ключевого слова ПОМЕСТИТЬ или использования конструкции В ТАБЛИЦУ в конце запроса. Платформа анализирует типы полей результирующего набора данных и создает соответствующую структуру в памяти.

Рассмотрим базовый пример инициализации. Допустим, нам нужно получить список номенклатуры с остатками. Мы можем сразу поместить результат во временное хранилище:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Номенклатура,

Номенклатура.Наименование КАК Наименование,

СУММА(Остатки.Количество) КАК Остаток

ПОМЕСТИТЬ ВТ_Остатки

ИЗ

РегистрНакопления.Остатки КАК Остатки

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Остатки.Номенклатура = Номенклатура.Ссылка

ГДЕ

Остатки.Период МЕЖДУ &Начало И &Конец

СГРУППИРОВАТЬ ПО

Номенклатура.Ссылка,

Номенклатура.Наименование

;

После выполнения этого запроса таблица ВТ_Остатки становится доступной для всех последующих запросов в рамках данной сессии. Имя таблицы чувствительно к регистру, поэтому рекомендуется соблюдать единый стиль именования, например, префикс ВТ_ (Временная Таблица) для читаемости кода.

  • 📌 Имя временной таблицы должно быть уникальным в рамках одного запроса, но может совпадать с именами в других запросах той же сессии (последующее создание затрет предыдущее).
  • 📌 Типы данных полей определяются автоматически по первому запросу, создающему таблицу.
  • 📌 Максимальная длина имени таблицы ограничена возможностями СУБД, но лучше держать его в пределах 50 символов.
📊 Какой префикс вы используете для временных таблиц?
ВТ_
Temp_
#
t_
Другой

Запись данных: команды ДОБАВИТЬ и ВЫБРАТЬ

После того как структура создана, в нее необходимо записать данные. Существует два основных способа наполнения: использование команды ДОБАВИТЬ для вставки результатов другого запроса или использование ВЫБРАТЬ.. В для создания новой таблицы с данными. Для уже существующей таблицы используется именно ДОБАВИТЬ.

При добавлении данных критически важно соответствие типов и количества полей. Если вы пытаетесь добавить строку, где поле "Количество" имеет тип Число, а в таблице это поле определено как Строка, платформа выдаст ошибку совместимости типов. Также порядок полей в запросе добавления должен строго соответствовать порядку полей в целевой таблице, если не используется явное указание имен колонок.

⚠️ Внимание: При добавлении данных в таблицу, созданную с ключевыми полями (индексами), операция может выполняться медленнее из-за необходимости перестройки индекса после каждой вставки. Массовую загрузку лучше делать до создания индексов.

Пример добавления данных из другого источника:

ДОБАВИТЬ В ВТ_Остатки

ВЫБРАТЬ

НоменклатураДоп.Ссылка,

НоменклатураДоп.Наименование,

0

ИЗ

Справочник.НоменклатураДоп КАК НоменклатураДоп

ГДЕ

НЕ НоменклатураДоп.ПометкаУдаления

;

В данном примере мы дополняем основную выборку дополнительными позициями с нулевым остатком. Обратите внимание, что третье поле заполняется константой 0, тип которой автоматически приводится к типу поля Остаток в целевой таблице.

Оптимизация производительности и ключевые поля

Одной из главных причин использования временных таблиц является возможность управления индексацией. По умолчанию временные таблицы не имеют индексов, что делает поиск по ним полным перебором (Table Scan). Для больших объемов данных это может стать узким местом. Решением является создание таблицы с указанием ключевых полей.

Для этого используется конструкция КЛЮЧЕВЫЕ ПОЛЯ сразу после имени таблицы при ее создании. Это указывает СУБД создать кластерный или некластерный индекс (в зависимости от СУБД) по указанным колонкам. Это особенно актуально, если вы планируете выполнять соединения (JOIN) по этим полям или делать выборки с условием ГДЕ.

Сценарий использования Рекомендация по индексации Влияние на скорость
Простой перебор всех строк Без ключевых полей Максимальная скорость записи
Частый поиск по конкретному контрагенту КЛЮЧЕВЫЕ ПОЛЯ Контрагент Ускорение выборки в 10-100 раз
Соединение по составному ключу КЛЮЧЕВЫЕ ПОЛЯ Номенклатура, Склад Оптимизация JOIN операций
Уникальность записей КЛЮЧЕВЫЕ ПОЛЯ УникальныйИдентификатор Защита от дублей при вставке

Следует учитывать, что наличие индексов замедляет операцию вставки (ДОБАВИТЬ), так как СУБД должна поддерживать структуру индекса в актуальном состоянии. Поэтому оптимальной стратегией часто является: создать таблицу без индексов -> массово заполнить данными -> создать индекс (если СУБД позволяет) или пересоздать таблицу с ключевыми полями, выбрав данные из самой себя.

Нюансы работы с NULL значениями

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

Управление жизненным циклом и удаление таблиц

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

Для удаления используется команда УДАЛИТЬ ВРЕМЕННЫЕ ТАБЛИЦЫ. Она может удалять одну конкретную таблицу или все временные таблицы сессии. Важно использовать эту команду осторожно, чтобы не удалить данные, необходимые для последующих этапов алгоритма.

УДАЛИТЬ ВРЕМЕННЫЕ ТАБЛИЦЫ ВТ_Остатки;

Если вы разрабатываете обработку, которая запускается в цикле или многократно в рамках одного сеанса (например, фоновое задание), явная очистка становится обязательной практикой. Накопление временных таблиц может привести к исчерпанию квот памяти сервера 1С или переполнению tempdb на стороне SQL сервера.

  • ♻️ Всегда проверяйте существование таблицы перед удалением, если логика работы ветвистая.
  • ♻️ Используйте удаление в блоках "Исключения", чтобы гарантировать очистку ресурсов при ошибке.
  • ♻️ Избегайте удаления таблиц, которые используются в текущем выполняющемся запросе.

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

☑️ Оптимизация запроса с временной таблицей

Выполнено: 0 / 4

Типичные ошибки и лучшие практики

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

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

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

💡

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

Использование конструктора запросов значительно упрощает работу с синтаксисом, но для тонкой настройки производительности часто приходится править текст запроса вручную. Понимание того, как формируется план выполнения запроса с участием временных таблиц, отличает начинающего разработчика от эксперта.

Часто задаваемые вопросы (FAQ)

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

Нет, временные таблицы существуют только в контексте сессии на сервере 1С (или в файловой базе). Вы не можете напрямую передать объект временной таблицы как параметр метода. Однако вы можете передать данные, записав их в таблицу значений на клиенте, а на сервере поместить эту таблицу значений во временную таблицу запроса.

В чем разница между Временной таблицей и Таблицей значений?

Таблица значений — это объект типа 1С, существующий в памяти процесса клиента или сервера 1С. Временная таблица — это объект уровня СУБД (SQL). Временные таблицы работают быстрее при больших объемах данных и позволяют использовать мощный язык SQL для обработки, тогда как таблицы значений удобны для передачи данных и простой логики.

Что будет, если создать таблицу с таким же именем второй раз?

Если вы попытаетесь создать временную таблицу с именем, которое уже существует в текущей сессии, платформа выдаст ошибку "Имя временной таблицы уже занято". Перед созданием необходимо либо удалить старую таблицу, либо использовать уникальное имя.

Как посмотреть содержимое временной таблицы в отладчике?

Напрямую посмотреть содержимое временной таблицы SQL в отладчике 1С нельзя, так как это объект СУБД. Для отладки нужно выполнить запрос ВЫБРАТЬ * ИЗ ВТ_ИмяТаблицы и вывести результат в таблицу значений или посмотреть в консоль запроса (Таблица значений результата).

Влияют ли временные таблицы на размер файла базы данных (для файлового варианта)?

Да, в файловом варианте базы данных (.1CD) временные таблицы записываются во временные файлы профиля пользователя. Они не увеличивают основной файл базы, но занимают место на диске. После завершения сеанса эти файлы должны быть удалены, но при аварийном завершении могут остаться "мусорные" файлы.