При переносе информационной базы 1С из файлового режима (файла формата .1cd) на клиент-серверную платформу под управлением MS SQL Server с использованием файла выгрузки .dt часто возникает критическая ошибка. В процессе загрузки платформа выдает сообщение: «Ошибка загрузки информационной базы. Попытка вставки неуникального значения в уникальный индекс» с указанием конкретной таблицы, например dbo._DocumentChngR... или аналогичной, и индекса _ByNodeMsg_RNR.
Проанализируем причины возникновения данной проблемы и разберем по шагам проверенные способы ее устранения.
Рассмотрим, почему ситуация возникает именно при переходе на SQL Server, хотя в файловом режиме база работает корректно и проходит проверки физической целостности.
Имя таблицы с префиксом _DocumentChng (или _...Chng) указывает на то, что это служебная таблица регистрации изменений для планов обмена (например, при использовании распределенных информационных баз или обменов с другими конфигурациями). Символы Chng расшифровываются как Change (изменения).
В файловой базе данных 1С обработка значений NULL и проверка уникальности записей в таблицах регистрации изменений устроена менее строго, чем в СУБД MS SQL Server. Если из-за сбоя связи, некорректного завершения сеанса или ошибки обмена в таблицу изменений попали дублирующие записи (с одинаковой комбинацией узла обмена, номера сообщения и ссылки на документ), файловый движок продолжает с ними работать. Однако при загрузке .dt-файла на SQL Server выполняется команда CREATE UNIQUE INDEX. SQL Server видит дубли ключевых значений и прерывает операцию с ошибкой HRESULT=80040E2F.
Стандартная процедура «Тестирование и исправление» (ТИИ) и утилита chdbfl.exe не решают проблему, так как они проверяют прикладные объекты базы, но не выполняют очистку или реструктуризацию служебных регистрационных записей планов обмена.
Самый простой и безопасный способ решения проблемы — удалить накопившуюся регистрацию изменений в файловой базе перед формированием файла выгрузки .dt.
ПоступлениеТоваровУслуг)..dt и повторим попытку загрузки в MS SQL Server.Если нет возможности использовать внешнюю обработку, проанализируем программный метод очистки служебных записей. Для этого напишем небольшой фрагмент кода во внешней обработке или в обработчике внешнего файла.
Используем метод платформы ПланыОбмена.УдалитьРегистрациюИзменений(), который позволяет точечно или полностью снять с регистрации объект метаданных для конкретных узлов.
Рассмотрим пример кода для удаления регистрации изменений документа:
// Определяем метаданные сбойного объекта
МетаданныеОбъекта = Метаданные.Документы.ПоступлениеТоваровУслуг;
// Проходим по всем планам обмена конфигурации
Для Каждого ПланОбменаИзМетаданных Из Метаданные.ПланыОбмена Цикл
ВыборкаУзлов = ПланыОбмена[ПланОбменаИзМетаданных.Имя].Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
// Удаляем регистрацию изменений для конкретного узла и объекта
ПланыОбмена.УдалитьРегистрациюИзменений(ВыборкаУзлов.Ссылка, МетаданныеОбъекта);
КонецЦикла;
КонецЦикла;
После выполнения данного кода служебная таблица _DocumentChng... очистится от накопленных записей, что позволит беспрепятственно загрузить базу в СУБД MS SQL Server.
Если очистка регистрации изменений нецелесообразна или требуется перенести только прикладные данные без служебных таблиц обмена, рассмотрим вариант переноса через XML.
Ни в коем случае не следует удалять саму таблицу физически из файла .1cd с помощью сторонних редакторов низкого уровня (например, утилит редактирования структуры базы). Физическое удаление таблицы приводит к нарушению логической целостности метаданных платформы 1С, из-за чего при последующей попытке выгрузки или работы программа будет аварийно завершать работу.