Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

MSSQL Error 1505: Duplicate key found for unique index — Исправление дублей

Обновлено: 25.08.2026  ·  Официальная база знаний

Ошибка 1505 возникает при попытке создания уникального индекса (Unique Index) или ограничения первичного ключа (Primary Key) на таблице, которая уже содержит неуникальные (дублирующиеся) значения в ключевых колонках.

  • Сообщение: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name '%.*ls' and index name '%.*ls'. The duplicate key value is %ls (Severity 16).
  • Сбой обновления конфигурации 1С:Предприятие на этапе 'Реструктуризация таблиц информационной базы'.
  • Отказ выполнения скриптов миграции данных или перестроения индексов СУБД.
  • Нарушение ссылочной целостности в регистрах сведений или табличных частях.

1. Поиск дублирующихся строк по значению ключа

Используйте имя таблицы и поля из текста ошибки:

SELECT 
    KeyColumn1, 
    KeyColumn2, 
    COUNT(*) AS DuplicateCount
FROM [SchemaName].[TableName]
GROUP BY KeyColumn1, KeyColumn2
HAVING COUNT(*) > 1
ORDER BY DuplicateCount DESC;

2. Просмотр полных записей-дубликатов с использованием ROW_NUMBER()

WITH CTE_Duplicates AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY KeyColumn1, KeyColumn2 
            ORDER BY (SELECT NULL)
        ) AS RowNum
    FROM [SchemaName].[TableName]
)
SELECT * FROM CTE_Duplicates WHERE RowNum > 1;

3. Безопасное удаление избыточных дубликатов

WITH CTE_Duplicates AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY KeyColumn1, KeyColumn2 
            ORDER BY (SELECT NULL)
        ) AS RowNum
    FROM [SchemaName].[TableName]
)
DELETE FROM CTE_Duplicates WHERE RowNum > 1;

4. Повторное создание уникального индекса

CREATE UNIQUE INDEX [IndexName] 
ON [SchemaName].[TableName] (KeyColumn1, KeyColumn2) 
WITH (ONLINE = ON, DATA_COMPRESSION = PAGE);

5. Исправление в среде 1С:Предприятие

Если сбой произошел при реструктуризации непериодического регистра сведений, найдите неуникальные наборы измерений через внешнюю обработку или запустите Тестирование и исправление с опцией Проверка логической целостности.

Практический опыт инженера: Перед ручным удалением дубликатов из таблиц СУБД 1С обязательно создайте резервную копию таблицы через SELECT * INTO TableName_Backup FROM TableName, чтобы не нарушить ссылочную целостность платформы.

Частые вопросы (FAQ)

Почему дубликаты появляются в регистрах сведений 1С?

Дубли возникают при прямых некорректных записях в СУБД в обход объектной модели 1С, сбоях обменов РИБ или некорректном переносе данных при объединении баз.

Что делает опция WITH IGNORE_DUP_KEY при создании индекса?

Опция IGNORE_DUP_KEY разрешает вставку уникальных строк пакета, игнорируя строки с дублями ключа с выдачей предупреждения вместо отката всей транзакции. Однако для 1С этот режим не поддерживается.

Как найти GUID ссылки документа, вызвавшего дублирование?

Сконвертируйте бинарное поле _IDRRef в строковый UUID с помощью системных функций T-SQL или платформенной функции 1С 'Строка(Ссылка.УникальныйИдентификатор())'.

Можно ли выполнить реструктуризацию без потери строк дублей?

Нет. Уникальный индекс жестко требует единственности каждой комбинации ключевых полей. Избыточные записи должны быть удалены или объединены.