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

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

При обновлении конфигурации базы данных или реструктуризации таблиц разработчики и администраторы иногда сталкиваются с критической ошибкой Microsoft SQL Server: «Не удается вставить повторяющуюся строку ключа в объект "dbo._InfoRgSL...NG" с уникальным индексом... Повторяющееся значение ключа: ()». При этом поиск объекта с указанным номером через стандартные средства и функцию ПолучитьСтруктуруХраненияБазыДанных() часто не дает результатов. Разберем по шагам, почему возникает эта ошибка, как точно определить проблемный регистр сведений и устранить сбой.

Анатомия ошибки: что означают суффиксы и почему объекта нет в структуре

Для понимания сути сбоя проанализируем наименование проблемной таблицы СУБД:

  1. Префикс _InfoRgSL: указывает на внутреннюю таблицу итогов «Срез последних» (Slice Last) периодического регистра сведений. Данная таблица создается только тогда, когда для регистра включено свойство «Разрешить итоги: Срез последних».
  2. Суффикс NG (New Generation): свидетельствует о том, что платформа выполняет реструктуризацию таблицы. Создается новая временная таблица с новой структурой колонок и индексов, в которую переносятся существующие данные. После успешной вставки старая таблица удаляется, а временная переименовывается в рабочую.
  3. Номер таблицы (например, 10166): номер объекта присваивается во временных метаданных обновляемой конфигурации (ConfigSave). Функция ПолучитьСтруктуруХраненияБазыДанных() в пользовательском режиме считывает только текущую рабочую конфигурацию (Config), поэтому в работающей базе найти данный номер невозможно.
  4. Пустой ключ (): означает, что при группировке данных и заполнении среза последних несколько записей схлопнулись в одинаковый набор пустых или дефолтных значений измерений. Такое происходит при рассинхронизации идентификаторов метаданных, некорректном сопоставлении реквизитов или повреждении исходных таблиц итогов.

Способ 1. Определение проблемного регистра сведений с помощью трассировки SQL

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

  1. Запустим инструмент SQL Server Profiler или сессию Extended Events на сервере СУБД перед запуском процесса обновления в конфигураторе.
  2. Запустим обновление конфигурации базы данных и дождемся воспроизведения ошибки.
  3. В перехваченном пакете команд найдем SQL-инструкцию вставки данных во временную таблицу. Она выглядит следующим образом:

INSERT INTO dbo._InfoRgSL10166NG (...)
SELECT ...
FROM dbo._InfoRg12345

Таблица-источник (в примере — dbo._InfoRg12345) является реальной физической таблицей регистра сведений в текущей базе данных. Зная номер 12345, найдем имя объекта в 1С с помощью встроенного языка:


Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из Структура Цикл
    Если Стр.ИмяТаблицыХранения = "_InfoRg12345" Тогда
        Сообщить("Проблемный регистр: " + Стр.ИмяМетаданных);
    КонецЕсли;
КонецЦикла;

Способ 2. Временное отключение таблицы среза последних

Самый быстрый и безопасный способ применить обновление, если ошибка вызвана перестроением вспомогательной таблицы среза последних:

  1. Откроем конфигурацию в режиме «Конфигуратор».
  2. Найдем проблемный периодический регистр сведений, определенный на предыдущем шаге.
  3. В свойствах регистра снимем флаг «Разрешить итоги: Срез последних».
  4. Выполним обновление конфигурации базы данных (нажатием клавиши F7). Таблица _InfoRgSL будет удалена СУБД, и конфликт уникальности индекса исчезнет.
  5. После успешного обновления конфигурации снова вернем флаг «Разрешить итоги: Срез последних» и повторно применим изменения. Платформа создаст чистую таблицу среза последних и корректно заполнит её на основе основных записей регистра.

Способ 3. Пересчет итогов и тестирование информационной базы

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

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

Способ 4. Проверка сопоставления объектов и измерений

Если база данных ранее дорабатывалась, а обновление ставится из типового файла поставщика, критически важно проверить соответствие внутренних идентификаторов объектов:

  1. Выполним сравнение и объединение конфигураций (меню «Конфигурация» → «Сравнить, объединить с конфигурацией из файла»).
  2. Проверим режим сопоставления: если включено сопоставление исключительно по внутренним идентификаторам (UUID), а в базе измерение было создано вручную с тем же именем, система попытается удалить старое измерение и создать новое. При удалении измерения данные в срезе последних схлопываются в одинаковые пустые строки, вызывая дубликаты.
  3. Установим признак сопоставления по именам объектов, чтобы исключить дублирование или затирание измерений регистра.

Способ 5. Пересоздание таблиц через выгрузку и загрузку файла выгрузки (.dt)

Файл выгрузки информационной базы (.dt) содержит только основные табличные данные без физических таблиц агрегатов и срезов. Для сброса поврежденных структур среза последних выполним следующие действия:

  1. В конфигураторе исходной базы выполним выгрузку: «Администрирование» → «Выгрузить информационную базу...».
  2. Создадим новую пустую базу данных на сервере СУБД.
  3. Загрузим сохраненный файл через меню «Администрирование» → «Загрузить информационную базу...».
  4. При загрузке платформа заново сформирует все индексы и таблицы срезов с нуля, после чего процедура обновления пройдет штатно.
← На главную