Как исправить ошибку «В базе данных уже существует объект с именем "#tt1"» в 1С при работе с MS SQL Server?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При переводе старых конфигураций (таких как «Бухгалтерия предприятия 1.6», «Управление торговлей 10.3» и других нетиповых решений) с платформы 1С 8.2 на платформу 8.3 пользователи и администраторы часто сталкиваются с аварийным завершением работы. В журнале регистрации и на экранах клиентов появляется ошибка СУБД: «Microsoft SQL Native Client: В базе данных уже существует объект с именем "#tt1" (или "##tt...") HRESULT=80040E14, native=2714». Ошибка может возникать хаотично: при проведении документов, формировании отчетов, динамическом обновлении или попытке выполнить тестирование и исправление информационной базы.

Разберем детально механизм появления этого сбоя, выясним его корень и рассмотрим пошаговые способы полного устранения проблемы.

Механизм возникновения проблемы

Символ # в MS SQL Server обозначает локальную временную таблицу, создаваемую в системной базе tempdb в рамках текущей пользовательской сессии (SPID). Платформа 1С транслирует запросы с созданием временных таблиц, присваивая им системные имена вида #tt1, #tt2 и так далее.

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

  1. Пул постоянных соединений кластера 1С: Рабочий процесс сервера rphost держит пул открытых физических соединений к MS SQL Server. Если клиентский сеанс прерывается, запрос падает по таймауту или пользователь аварийно закрывает программу, физическое подключение возвращается в пул сервера 1С.
  2. Несброшенный контекст сессии СУБД: В некоторых сценариях временная таблица не успевает корректно уничтожиться, а служебная команда очистки сеанса sp_reset_connection не отрабатывает должным образом. В результате таблица #tt1 продолжает существовать внутри конкретного соединения.
  3. Конфликт генератора запросов в режиме совместимости «Версия 8.1»: В платформе 8.3 полностью переработан механизм переиспользования сессий СУБД. При включенном режиме совместимости «Версия 8.1» транслятор запросов 1С обращается к устаревшему алгоритму, который не учитывает специфику многопоточного пула 8.3. При следующем запросе в этом же соединении платформа пытается заново создать объект #tt1, на что MS SQL Server возвращает ошибку 2714 (объект с таким именем уже существует).
  4. Неявные временные таблицы: Платформа генерирует таблицы #tt не только при явном использовании менеджера временных таблиц, но и при передаче списков значений в конструкции вида ГДЕ Поле В (&Массив), а также при работе отборов динамических списков.

Способ 1. Изменение режима совместимости конфигурации (Основное решение)

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

Разберем по шагам, как правильно переключить режим:

  1. Откроем базу в режиме Конфигуратор и создадим резервную копию базы данных.
  2. В дереве метаданных откроем свойства корневого узла конфигурации.
  3. Найдем свойство Режим совместимости и переключим его со значения Версия 8.1 на Версия 8.2.13 или Версия 8.2.16.
  4. Применим изменения клавишей F7 и обновим конфигурацию базы данных.

Обратим внимание на нюансы, которые могут возникнуть после изменения режима совместимости:

  1. Проверка заполнения реквизитов: В платформе 8.2 у реквизитов справочников и документов появилось свойство ПроверкаЗаполнения. Если в метаданных было установлено значение Выдавать ошибку (например, для наименования), программа начнет жестко требовать заполнение поля при записи. При необходимости скорректируйте это свойство на Не проверять.
  2. Сортировка в запросах: В режиме совместимости 8.2 ужесточились требования к синтаксису запросов. Если в секции УПОРЯДОЧИТЬ ПО используются поля, которых нет в списке выборки ВЫБРАТЬ, платформа может вызвать исключение.
  3. Событие «ОбработкаЗаполнения»: Проверьте модули объектов: при интерактивном создании новых элементов формы начнет отрабатывать стандартная процедура ОбработкаЗаполнения, поведение которой в 8.1 могло игнорироваться.

Способ 2. Оптимизация запросов и отказ от неявных временных таблиц

Если ошибка возникает в конкретной операции (например, при проведении определенного документа или формировании тяжелого отчета), причиной часто является передача больших списков в параметр условия В (...). Платформа 1С автоматически пытается создать таблицу #tt1 на стороне SQL Server, выгрузить туда переданный массив и выполнить подзапрос.

Посмотрим на пример проблемного кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	Номенклатура.Артикул
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка В(&МассивСсылок)";

Запрос.УстановитьПараметр("МассивСсылок", МассивНоменклатуры);
Результат = Запрос.Выполнить();

Если МассивНоменклатуры содержит сотни или тысячи элементов, при сбое транзакции созданная СУБД таблица #tt1 рискует зависнуть в соединении. Перепишем логику с использованием объекта МенеджерВременныхТаблиц и явным уничтожением созданных структур:


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

// Помещаем массив в типизированную таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Для Каждого ТекСсылка Из МассивНоменклатуры Цикл
    Стр = ТЗ.Добавить();
    Стр.Ссылка = ТекСсылка;
КонецЦикла;

Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТаблицаИсточника.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ ВТ_Фильтр
    |ИЗ
    |	&ТаблицаИсточника КАК ТаблицаИсточника
    |ИНДЕКСИРОВАТЬ ПО
    |	Ссылка;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	Номенклатура.Артикул
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Фильтр КАК ВТ_Фильтр
    |		ПО Номенклатура.Ссылка = ВТ_Фильтр.Ссылка;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ ВТ_Фильтр";

Запрос.УстановитьПараметр("ТаблицаИсточника", ТЗ);
Результат = Запрос.Выполнить();

// Обязательно закрываем менеджер для освобождения ресурсов
МенеджерВТ.Закрыть();

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

Способ 3. Выбор стабильного релиза платформы 1С

Сбой генерации временных таблиц являлся зарегистрированной ошибкой в некоторых релизах платформ веток 8.3.6 (например, 8.3.6.2332, 8.3.6.2390) и ранних сборках 8.3.7. Если специфика конфигурации категорически не позволяет повысить режим совместимости до 8.2, проанализируем варианты смены версии платформы:

  1. Откат на стабильную ветку 8.3.5: На сборках платформы 8.3.5 (например, 8.3.5.1383, 8.3.5.1517) алгоритм изоляции временных таблиц в режиме 8.1 работает корректно и не вызывает сбоев с #tt1.
  2. Переход на актуальные версии 8.3.8 и выше: В более поздних релизах платформы разработчики исправили поведение пула соединений, улучшив обработку сброса сессий для устаревших конфигураций.

Способ 4. Настройка параметров кластера серверов 1С

Чтобы исключить накопление зависших соединений в процессах rphost, скорректируем параметры кластера через консоль администрирования 1С:

  1. Откроем консоль Администрирование серверов 1С Предприятия.
  2. Перейдем в свойства локального кластера.
  3. Установим параметр Интервал перезапуска рабочих процессов равным 86400 секунд (сутки) или чаще, если нагрузка высокая. Это позволит автоматически перезапускать рабочие процессы без разрыва пользовательских сессий, очищая внутренние пулы подключений.
  4. Настроим параметры Допустимый объем памяти и Интервал превышения допустимого объема памяти для предотвращения утечек оперативной памяти и зависших запросов.

Способ 5. Настройка MS SQL Server и системной базы tempdb

Дополнительно убедимся в корректности окружения со стороны СУБД:

  1. Обновление драйвера СУБД: Если на сервере 1С используется устаревший компонент SQL Server Native Client 10.0 (от SQL Server 2008), установим Microsoft SQL Server 2012 Native Client (версия 11.0). Более свежий драйвер корректнее транслирует служебные команды управления сессиями.
  2. Конфигурация файлов tempdb: Убедимся, что база tempdb разбита на несколько файлов данных одинакового размера (по числу физических ядер процессора, но не более 8). Зададим фиксированный автоприрост файлов (например, по 512 МБ), исключив процентное приращение, чтобы избежать задержек при распределении страниц для таблиц #tt.
← На главную