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

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

Как очистить менеджер временных таблиц в 1С

Как очистить менеджер временных таблиц в 1С: метод Уничтожить(), удаление отдельных таблиц, типичные ошибки и проверка результата в запросах.

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

Очистить менеджер временных таблиц можно двумя способами: полностью уничтожить объект методом Уничтожить() либо удалить отдельные таблицы запросом УНИЧТОЖИТЬ. Выбор зависит от того, нужны ли вам остальные таблицы в этом менеджере дальше по логике алгоритма.

Ниже разобраны оба подхода, примеры кода, типичные ошибки и способы проверить, что очистка действительно выполнена.

Что такое менеджер временных таблиц и когда его нужно очищать

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

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

Полная очистка: метод Уничтожить()

Самый простой способ очистить все временные таблицы разом — вызвать метод Уничтожить() у объекта менеджера. После вызова все таблицы удаляются, а сам менеджер можно использовать заново: он остаётся валидным объектом, просто пустым.

МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Ссылка

|ПОМЕСТИТЬ ВТ_Товары

|ИЗ

| Справочник.Номенклатура КАК Товары";

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

// ... дальнейшая работа с таблицей ...

// Полная очистка всех временных таблиц

МенеджерВТ.Уничтожить();

После вызова Уничтожить() любая попытка обратиться к ранее созданной таблице приведёт к ошибке «Таблица не найдена». Учитывайте это, если менеджер передаётся между процедурами: уничтожение в одном месте делает таблицы недоступными везде.

Точечная очистка: запрос УНИЧТОЖИТЬ

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

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

Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос.Текст = "УНИЧТОЖИТЬ ВТ_Товары";

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

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

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

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

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

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

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

Функция ТаблицаСуществует(МенеджерВТ, ИмяТаблицы)

Попытка

МенеджерВТ.ПолучитьТаблицу(ИмяТаблицы);

Возврат Истина;

Исключение

Возврат Ложь;

КонецПопытки;

КонецФункции

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

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

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

Обращение к удалённой таблице
Норма

Ошибка «Таблица не найдена» — таблица действительно удалена

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

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

Создание таблицы с тем же именем после очистки
Норма

Запрос с ПОМЕСТИТЬ выполняется без ошибок

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

Ошибка «Таблица уже существует» — очистка не сработала

Работа оставшихся таблиц
Норма

Нужные таблицы доступны и возвращают данные

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

Пропали таблицы, которые должны были остаться — применён Уничтожить() вместо УНИЧТОЖИТЬ

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

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

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

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

Типичные ошибки
01
УНИЧТОЖИТЬ выполняется запросом с другим менеджером временных таблиц — таблица не найдена, очистка не происходит
02
Уничтожить() вызывается до того, как данные таблиц использованы в вызывающем коде — ошибка «Таблица не найдена»
03
Повторное ПОМЕСТИТЬ без предварительного удаления таблицы — ошибка «Таблица уже существует»
04
Попытка уничтожить несуществующую таблицу без проверки — исключение прерывает выполнение

Альтернативы: когда очистка не нужна

Не всегда менеджер нужно чистить вручную. Если менеджер создаётся локально внутри процедуры и не передаётся наружу, он будет уничтожен автоматически при выходе переменной из области видимости — вместе со всеми таблицами. Явный вызов Уничтожить() в этом случае избыточен, хотя и не вреден.

Альтернативный подход — вместо очистки создавать новый менеджер для каждого логического блока: МенеджерВТ = Новый МенеджерВременныхТаблиц;. Старый объект со всеми таблицами будет удалён сборщиком, как только на него не останется ссылок. Это чище архитектурно, чем переиспользование одного менеджера с постоянной ручной чисткой.

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

Сравнение подходов

МенеджерВТ.Уничтожить()

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

Запрос УНИЧТОЖИТЬ

Подходит для точечного удаления в длинных алгоритмах. Ограничение: требует точного имени таблицы и того же менеджера

Новый менеджер для каждого блока

Подходит для независимых этапов обработки. Ограничение: таблицы не переносятся между блоками

Без явной очистки

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

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

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

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

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

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

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

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

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

Что происходит с временными таблицами после Уничтожить()?

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

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

Да. В пакетном запросе напишите несколько операторов УНИЧТОЖИТЬ, разделённых точкой с запятой, и выполните запрос методом Выполнить(). Каждый оператор удалит свою таблицу.

Что будет, если уничтожить несуществующую таблицу?

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

Нужно ли очищать менеджер, созданный внутри процедуры?

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

Почему УНИЧТОЖИТЬ сообщает, что таблица не найдена, хотя она есть?

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

Влияет ли очистка временных таблиц на производительность?

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