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

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

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

Синтаксис объявления временной таблицы

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

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

⚠️ Внимание: Временная таблица существует только в контексте одного соединения. Если вы создали ВТ в одном запросе, а затем открыли новое соединение (новый объект Запрос в коде), старая таблица там видна не будет. Все промежуточные данные должны обрабатываться в рамках одной сессии выполнения кода.

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

ПОМЕСТИТЬ ВТ_Сотрудники

ВЫБРАТЬ

Справочник.Сотрудники.Ссылка КАК Сотрудник,

Справочник.Сотрудники.Наименование КАК ФИО

ПОМЕСТИТЬ ВТ_Сотрудники

В данном примере создается таблица ВТ_Сотрудники, которая будет содержать ссылки на элементы справочника и их наименования. Обратите внимание, что алиасы полей (после КАК) становятся именами колонок в новой временной таблице. Это позволяет стандартизировать названия полей для дальнейшей работы, независимо от того, из каких физических таблиц были взяты исходные данные.

Размещение временных таблиц и области видимости

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

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

💡

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

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

  • 🚀 Высокая скорость: Данные часто хранятся в RAM, что ускоряет повторные выборки.
  • 💾 Автоматическая очистка: Не нужно писать код для удаления временных данных, система сделает это сама.
  • 🔒 Изоляция: Данные видны только текущему пользователю в текущем сеансе, нет риска конфликта имен с другими пользователями.

Сравнение с Таблицей Значений

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

Главное преимущество ВТ заключается в возможности выполнять над данными полноценные SQL-операции: JOIN, GROUP BY, UNION без выгрузки данных из контекста СУБД. Если вы используете Таблицу Значений, то для сложной фильтрации или группировки вам часто приходится выгружать данные в память клиента или сервера приложений, обрабатывать их циклами или использовать встроенные методы, что может быть медленнее на больших объемах. Запросы с ВТ позволяют СУБД использовать свои механизмы оптимизации.

📊 Что вы чаще используете для промежуточных данных?
Временные таблицы (ВТ)
Таблица Значений (ТЗ)
Регистры сведений
Не использую промежуточные данные

С другой стороны, Таблица Значений удобнее для программной манипуляции данными: добавления строк по одной, изменения конкретных ячеек в цикле, сортировки на уровне кода 1С. Временные таблицы лучше подходят для пакетной обработки: «взял большой кусок данных, преобразовал запросом, получил результат». Смешивание подходов часто приводит к лучшей производительности: загрузка данных в ВТ, первичная фильтрация запросом, и только потом, при необходимости, выгрузка в ТЗ для детальной логики.

Критерий Временная таблица (ВТ) Таблица Значений (ТЗ)
Место выполнения Сервер 1С / СУБД Память процесса 1С
Оптимизация Планировщик СУБД Алгоритмы платформы 1С
Сложные выборки Высокая эффективность (JOIN, UNION) Требует циклов или доп. запросов
Гибкость изменения Низкая (только через запросы) Высокая (программное добавление/удаление)

Множественные временные таблицы и цепочки запросов

В реальных задачах часто возникает необходимость построить конвейер обработки данных. Платформа 1С позволяет создавать несколько временных таблиц в рамках одного сеанса и использовать их последовательно. Вы можете создать первую ВТ, отфильтровать данные, затем на её основе создать вторую ВТ с агрегацией, и так далее. Это позволяет разбивать сложные бизнес-логики на понятные этапы.

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

// Создание первой временной таблицы

Запрос1 = Новый Запрос;

Запрос1.Текст = "ПОМЕСТИТЬ ВТ_Черновик

|ВЫБРАТЬ..";

Запрос1.Выполнить();

// Использование первой таблицы для создания второй

Запрос2 = Новый Запрос;

Запрос2.Текст = "ПОМЕСТИТЬ ВТ_Итог

|ВЫБРАТЬ

| ВТ_Черновик.Поле1

|ИЗ ВТ_Черновик КАК ВТ_Черновик

|ГДЕ..";

Запрос2.Выполнить();

⚠️ Внимание: Не создавайте избыточное количество временных таблиц. Каждая ВТ потребляет ресурсы сервера. Если вы можете выполнить всю логику в одном сложном запросе с вложенными подзапросами, это часто предпочтительнее, чем дробление на 5-6 промежуточных таблиц, если только это не упрощает отладку или не требуется для специфической оптимизации планов выполнения.

Также стоит учитывать, что имена временных таблиц чувствительны к регистру в некоторых конфигурациях СУБД, хотя платформа 1С обычно нивелирует это. Рекомендуется придерживаться единого стиля именования, например, префикса ВТ_, чтобы легко отличать их от реальных таблиц конфигурации при чтении кода.

Очистка и управление жизненным циклом

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

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

Когда стоит использовать ручное удаление?

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

Синтаксис удаления прост и аналогичен созданию:

УДАЛИТЬ ВРЕМЕННУЮ ТАБЛИЦУ ВТ_ПромежуточныеДанные

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

Типичные ошибки и оптимизация

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

Еще одна проблема — отсутствие индексов. Хотя платформа 1С автоматически создает индексы по полям соединений (JOIN) и полей в условиях WHERE для временных таблиц, в сложных случаях с большими объемами данных может потребоваться ручное указание индексов. Это делается через параметры запроса или специальные директивы, но требует глубокого понимания плана выполнения запроса.

☑️ Чек-лист оптимизации ВТ

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

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

💡

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

Можно ли создать временную таблицу без оператора ВЫБРАТЬ?

Нет, оператор ПОМЕСТИТЬ всегда должен сопровождаться запросом на выборку данных (ВЫБРАТЬ). Нельзя создать пустую структуру временной таблицы только по имени без заполнения данными в рамках одного оператора. Однако можно выбрать данные из несуществующей таблицы с условием ГДЕ 1=0, чтобы создать структуру без строк, но это редкий кейс.

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

Категорически нет. Временные таблицы изолированы на уровне соединения (session). Пользователь Б, работающий в своей сессии, не увидит таблицу, созданную пользователем А, даже если они используют одинаковые имена. Это обеспечивает безопасность и целостность данных.

Каков максимальный размер временной таблицы?

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

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

Нет, структура (имена и типы колонок) фиксируется в момент выполнения запроса с оператором ПОМЕСТИТЬ. Чтобы изменить структуру, нужно создать новую временную таблицу с другим именем и нужной структурой, выбрав данные из старой таблицы с необходимым преобразованием.

Влияет ли использование ВТ на лицензирование 1С?

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