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

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

Когда удаляются временные таблицы в 1С

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

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

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

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

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

Временная таблица создаётся в момент выполнения оператора «ПОМЕСТИТЬ» в запросе. Она не сохраняется в информационной базе: данные размещаются в памяти сервера 1С или во временном хранилище СУБД (например, в tempdb для MS SQL Server). Именно поэтому временные таблицы не переживают перезапуск сервера и не видны другим сеансам.

Видимость и время жизни таблицы определяются менеджером временных таблиц — объектом «МенеджерВременныхТаблиц». Пока существует менеджер, которому принадлежит таблица, таблица доступна для последующих запросов, использующих тот же менеджер. Как только менеджер уничтожается, все его таблицы удаляются безвозвратно.

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

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

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

Второй случай — уничтожение явно созданного менеджера. Это происходит, когда переменная, хранящая объект «МенеджерВременныхТаблиц», выходит из области видимости (например, процедура завершилась) или когда вызывается метод «Закрыть()». Все таблицы менеджера удаляются одновременно.

Третий случай — окончание сеанса или перезапуск сервера. Поскольку временные таблицы не хранятся в базе данных, любой разрыв соединения, завершение сеанса пользователя или рестарт службы сервера 1С приводит к их полной потере. Рассчитывать на сохранность временных таблиц между вызовами сервера из разных сеансов нельзя.

Жизнь таблицы внутри пакетного запроса

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

Как удалить временную таблицу вручную

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

Чтобы удалить все таблицы сразу, достаточно закрыть менеджер: вызвать метод «Закрыть()» у объекта МенеджерВременныхТаблиц. После этого менеджер нельзя использовать повторно — попытка выполнить запрос с закрытым менеджером вызовет ошибку.

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

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

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

Типичный сценарий — отчёт на СКД или сложная обработка: сначала отбираются данные во временную таблицу с отборами, затем она соединяется с другими выборками. Такой подход часто быстрее одного «монолитного» запроса, потому что каждый этап проще оптимизируется СУБД.

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

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

Типичные ошибки и их причины

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

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

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

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

Как проверить, что таблицы удалены

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

На уровне СУБД временные объекты можно наблюдать в tempdb (MS SQL Server) или во временных табличных пространствах (PostgreSQL). Если после массовой обработки tempdb заметно выросла и не уменьшается, вероятно, в коде есть незакрытые менеджеры или длинные транзакции, удерживающие временные структуры.

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

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

Количество таблиц в менеджере (МенеджерВТ.Таблицы.Количество())
Норма

После УНИЧТОЖИТЬ и Закрыть() счётчик уменьшается до нуля

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

Количество таблиц растёт в цикле обработки

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

Выполняется без ошибок «Таблица не найдена» и «уже существует»

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

Ошибка при повторном запуске — таблицы не очищены

Память серверного процесса при массовой обработке
Норма

Рост умеренный и стабилизируется

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

Память растёт пропорционально числу итераций

Практические рекомендации по очистке

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

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

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

Маршрут решения

Как выбрать действие

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

FAQ: частые вопросы о временных таблицах в 1С

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

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

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

Менеджер будет уничтожен сборщиком мусора платформы, когда переменная выйдет из области видимости, и таблицы удалятся. Однако в длительных процедурах и циклах это происходит не сразу, поэтому память может расти — явный вызов Закрыть() делает освобождение предсказуемым.

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

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

Удаляются ли временные таблицы при откате транзакции?

Сама структура временной таблицы не откатывается как данные базы: если таблица была создана внутри транзакции, после отката она обычно остаётся в менеджере, но её содержимое зависит от поведения СУБД. Надёжнее после отката уничтожить такие таблицы явно и создать заново.

Где физически хранятся временные таблицы?

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

Как узнать, какие временные таблицы сейчас существуют в менеджере?

Переберите коллекцию МенеджерВТ.Таблицы — у каждого элемента есть имя и можно получить данные через метод Получить(). Это удобно для отладки: перед закрытием менеджера можно вывести список оставшихся таблиц и найти «забытые».

Итог

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

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