Разработка и Конфигурация · 10 мин
Как очистить менеджер временных таблиц в 1С
Как очистить менеджер временных таблиц в 1С: метод Уничтожить(), удаление отдельных таблиц, типичные ошибки и проверка результата в запросах.
Менеджер временных таблиц в 1С — это объект, который хранит промежуточные результаты запросов в течение сеанса работы с ним. Если временные таблицы накапливаются без контроля, запросы начинают работать медленнее, растёт потребление памяти сервера, а при повторном создании таблицы с тем же именем возникает ошибка «Таблица уже существует». Поэтому очистка менеджера — обязательная часть аккуратной работы с запросами.
Очистить менеджер временных таблиц можно двумя способами: полностью уничтожить объект методом Уничтожить() либо удалить отдельные таблицы запросом УНИЧТОЖИТЬ. Выбор зависит от того, нужны ли вам остальные таблицы в этом менеджере дальше по логике алгоритма.
Ниже разобраны оба подхода, примеры кода, типичные ошибки и способы проверить, что очистка действительно выполнена.
Что такое менеджер временных таблиц и когда его нужно очищать
Менеджер временных таблиц (объект МенеджерВременныхТаблиц) создаётся разработчиком и передаётся в запрос через свойство МенеджерВременныхТаблиц. Все таблицы, помещённые в него конструкцией ПОМЕСТИТЬ, живут, пока существует сам менеджер, и доступны для последующих запросов, использующих тот же объект.
Очистка требуется в нескольких ситуациях. Во-первых, когда в цикле или длинной процедуре создаются десятки промежуточных таблиц — они занимают память даже после того, как перестали быть нужны. Во-вторых, когда один и тот же менеджер переиспользуется в разных логических блоках и есть риск конфликта имён таблиц. В-третьих, перед повторным выполнением пакета запросов, чтобы гарантировать чистое окружение.
Полная очистка: метод Уничтожить()
Самый простой способ очистить все временные таблицы разом — вызвать метод Уничтожить() у объекта менеджера. После вызова все таблицы удаляются, а сам менеджер можно использовать заново: он остаётся валидным объектом, просто пустым.
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Ссылка
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Справочник.Номенклатура КАК Товары";
Запрос.Выполнить();
// ... дальнейшая работа с таблицей ...
// Полная очистка всех временных таблиц
МенеджерВТ.Уничтожить();
После вызова Уничтожить() любая попытка обратиться к ранее созданной таблице приведёт к ошибке «Таблица не найдена». Учитывайте это, если менеджер передаётся между процедурами: уничтожение в одном месте делает таблицы недоступными везде.
Точечная очистка: запрос УНИЧТОЖИТЬ
Если из десяти временных таблиц нужны только две, удалять всё нерационально. В языке запросов 1С есть оператор УНИЧТОЖИТЬ, который удаляет конкретную таблицу из менеджера:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "УНИЧТОЖИТЬ ВТ_Товары";
Запрос.Выполнить();
Удалять можно несколько таблиц последовательными вызовами или в пакетном запросе — каждый оператор УНИЧТОЖИТЬ отделяется точкой с запятой как отдельный запрос пакета. Это удобно в длинных алгоритмах: промежуточные таблицы удаляются сразу после того, как отработали, а итоговые остаются.
Практический приём — уничтожать таблицу сразу после того, как она последний раз использована в соединении или выборке. Это снижает пиковое потребление памяти в сложных отчётах и обработках.
- 1Определите, какие временные таблицы больше не нужны в текущем менеджере
- 2Создайте запрос и присвойте ему тот же объект МенеджерВременныхТаблиц
- 3В тексте запроса укажите УНИЧТОЖИТЬ с точным именем таблицы
- 4Выполните запрос методом Выполнить()
- 5Проверьте, что оставшиеся таблицы по-прежнему доступны в следующих запросах
Как проверить, какие таблицы есть в менеджере
Перед очисткой полезно узнать текущее содержимое менеджера. Для этого служит метод ПолучитьТаблицу(ИмяТаблицы), который возвращает таблицу значений с содержимым временной таблицы, либо вызывает исключение, если таблицы нет. Список всех имён можно получить косвенно — в типовых конфигурациях и инструментах разработчика для этого есть готовые функции.
Пример безопасной проверки существования таблицы:
Функция ТаблицаСуществует(МенеджерВТ, ИмяТаблицы)
Попытка
МенеджерВТ.ПолучитьТаблицу(ИмяТаблицы);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Такую проверку удобно вставлять перед ПОМЕСТИТЬ в повторно выполняемом коде: если таблица уже есть — сначала уничтожить, потом создать заново. Это защищает от ошибки «Таблица уже существует».
Как проверить результат очистки
Ошибка «Таблица не найдена» — таблица действительно удалена
Запрос выполняется — таблица не удалена, проверьте, тот ли менеджер использован
Запрос с ПОМЕСТИТЬ выполняется без ошибок
Ошибка «Таблица уже существует» — очистка не сработала
Нужные таблицы доступны и возвращают данные
Пропали таблицы, которые должны были остаться — применён Уничтожить() вместо УНИЧТОЖИТЬ
Типичные ошибки при очистке временных таблиц
Самая частая ошибка — выполнение УНИЧТОЖИТЬ через запрос, которому назначен другой менеджер временных таблиц (или не назначен вовсе). В этом случае платформа ищет таблицу в пустом менеджере и сообщает, что она не найдена, хотя в «вашем» менеджере она есть. Всегда проверяйте, что свойство МенеджерВременныхТаблиц запроса указывает на нужный объект.
Вторая ошибка — преждевременный вызов Уничтожить() в универсальной процедуре, которой менеджер передан параметром. Вызывающий код продолжает обращаться к таблицам и падает с ошибкой. Правило простое: уничтожать менеджер должен тот, кто его создал, либо это должно быть явно задокументировано в контракте процедуры.
Третья группа проблем — опечатки в именах таблиц при УНИЧТОЖИТЬ. Имена временных таблиц регистронезависимы, но должны совпадать посимвольно. Если таблица называется ВТ_ТоварыОтбор, то УНИЧТОЖИТЬ ВТ_Товары её не удалит.
Альтернативы: когда очистка не нужна
Не всегда менеджер нужно чистить вручную. Если менеджер создаётся локально внутри процедуры и не передаётся наружу, он будет уничтожен автоматически при выходе переменной из области видимости — вместе со всеми таблицами. Явный вызов Уничтожить() в этом случае избыточен, хотя и не вреден.
Альтернативный подход — вместо очистки создавать новый менеджер для каждого логического блока: МенеджерВТ = Новый МенеджерВременныхТаблиц;. Старый объект со всеми таблицами будет удалён сборщиком, как только на него не останется ссылок. Это чище архитектурно, чем переиспользование одного менеджера с постоянной ручной чисткой.
Ещё один вариант — вообще отказаться от долгоживущих временных таблиц там, где достаточно вложенных запросов или пакета запросов с немедленным использованием результата. Чем меньше состояния хранит менеджер, тем меньше поводов для ошибок.
Сравнение подходов
Подходит для полного сброса. Ограничение: удаляет все таблицы, включая нужные в другом коде
Подходит для точечного удаления в длинных алгоритмах. Ограничение: требует точного имени таблицы и того же менеджера
Подходит для независимых этапов обработки. Ограничение: таблицы не переносятся между блоками
Подходит для локальных менеджеров внутри процедуры. Ограничение: при большом объёме таблиц память освобождается позже
Практические рекомендации по работе с временными таблицами
Выработайте единый стиль: кто создал менеджер — тот и отвечает за его жизненный цикл. Если процедура принимает менеджер параметром, она может добавлять таблицы, но не должна уничтожать весь менеджер без явной договорённости.
Используйте говорящие префиксы имён, например ВТ_ для долгоживущих таблиц и ВТ_Промежуточная_ для тех, что подлежат удалению сразу после использования. Это упрощает чтение кода и поиск мест, где нужна очистка.
В тяжёлых обработках и отчётах удаляйте промежуточные таблицы сразу после последнего использования — это заметно снижает нагрузку на сервер СУБД, потому что временные таблицы в клиент-серверном варианте физически создаются в базе tempdb.
В клиент-серверном варианте временные таблицы физически размещаются в tempdb на сервере СУБД. Регулярное удаление ненужных таблиц уменьшает рост tempdb и снижает риск замедления всей системы при массовых обработках.
Что важно запомнить
Полная очистка выполняется методом Уничтожить(), точечная — запросом УНИЧТОЖИТЬ с тем же менеджером. Уничтожайте таблицы только после последнего использования и проверяйте результат обращением к таблице.
Частые вопросы
Что происходит с временными таблицами после Уничтожить()?
Все таблицы менеджера удаляются, а сам объект менеджера остаётся рабочим — в него можно снова помещать таблицы через ПОМЕСТИТЬ. Обращение к старым таблицам вызовет ошибку «Таблица не найдена».
Можно ли уничтожить сразу несколько таблиц одним запросом?
Да. В пакетном запросе напишите несколько операторов УНИЧТОЖИТЬ, разделённых точкой с запятой, и выполните запрос методом Выполнить(). Каждый оператор удалит свою таблицу.
Что будет, если уничтожить несуществующую таблицу?
Платформа вызовет исключение с сообщением, что таблица не найдена. Если имя таблицы формируется динамически, оборачивайте выполнение в Попытка/Исключение или предварительно проверяйте существование через ПолучитьТаблицу().
Нужно ли очищать менеджер, созданный внутри процедуры?
Не обязательно: при выходе переменной из области видимости менеджер и все его таблицы будут удалены автоматически. Явная очистка имеет смысл в длинных процедурах и циклах, чтобы раньше освободить память и tempdb.
Почему УНИЧТОЖИТЬ сообщает, что таблица не найдена, хотя она есть?
Чаще всего запросу назначен другой менеджер временных таблиц или свойство не заполнено вовсе. Проверьте, что Запрос.МенеджерВременныхТаблиц указывает именно на тот объект, где создана таблица.
Влияет ли очистка временных таблиц на производительность?
Да. В клиент-серверном варианте временные таблицы хранятся в tempdb на сервере СУБД, и их своевременное удаление уменьшает объём занимаемого места и нагрузку. В файловом варианте эффект касается в основном оперативной памяти процесса.