В процессе обновления конфигурации «1С:Предприятие» технические специалисты часто сталкиваются с терминирующей ошибкой «Записи регистра стали неуникальными». Эта ситуация блокирует процесс реструктуризации базы данных и не позволяет завершить обновление. Проблема осложняется тем, что обычные запросы внутри 1С могут не показывать наличие дублей, так как на логическом уровне данные выглядят корректно, а конфликт возникает на физическом уровне СУБД при попытке создания уникального индекса.
В этой статье мы подробно проанализируем причины возникновения данной ошибки и рассмотрим пошаговые методики её устранения: от «мягкой» очистки данных до манипуляций на уровне таблиц SQL.
Прежде чем приступать к активным действиям, нам необходимо понять, почему платформа считает записи неуникальными, если визуальный контроль и простые запросы говорят об обратном. Рассмотрим основные факторы:
NULL. Однако при сбоях или некорректных прямых записях в СУБД такие значения могут появиться. SQL-сервер при создании уникального индекса может по-разному обрабатывать несколько строк с NULL, что приводит к конфликту.Проанализируем самый надежный способ, который подходит для регистров разумного объема (до нескольких сотен тысяч записей). Суть метода заключается в выносе данных «наружу», обновлении структуры и возврате данных обратно. Если проблема вызвана удаленными документами, можно использовать специализированное исправление ошибки «Записи регистра сведений стали неуникальными», которое автоматически удаляет проблемные строки.
Разберем классический процесс по шагам:
НаборЗаписей = РегистрыСведений.ИмяВашегоРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // Запись пустого набора удаляет все данные
Если регистр содержит миллионы записей, выгрузка в XML может занять часы. В таком случае рассмотрим более радикальный, но быстрый метод — переименование таблицы в базе данных. Здесь полезно уметь анализировать SQL сервер глазами 1С-ника, чтобы понимать текущую нагрузку и блокировки.
Важно: Все действия на уровне СУБД должны выполняться только после создания резервной копии базы данных!
Проанализируем алгоритм действий:
ПолучитьСтруктуруХраненияБазыДанных или используя удобную обработку Структура хранения базы данных)._InfoRg123 в _InfoRg123_backup).INSERT INTO ... SELECT, попутно отсеивая дубли.Иногда проблема кроется не в самих данных, а в повреждении индексных файлов. Посмотрим, как это можно исправить:
chdbfl.exe (находится в папке bin установленной платформы). Она проверяет физическую целостность файла .1CD и исправляет ошибки в индексах.Если вы хотите локализовать проблему, проанализируем ситуацию с помощью запроса. Альтернативой ручному написанию кода является готовая проверка дублей в регистрах сведений, которая сразу покажет, какие данные необходимо исправить. Чтобы найти записи, которые 1С считает одинаковыми самостоятельно, используйте группировку по всем измерениям регистра и условие КОЛИЧЕСТВО(*) > 1.
Пример текста запроса для консоли:
ВЫБРАТЬ
Регистр.Измерение1,
Регистр.Измерение2,
КОЛИЧЕСТВО(*) КАК КоличествоДублей
ИЗ
РегистрСведений.ИмяВашегоРегистра КАК Регистр
СГРУППИРОВАТЬ ПО
Регистр.Измерение1,
Регистр.Измерение2
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Если этот запрос ничего не возвращает, значит проблема в типах данных или невидимых символах. В таком случае рекомендуется использовать внешние инструменты диагностики, такие как «Инструменты разработчика», которые позволяют проверить базу данных на наличие NULL или некорректных типов в полях, не предназначенных для этого.
Подводя итог, скажем: наиболее безопасным и эффективным методом остается временная очистка регистра через выгрузку/загрузку. Это гарантирует, что структура БД будет обновлена правильно, а все проблемные записи будут выявлены в процессе импорта.