Как исправить ошибку «Попытка вставки неуникального значения в уникальный индекс» при загрузке dt-файла в MS SQL Server?

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

При переносе информационной базы из файлового формата (.1CD) в клиент-серверный вариант на MS SQL Server специалисты часто сталкиваются со сбоем на этапе загрузки файла выгрузки (.dt). Платформа выдает ошибку вида: «Попытка вставки неуникального значения в уникальный индекс: Microsoft SQL Server Native Client... Выполнение инструкции CREATE UNIQUE INDEX прервано...».

В этой статье мы подробно разберем, почему возникает данная проблема, в чем заключается опасность эксплуатации такой базы и как корректно устранить сбой.

Критическая опасность использования недогруженной базы

Очень часто после возникновения подобного сбоя информационная база в режиме «1С:Предприятие» откроется без визуальных предупреждений. Однако работать или вести расчеты в такой базе категорически нельзя!

Процесс загрузки выгрузки .dt был аварийно прерван на этапе создания уникального индекса. Это означает, что часть системных таблиц, индексов или пользовательских данных просто не была создана на стороне СУБД. Эксплуатация нецелостной базы неизбежно приведет к постоянным сбоям и непредсказуемой потере данных.

Причины возникновения ошибки

Проанализируем механику работы платформ 1С при работе с разными СУБД:

Файловый движок 1С менее строго относится к контролю уникальности записей в некоторых служебных таблицах. Если в базе ранее настраивался распределенный обмен (РИБ) или участвовали планы обмена, в таблицах регистрации изменений регистров сведений (они имеют технические имена вида _InfoRgChngR...) могут накапливаться дублирующиеся записи.

При разворачивании базы на MS SQL Server платформа 1С пытается воссоздать строгую клиент-серверную структуру СУБД и выполнить команду CREATE UNIQUE INDEX. SQL-сервер, обнаружив дублирующиеся ключи, справедливо отклоняет создание индекса и завершает транзакцию с ошибкой HRESULT=80040E2F (SQLSTATE 23000).

Способ 1. Очистка регистрации изменений в файловой базе (Рекомендуемый)

Рассмотрим по шагам наиболее безопасный и правильный алгоритм решения проблемы через исходную файловую базу:

  1. Откроем исходную файловую базу в режиме «1С:Предприятие».
  2. Откроем обработку «Регистрация изменений для обмена данными».
  3. Снимем (удалим) регистрацию изменений по всем объектам для всех имеющихся узлов планов обмена. Если планов обмена было несколько и они больше не используются, полностью удалим неиспользуемые узлы обмена.
  4. Запустим Конфигуратор файловой базы и перейдем в меню Администрирование — Тестирование и исправление...
  5. Отметим флажками пункты «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы», после чего выполним тестирование.
  6. Сформируем новый файл выгрузки .dt (через меню Администрирование — Выгрузить информационную базу...).
  7. Загрузим полученный файл в чистую базу на MS SQL Server. Загрузка пройдет без ошибок.

Способ 2. Очистка служебной таблицы на стороне MS SQL Server

Если доступ к исходной файловой базе ограничен или сбой произошел снова, удаление неисправных остаточных данных обмена можно выполнить непосредственно в MS SQL Server.

Выясним имя сбойной таблицы из текста ошибки. Например, в тексте ошибки указано имя объекта: dbo._InfoRgChngR7698.

Выполним следующий порядок действий:

  1. Откроем MS SQL Server Management Studio и подключимся к серверу баз данных.
  2. Выберем созданную базу данных и откроем окно выполнения SQL-запроса.
  3. Полностью очистим сбойную таблицу регистрации изменений с помощью команды: TRUNCATE TABLE dbo._InfoRgChngR7698;
  4. Запустим Конфигуратор 1С клиент-серверной базы и выполним Тестирование и исправление с включенным пунктом «Реиндексация таблиц информационной базы». Платформа самостоятельно и корректно пересоздаст отсутствующие индексы.

Дополнительные замечания по настройкам СУБД

Обратим внимание, что изменение параметра Уровень совместимости (Compatibility Level) в настройках базы на MS SQL Server (например, смена значения 120 для SQL Server 2014 на более низкое) не решит данную проблему. Сервер СУБД в любом случае заблокирует создание уникального индекса при наличии физических дубликатов ключей.

← На главную