При активной разработке, обновлении или переходе на типовые конфигурации разработчики 1С часто сталкиваются с крайне неприятной проблемой — падением платформы при попытке обновить конфигурацию базы данных. Ошибка выглядит следующим образом: «Ошибка SDBL: Ссылка на таблицу Document87 (или Reference87) недопустима. Нет таблицы или отсутствует RefSelf». При этом физически таблица может присутствовать в базе данных SQL, ссылки на удаляемый объект в конфигурации вычищены, а стандартная утилита chdbfl.exe и тестирование и исправление (ТиИ) не находят видимых повреждений файла базы данных или СУБД.
Давайте подробно разберем природу этого сбоя и рассмотрим несколько проверенных практических способов его устранения: от безопасных обходных путей в самой платформе 1С до прямого вмешательства на уровне СУБД.
Служба SDBL (Simple Database Layer) — это внутренний уровень абстракции платформы «1С:Предприятие», который транслирует логические запросы платформы в физические SQL-команды для конкретной СУБД (MS SQL, PostgreSQL, IBM DB2) или в структуру файловой базы данных. Ошибка с упоминанием отсутствия RefSelf возникает в тот момент, когда в СУБД или во внутренней таблице метаданных SchemaStorage нарушается связь между логическим описанием объекта в конфигурации и его физическим представлением в базе данных.
Платформа пытается сопоставить уникальный идентификатор (UUID) удаляемого или изменяемого объекта (например, документа Document87) с метаданными СУБД. Если физическая таблица была удалена некорректно или метаданные СУБД рассинхронизировались во время незавершенного обновления, SDBL считает, что таблица повреждена или у нее отсутствует колонка первичного ключа (ссылка на саму себя — RefSelf, соответствующая полю _IDRRef).
---
Этот метод является одним из самых надежных, так как он выполняется полностью штатными средствами платформы 1С и не требует прямого редактирования таблиц SQL. Мы воспользуемся механизмом создания начального образа РИБ, в ходе которого платформа заново генерирует чистую структуру таблиц базы данных, избавляясь от мусорных связей и ошибок SDBL.
Рассмотрим по шагам данный алгоритм работы:
Процедура ОтключитьБазуОтРИБ()
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
КонецПроцедуры
---
Многие разработчики совершают ошибку, запуская стандартное «Тестирование и исправление» (ТиИ) со всеми включенными флагами. В этом случае процесс прерывается на фазе проверки логической целостности, выдавая все ту же ошибку SDBL. Нам нужно применить изолированную реструктуризацию.
Проанализируем этот процесс:
---
Если ваша база данных работает на SQL Server или PostgreSQL, ошибка SDBL часто бывает вызвана зависшими ссылками на удаляемый объект в таблицах регистрации изменений планов обмена. Платформа пытается удалить таблицу объекта, но триггеры СУБД или связанные записи в системных таблицах изменений блокируют эту операцию.
Выясним причину и исправим её на уровне СУБД:
dbo укажите вашу схему базы данных, если она отличается):
-- Очистка таблиц регистрации изменений конфигурации
TRUNCATE TABLE dbo._ConfigChngR;
TRUNCATE TABLE dbo._ConfigChngR_ExtProps;
После успешного выполнения этих запросов вернитесь в Конфигуратор 1С и повторите попытку удаления объекта и обновления конфигурации базы данных.
---
Иногда платформа 1С теряет связь между основной конфигурацией и конфигурацией базы данных из-за расхождения их внутренних идентификаторов (UUID). Мы можем восстановить эту связь вручную, перенеся UUID из конфигурации базы данных в основную конфигурацию.
Разберем этот метод по шагам:
ConfigDumpInfo.xml из Папки_2 и найдите в нем описание проблемного объекта (например, вашего удаляемого документа). Скопируйте значение его атрибута id (это и есть правильный UUID метаданных базы данных).---
Если платформа упорно жалуется на отсутствие физической таблицы Document87 (или Reference87 для справочников) и не может из-за этого завершить обновление метаданных, мы можем обмануть SDBL, принудительно создав пустую таблицу-заглушку с требуемым именем и ключевым полем _IDRRef прямо в СУБД.
Рассмотрим пример SQL-скрипта для MS SQL Server:
-- Создание пустой таблицы-заглушки с обязательным полем ссылки RefSelf
CREATE TABLE dbo._Document87 (
_IDRRef BINARY(16) NOT NULL,
_Version ROWVERSION NOT NULL,
_Marked BINARY(1) NOT NULL,
_Date_Time DATETIME NOT NULL,
_Number NVARCHAR(10) NOT NULL,
CONSTRAINT PK__Document87 PRIMARY KEY CLUSTERED (_IDRRef)
);
После создания этой таблицы запустите обновление конфигурации базы данных в Конфигураторе 1С. SDBL обнаружит таблицу, найдет в ней ожидаемое ключевое поле _IDRRef (которое отвечает за RefSelf), успешно выполнит транзакцию по очистке метаданных и сама удалит эту таблицу из базы данных стандартным путем.
---
Часто удаляемый объект уже отсутствует на форме и в реквизитах, но ссылка на него осталась в скрытых метаданных платформы:
ОпределяемыйТип);Чтобы выявить эти скрытые зависимости, запустите проверку конфигурации (меню Конфигурация — Проверить конфигурацию), обязательно установив флаг «Поиск некорректных ссылок в метаданных» (остальные флаги для скорости можно временно отключить). Если проверка обнаружит битые ссылки, откройте указанные объекты, исключите из состава типов удаляемый документ или справочник, сохраните изменения и повторите обновление базы данных.
Мы проанализировали причины возникновения ошибки SDBL и детально разобрали шесть способов ее решения. Для файловых баз наиболее простым и безопасным методом является создание РИБ-образа (Способ 1), а для клиент-серверных вариантов баз данных высокую эффективность показывают SQL-скрипты очистки кэша изменений и создание таблиц-заглушек (Способы 3 и 5).