При формировании начального образа распределенной информационной базы (РИБ) разработчики и администраторы нередко сталкиваются с критической ошибкой платформы: «Попытка вставки не уникального в уникальный индекс», после чего указывается имя таблицы СУБД вида dbo._infoRg25364. При этом попытка найти указанную таблицу в рабочей базе часто заходит в тупик — там таблиц с таким номером попросту нет. Разберем детально, почему возникает эта ошибка, как быстро вычислить виновника среди метаданных и какими способами можно успешно развернуть периферийный узел.
Префикс _infoRg указывает на то, что сбой произошел при заполнении таблицы независимого регистра сведений. Числовой суффикс (в нашем примере 25364) формируется платформой 1С динамически в момент физического создания таблицы в базе данных СУБД. В исходной рабочей базе конфигурация пережила множество обновлений, добавления и удаления реквизитов, поэтому внутренние номера таблиц там совершенно другие. Когда вызывается метод создания начального образа, платформа создает новую чистую базу SQL «с нуля», разворачивает в ней структуру таблиц по порядку следования метаданных и начинает потоковую перегрузку записей. Именно поэтому идентификаторы таблиц в базе-источнике и базе-приемнике не совпадают.
Чтобы исправить ошибку, сначала необходимо точно выяснить, какому именно объекту конфигурации соответствует сбойная таблица _infoRg25364. Рассмотрим наиболее эффективные пути поиска:
dbo._infoRg25364. По именам полей (например, _Period, _RecorderRRef, а также суффиксам типов данных в полях _Fld...) и их типам данных легко сопоставить таблицу с конкретным регистром сведений в дереве метаданных конфигуратора..cf) рабочей базы на том же сервере СУБД. Порядок создания таблиц платформой будет аналогичен созданию образа. В этой пустой базе выполним программный код для получения карты соответствия:
Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из Структура Цикл
Если Стр.ИмяТаблицыХранения = "_INFORG25364" Тогда
Сообщить("Проблемный объект: " + Стр.Имя);
КонецЕсли;
КонецЦикла;
2601 или 2627 (сообщение вида The duplicate key value is (...)). В теле этой ошибки SQL Server указывает конкретные значения полей, нарушивших уникальность (дату, строку или шестнадцатеричный GUID ссылки). По этим значениям через глобальный поиск или консоль запросов в базе-источнике можно мгновенно локализовать сбойную запись.Казалось бы, если регистр сведений в рабочей базе независимый, платформа не должна была позволить записать неуникальный набор измерений. Почему же тогда падает создание образа? Проанализируем типичные причины:
"Товар" и "Товар ", платформа 1С в режиме 1С:Предприятие могла считать их разными, но для уникального индекса SQL Server они являются полными дубликатами. При пакетной вставке в новую базу сервер СУБД блокирует операцию.Для поиска дубликатов в выявленном регистре выполним в рабочей базе запрос по группировке всех измерений:
ВЫБРАТЬ
Номенклатура,
Характеристика,
Склад,
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ЦеныНоменклатуры
СГРУППИРОВАТЬ ПО
Номенклатура,
Характеристика,
Склад
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Для выявления скрытых дублей по строковым полям обязательно дополним проверку вызовом функций обрезки пробелов или сравнением длины строки.
После нахождения некорректных строк удалим дублирующие записи стандартным набором записей с отбором по измерениям. Чтобы исключить физические ошибки структуры базы, запустим процедуру «Тестирование и исправление информационной базы», обязательно выбрав пункт «Реструктуризация таблиц информационной базы» (простая «Реиндексация» логические нарушения структуры не устраняет).
Если база имеет внушительный объем, а штатный механизм СоздатьНачальныйОбраз() продолжает падать по таймауту или нехватке памяти, применим проверенные обходные решения.
Вариант А: Исключение регистров сведений на этапе генерации образа. В плане обмена временно исключим из состава проблемный регистр сведений (или все тяжелые регистры). Успешно сформируем начальный образ без них — это гарантирует корректный перенос метаданных и, что критически важно, связей предопределенных элементов конфигурации (иначе при развертывании из .cf первый же обмен породит дубли предопределенных элементов). После развертывания периферийной базы вернем регистры в состав плана обмена и передадим данные порциями через штатные сообщения обмена.
Вариант Б: Развертывание узла напрямую из копии рабочей базы (Backup/Restore). Это самый надежный способ для высоконагруженных баз:
ГлавныйУзел = ПланыОбмена.Филиалы.НайтиПоКоду("ЦБ");
ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);
НомерПринятого = 0 и НомерОтправленного = 0.Такой подход полностью обходит этап выгрузки начального образа платформой и избавляет от ошибок валидации уникальных индексов во время создания узла.