Как исправить ошибку SDBL и уникального индекса при удалении расширения в 1С:Предприятии?

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

Механизм расширений в платформе «1С:Предприятие 8.3» — это мощный инструмент, позволяющий кастомизировать типовые конфигурации без снятия их с поддержки. Однако при работе с расширениями на относительно старых версиях платформы (особенно веток 8.3.11 и 8.3.12) разработчики часто сталкиваются с критическими ошибками СУБД. Самые опасные из них возникают при попытке добавить новые объекты данных (справочники, документы) через расширение, изменить режим совместимости, а затем удалить это расширение или обновить конфигурацию.

В этой статье мы подробно разберем природу этих ошибок, выясним причины их возникновения и рассмотрим несколько надежных способов решения — от простого обхода через файловый режим до низкоуровневой работы с таблицами на SQL-сервере.

Симптомы и анализ причин возникновения ошибок

Обычно проблема заявляет о себе при попытке обновить конфигурацию базы данных или удалить расширение. Процесс прерывается одной из следующих ошибок:

  1. Ошибка SDBL: Некорректное использование LOCAL/GLOBAL в SET GENERATION.

    SDBL (Simple Database Layer) — это внутренний уровень абстракции платформы 1С, транслирующий запросы метаданных в SQL-команды. Данный сбой является известным багом платформы в механизме реструктуризации. При удалении расширения, содержащего физические таблицы (свои справочники или документы), платформа некорректно формирует инструкции для работы с временными таблицами реструктуризации, что приводит к аварийному завершению операции СУБД.

  2. Попытка вставки неуникального значения в уникальный индекс.

    Часто при попытке удалять объекты из расширения «по одному» в СУБД возникает конфликт уникальности индексов. Типичный текст ошибки выглядит так:

    Microsoft SQL Server Native Client 11.0: Не удается вставить повторяющуюся строку ключа в объект "dbo._Reference470" с уникальным индексом "_Reference470_S_HPK". Повторяющееся значение ключа: (0, 0x068a00215ef0fe1611e1beb6fd1527c2).

    Проанализируем эту ошибку:

    • Имя таблицы dbo._Reference470 указывает на конкретный справочник в базе данных (префикс _Reference всегда соответствует справочникам).
    • Индекс _S_HPK расшифровывается как System Hierarchy Parent Key (системный ключ родителя иерархии). Этот уникальный индекс СУБД создает автоматически для иерархических справочников. Он состоит из признака папки, идентификатора родительского элемента и GUID самого элемента.
    • При частичном удалении объектов метаданных из расширения нарушается транзакционная целостность. В СУБД остаются «осиротевшие» записи в теневых таблицах расширения (имеющих суффиксы вроде X1), которые при попытке реструктуризации пытаются объединиться с основными таблицами, вызывая дублирование уникальных ключей.

Ниже мы рассмотрим три практических метода преодоления этой критической ситуации.

Способ 1: Обход проблемы через файловый режим (рекомендуемый для баз небольшого объема)

Файловая СУБД 1С (движок базы данных .1CD) устроена менее строго по сравнению с MS SQL Server в части контроля транзакционной целостности промежуточных индексов во время реструктуризации. Она позволяет безболезненно провести те операции удаления расширения, на которых SQL-сервер спотыкается.

Разберем этот процесс по шагам:

  1. Создание резервной копии. Перед любыми манипуляциями обязательно создаем полную резервную копию базы данных средствами СУБД или выгрузкой в .dt.
  2. Выгрузка базы данных. В Конфигураторе рабочей SQL-базы переходим в меню Администрирование — Выгрузить информационную базу... и сохраняем файл .dt.
  3. Создание файловой базы. Запускаем стартер 1С, нажимаем кнопку «Добавить», выбираем создание новой информационной базы без конфигурации (пустой) в файловом режиме в любой удобной локальной папке.
  4. Загрузка данных. Открываем созданную файловую базу в режиме Конфигуратора. Переходим в меню Администрирование — Загрузить информационную базу... и выбираем наш файл .dt.
  5. Удаление расширения. Открываем список расширений (Конфигурация — Расширения конфигурации). Выделяем проблемное расширение и полностью удаляем его. Нажимаем клавишу F7 (или кнопку «Обновить конфигурацию базы данных»). Файловая база должна успешно применить изменения и очистить структуру таблиц.
  6. Тестирование и исправление. Чтобы убедиться, что в базе не осталось поврежденных ссылок и логических дублей, обязательно запускаем процедуру ТиИ. Переходим в Администрирование — Тестирование и исправление.... Устанавливаем флажки:
    • Реиндексация таблиц информационной базы
    • Проверка логической целостности
    • Проверка ссылочной целостности
    Нажимаем «Выполнить».
  7. Обратная загрузка в SQL. После успешного завершения ТиИ выгружаем файловую базу обратно в файл .dt. В Конфигураторе вашей рабочей SQL-базы загружаем этот файл. База данных успешно обновится на SQL-сервере без старых расширений и ошибок индексов.

Способ 2: Решение проблемы напрямую в SQL Server (для баз большого объема)

Если база данных имеет объем в сотни гигабайт, перенос ее в файловый вариант и обратно через .dt невозможен из-за ограничений файлового формата (размер одной таблицы не может превышать 4 ГБ) и огромных временных затрат. В этом случае мы должны решить проблему непосредственно на сервере СУБД с помощью SQL Server Management Studio (SSMS).

Проанализируем и выполним следующие шаги:

Шаг 1. Поиск дублирующихся записей. Нам необходимо выявить строки, которые вызывают сбой уникального индекса. Для этого выполним SQL-запрос к проблемной таблице (имя таблицы берем из текста вашей ошибки, например, _Reference470):


SELECT _Folder, _ParentIDRRef, _IDRRef, COUNT(*)
FROM dbo._Reference470
GROUP BY _Folder, _ParentIDRRef, _IDRRef
HAVING COUNT(*) > 1;

Этот запрос вернет строки, у которых комбинация полей иерархии дублируется. Запомните GUID проблемной записи из колонки _IDRRef.

Шаг 2. Удаление дубликатов. Чтобы безопасно удалить только одну из дублирующихся строк (оставив оригинал), применим обобщенное табличное выражение (CTE) с функцией ROW_NUMBER():


WITH CTE_Duplicates AS (
    SELECT _Folder, _ParentIDRRef, _IDRRef,
           ROW_NUMBER() OVER (PARTITION BY _Folder, _ParentIDRRef, _IDRRef ORDER BY _IDRRef) as RowNum
    FROM dbo._Reference470
)
DELETE FROM CTE_Duplicates WHERE RowNum > 1;

Шаг 3. Временное удаление конфликтующего индекса. Если платформа 1С все равно отказывается обновлять конфигурацию из-за ошибок индексации на этапе реструктуризации, мы можем временно удалить уникальный индекс непосредственно в СУБД:


ALTER TABLE dbo._Reference470 DROP CONSTRAINT _Reference470_S_HPK;
-- Если индекс был создан как обычный некластеризованный:
-- DROP INDEX _Reference470_S_HPK ON dbo._Reference470;

Шаг 4. Обновление в Конфигураторе. Сразу после удаления индекса в СУБД переходим в Конфигуратор 1С и запускаем обновление конфигурации базы данных (клавиша F7). Платформа успешно завершит реструктуризацию, так как СУБД больше не блокирует запись из-за проверок уникальности.

Шаг 5. Восстановление индекса. Чтобы вернуть базу данных в штатное состояние и воссоздать индекс, запускаем Конфигуратор, переходим в Тестирование и исправление..., выбираем только пункт «Реиндексация таблиц» и запускаем выполнение. Платформа 1С автоматически пересоздаст удаленный SQL-индекс в правильном и чистом виде.

Способ 3: Очистка таблиц регистрации изменений метаданных

Иногда критический сбой реструктуризации SDBL вызывают зависшие транзакции регистрации изменений конфигурации. Для очистки этих данных выполним следующие действия в SSMS:

  1. Найдем служебные таблицы регистрации изменений метаданных: dbo._ConfigChngR и dbo._ConfigChngR_Hex.
  2. Очистим их содержимое с помощью инструкций:
    
    TRUNCATE TABLE dbo._ConfigChngR;
    TRUNCATE TABLE dbo._ConfigChngR_Hex;
    
  3. Также найдем в списке таблиц СУБД таблицы с суффиксами расширений, относящиеся к проблемному справочнику (например, dbo._Reference470X1), и принудительно удалим их (инструкция DROP TABLE), предварительно убедившись, что данные из расширения нам больше не нужны.

Важные рекомендации по работе с расширениями

Чтобы в будущем не столкнуться с подобными критическими сбоями реструктуризации, рекомендуем придерживаться следующих правил:

← На главную