При переносе информационной базы из файлового формата (.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).
Рассмотрим по шагам наиболее безопасный и правильный алгоритм решения проблемы через исходную файловую базу:
.dt (через меню Администрирование — Выгрузить информационную базу...).Если доступ к исходной файловой базе ограничен или сбой произошел снова, удаление неисправных остаточных данных обмена можно выполнить непосредственно в MS SQL Server.
Выясним имя сбойной таблицы из текста ошибки. Например, в тексте ошибки указано имя объекта: dbo._InfoRgChngR7698.
Выполним следующий порядок действий:
TRUNCATE TABLE dbo._InfoRgChngR7698;
Обратим внимание, что изменение параметра Уровень совместимости (Compatibility Level) в настройках базы на MS SQL Server (например, смена значения 120 для SQL Server 2014 на более низкое) не решит данную проблему. Сервер СУБД в любом случае заблокирует создание уникального индекса при наличии физических дубликатов ключей.