Как исправить ошибку неуникального значения в уникальный индекс при загрузке базы 1С в SQL?

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

При переносе информационной базы 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 не решают проблему, так как они проверяют прикладные объекты базы, но не выполняют очистку или реструктуризацию служебных регистрационных записей планов обмена.

Способ 1. Очистка регистрации изменений через штатную обработку

Самый простой и безопасный способ решения проблемы — удалить накопившуюся регистрацию изменений в файловой базе перед формированием файла выгрузки .dt.

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

Способ 2. Программное удаление регистрации изменений

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

Используем метод платформы ПланыОбмена.УдалитьРегистрациюИзменений(), который позволяет точечно или полностью снять с регистрации объект метаданных для конкретных узлов.

Рассмотрим пример кода для удаления регистрации изменений документа:


// Определяем метаданные сбойного объекта
МетаданныеОбъекта = Метаданные.Документы.ПоступлениеТоваровУслуг;

// Проходим по всем планам обмена конфигурации
Для Каждого ПланОбменаИзМетаданных Из Метаданные.ПланыОбмена Цикл
    ВыборкаУзлов = ПланыОбмена[ПланОбменаИзМетаданных.Имя].Выбрать();
    Пока ВыборкаУзлов.Следующий() Цикл
        // Удаляем регистрацию изменений для конкретного узла и объекта
        ПланыОбмена.УдалитьРегистрациюИзменений(ВыборкаУзлов.Ссылка, МетаданныеОбъекта);
    КонецЦикла;
КонецЦикла;

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

Способ 3. Перенос данных с помощью универсального обмена XML

Если очистка регистрации изменений нецелесообразна или требуется перенести только прикладные данные без служебных таблиц обмена, рассмотрим вариант переноса через XML.

  1. Создадим на сервере MS SQL Server новую пустую информационную базу и привяжем к ней чистую конфигурацию той же версии и релиза.
  2. В файловой базе запустим обработку «Выгрузка и загрузка данных XML».
  3. Выгрузим все прикладные объекты (справочники, документы, регистры) в XML-файл. Настройки планов обмена и служебные таблицы регистрации при таком способе выгружаться не будут.
  4. Откроем созданную пустую базу на SQL Server и выполним загрузку данных из полученного XML-файла.

Чего делать не рекомендуется

Ни в коем случае не следует удалять саму таблицу физически из файла .1cd с помощью сторонних редакторов низкого уровня (например, утилит редактирования структуры базы). Физическое удаление таблицы приводит к нарушению логической целостности метаданных платформы 1С, из-за чего при последующей попытке выгрузки или работы программа будет аварийно завершать работу.

← На главную