1С Ошибка: Временная таблица с таким именем уже существует — Решение
- Ошибка времени выполнения
Временная таблица с таким именем уже существуетпри повторном выполнении алгоритма. - Сбой сложных отчетов СКД, использующих общий
МенеджерВременныхТаблиц. - Аварийное завершение циклических пакетных запросов в обработках закрытия месяца и перерасчета итогов.
- Ошибка при объединении пакетов запросов с одинаковыми именами конструкций
ПОМЕСТИТЬ.
1. Причина возникновения ошибки
Ошибка возникает, когда в один и тот же объект МенеджерВременныхТаблиц повторно выполняется пакетный запрос с директивой ПОМЕСТИТЬ ВТ_ИмяТаблицы без предварительного удаления ранее созданной временной таблицы из оперативной памяти СУБД.
2. Корректное уничтожение временной таблицы в тексте запроса
Всегда явно уничтожайте временную таблицу в конце пакета запроса с помощью оператора УНИЧТОЖИТЬ (DROP):
ТекстЗапроса = "
|ВЫБРАТЬ
| Товары.Ссылка КАК Номенклатура,
| Товары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_ТоварыКОбработке
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|;
|////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Номенклатура,
| СУММА(ВТ.Количество) КАК ВсегоКоличество
|ИЗ
| ВТ_ТоварыКОбработке КАК ВТ
|СГРУППИРОВАТЬ ПО
| ВТ.Номенклатура
|;
|////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ ВТ_ТоварыКОбработке // Явное освобождение памяти
|";3. Программная очистка Менеджера Временных Таблиц в цикле (BSL)
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Для Каждого СсылкаДокумент Из МассивДокументов Цикл
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = ПолучитьТекстПакетаЗапросов();
Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаДокумент);
Результат = Запрос.Выполнить();
// Закрытие и очистка всех таблиц менеджера перед следующей итерацией
МенеджерВТ.Закрыть();
МенеджерВТ = Новый МенеджерВременныхТаблиц;
КонецЦикла; Частые вопросы (FAQ)
Где физически хранятся временные таблицы 1С?
В клиент-серверном варианте временные таблицы (с префиксом #tt*) создаются в системной базе данных СУБД: tempdb в Microsoft SQL Server или в оперативной памяти/дисковом кэше процессов PostgreSQL.
В чем опасность забытых неуничтоженных временных таблиц?
Они удерживают память СУБД (раздувают tempdb), блокируют параллельную работу и приводят к деградации оптимизатора запросов (Query Optimizer) из-за неактуальной статистики.
Можно ли поместить результат во временную таблицу внутри вложенного запроса?
Нет. Конструкция ПОМЕСТИТЬ допускается только на верхнем уровне пакета запросов 1С и не может использоваться во вложенных подзапросах (Subqueries).
Что делает метод МенеджерВТ.Закрыть()?
Метод отправляет в СУБД команду на немедленное удаление всех существующих временных таблиц, связанных с данным объектом менеджера, и освобождает память.