При обновлении конфигурации базы данных или реструктуризации таблиц разработчики и администраторы иногда сталкиваются с критической ошибкой Microsoft SQL Server: «Не удается вставить повторяющуюся строку ключа в объект "dbo._InfoRgSL...NG" с уникальным индексом... Повторяющееся значение ключа: ()». При этом поиск объекта с указанным номером через стандартные средства и функцию ПолучитьСтруктуруХраненияБазыДанных() часто не дает результатов. Разберем по шагам, почему возникает эта ошибка, как точно определить проблемный регистр сведений и устранить сбой.
Для понимания сути сбоя проанализируем наименование проблемной таблицы СУБД:
_InfoRgSL: указывает на внутреннюю таблицу итогов «Срез последних» (Slice Last) периодического регистра сведений. Данная таблица создается только тогда, когда для регистра включено свойство «Разрешить итоги: Срез последних».NG (New Generation): свидетельствует о том, что платформа выполняет реструктуризацию таблицы. Создается новая временная таблица с новой структурой колонок и индексов, в которую переносятся существующие данные. После успешной вставки старая таблица удаляется, а временная переименовывается в рабочую.ConfigSave). Функция ПолучитьСтруктуруХраненияБазыДанных() в пользовательском режиме считывает только текущую рабочую конфигурацию (Config), поэтому в работающей базе найти данный номер невозможно.(): означает, что при группировке данных и заполнении среза последних несколько записей схлопнулись в одинаковый набор пустых или дефолтных значений измерений. Такое происходит при рассинхронизации идентификаторов метаданных, некорректном сопоставлении реквизитов или повреждении исходных таблиц итогов.Выясним точное имя исходного регистра сведений, обратившись к журналу выполнения запросов СУБД. Разберем порядок действий:
INSERT INTO dbo._InfoRgSL10166NG (...)
SELECT ...
FROM dbo._InfoRg12345
Таблица-источник (в примере — dbo._InfoRg12345) является реальной физической таблицей регистра сведений в текущей базе данных. Зная номер 12345, найдем имя объекта в 1С с помощью встроенного языка:
Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из Структура Цикл
Если Стр.ИмяТаблицыХранения = "_InfoRg12345" Тогда
Сообщить("Проблемный регистр: " + Стр.ИмяМетаданных);
КонецЕсли;
КонецЦикла;
Самый быстрый и безопасный способ применить обновление, если ошибка вызвана перестроением вспомогательной таблицы среза последних:
F7). Таблица _InfoRgSL будет удалена СУБД, и конфликт уникальности индекса исчезнет.Если в таблицах итогов возникли логические расхождения или повреждения, устраним их штатными регламентными процедурами перед накатыванием обновления:
Если база данных ранее дорабатывалась, а обновление ставится из типового файла поставщика, критически важно проверить соответствие внутренних идентификаторов объектов:
Файл выгрузки информационной базы (.dt) содержит только основные табличные данные без физических таблиц агрегатов и срезов. Для сброса поврежденных структур среза последних выполним следующие действия: