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

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

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

Разберем причины возникновения этой проблемы, научимся сопоставлять системное имя таблицы в СУБД с объектом метаданных конфигурации 1С и рассмотрим пошаговый алгоритм исправления дублирующихся записей.

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

Выясним, почему база, которая успешно работала в файловом режиме, отказывается разворачиваться на сервере СУБД:

  1. Различия в обработке строк файловой СУБД и MS SQL Server: Файловая СУБД 1С и MS SQL Server по-разному работают с пробелами в конце строковых полей и регистром символов. В файловой базе строки с разным количеством концевых пробелов считаются уникальными, однако при вставке в SQL Server они нормализуются и распознаются как полные дубликаты.
  2. Повреждение индексов в файле базы: Сбои в файле .1CD могут приводить к нарушению логической целостности, из-за чего в регистр сведений записываются неуникальные комбинации измерений.
  3. Особенности формата выгрузки: Файл выгрузки .dt не гарантирует целостность на уровне СУБД. При его загрузке сервер 1С создает структуру таблиц и выполняет команду создания уникального кластерного индекса по измерениям (_ByDims), которая завершается ошибкой при первом же дубле.

Шаг 1. Определение объекта конфигурации по имени таблицы СУБД

Прежде чем исправлять данные, необходимо выяснить, какой именно регистр скрывается под системным именем таблицы (например, _InfoRg481). Префикс _InfoRg указывает на то, что проблемная таблица является регистром сведений (Information Register).

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


ТаблицаХранения = ПолучитьСтруктуруХраненияБазыДанных();
СтрокаПоиска = ТаблицаХранения.Найти("_InfoRg481", "ИмяТаблицыХранения");

Если СтрокаПоиска <> Неопределено Тогда
    Сообщить("Имя объекта метаданных: " + СтрокаПоиска.ИмяТаблицы);
    Сообщить("Метаданные: " + СтрокаПоиска.Метаданные);
Иначе
    Сообщить("Таблица с указанным именем не найдена!");
КонецЕсли;

В результате работы кода мы получим реальное имя регистра сведений в конфигураторе (например, РегистрСведений.ЦеныНоменклатуры или РегистрСведений.СоответствиеОбъектовДляОбмена).

Шаг 2. Поиск повторяющихся записей запросом

После выяснения имени регистра найдем дублирующиеся строки непосредственно в файловой базе. Для этого напишем запрос, сгруппированный по всем ключевым полям регистра (для периодических регистров добавляется поле Период, для подчиненных регистратору — Регистратор и НомерСтроки):


ВЫБРАТЬ
    Т.Номенклатура КАК Номенклатура,
    Т.ВидЦены КАК ВидЦены,
    Т.Период КАК Период,
    КОЛИЧЕСТВО(1) КАК КоличествоДублей
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК Т
СГРУППИРОВАТЬ ПО
    Т.Номенклатура,
    Т.ВидЦены,
    Т.Период
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(1) > 1

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

Шаг 3. Способы устранения дублей и исправления базы

Рассмотрим основные способы восстановления корректной структуры данных в исходной файловой базе перед повторной выгрузкой в .dt:

  1. Проверка утилитой chdbfl.exe: Запустим утилиту физической проверки целостности файла базы данных (находится в каталоге bin установленной платформы 1С), выберем файл 1Cv8.1CD и установим флаг «Исправлять обнаруженные ошибки».
  2. Тестирование и исправление (ТИИ): Откроем Конфигуратор файловой базы, перейдем в меню «Администрирование» — «Тестирование и исправление...» и обязательно отметим следующие пункты:

    - Реиндексация таблиц информационной базы;

    - Проверка логической целостности информационной базы;

    - Реструктуризация таблиц информационной базы.

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

  3. Программное удаление дубликатов: Если дубли возникли из-за концевых пробелов в строковых измерениях, необходимо программно прочитать набор записей проблемного регистра, применить функцию СокрЛП к строковым полям и перезаписать набор данных.
  4. Временное изменение структуры регистра: Если конфигурация доступна для редактирования, можно добавить в проблемный регистр временное фиктивное измерение типа Число, применить конфигурацию базы данных (что заставит платформу выполнить реструктуризацию и перестроить индекс _ByDims), затем удалить добавленное измерение и снова сохранить конфигурацию.

Шаг 4. Альтернативные варианты переноса данных

Если исправить файл .1CD не удается, перенесем данные в MS SQL без создания выгрузки через файл .dt:

  1. Перенос через обработку «Выгрузка и загрузка данных XML»: Создадим на сервере SQL пустую информационную базу с аналогичной конфигурацией (через выгрузку и загрузку файла .cf) и перенесем всю информацию с помощью типовой универсальной обработки в формате XML. При этом сбойный регистр сведений можно временно исключить из выгрузки и перенести отдельно после ручной очистки.
  2. Использование универсального обмена данными: Настроим перенос с помощью планов обмена или правил конвертации данных напрямую между файловой и серверной базами.

После устранения неуникальных записей сформируем новую выгрузку в файл .dt и выполним повторную загрузку в базу MS SQL Server. Индекс _ByDims будет создан успешно.

← На главную