Как исправить ошибку SDBL "Ссылка на таблицу недопустима. Нет таблицы или отсутствует RefSelf" при удалении объекта

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

При активной разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда созданный ранее объект метаданных (справочник, документ или перечисление) становится ненужным. Казалось бы, процедура проста: удалить объект из дерева конфигурации и обновить конфигурацию базы данных (F7). Однако в ряде случаев этот процесс прерывается критической ошибкой SDBL: Ссылка на таблицу ReferenceX недопустима. Нет таблицы или отсутствует RefSelf.

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

Выясним причину возникновения ошибки SDBL

Для начала проанализируем, что скрывается за аббревиатурой SDBL (Simple Data Bank Language). Это внутренний язык запросов платформы 1С, который служит прослойкой между логикой метаданных и физическими таблицами СУБД (MS SQL Server, PostgreSQL или файловая база 1CD). Ошибка RefSelf сигнализирует о том, что механизм обновления конфигурации обнаружил рассинхронизацию.

Поле RefSelf — это системный идентификатор ссылки объекта на самого себя, который должен присутствовать в любой таблице ссылочного типа. Если в процессе трансформации структуры базы данных 1С пытается обратиться к таблице удаляемого справочника, но не находит в ней обязательных системных полей или саму таблицу в системном описании DBSchema, транзакция откатывается. Это часто происходит из-за накопившихся ошибок в кэше или незавершенных предыдущих реструктуризаций (например, при использовании "динамического обновления").

Решение 1: Реструктуризация таблиц через Тестирование и Исправление

Как показывает практика, наиболее эффективным и быстрым способом решения данной проблемы является запуск штатного механизма проверки целостности базы данных. Разберем по шагам, как правильно выполнить эту процедуру:

  1. Обязательно создадим резервную копию базы данных (выгрузка .dt или копирование файла .1CD). Любые манипуляции со структурой таблиц могут привести к необратимой потере данных при сбое питания или платформы.
  2. Зайдем в режим "Конфигуратор" и перейдем в меню Администрирование — Тестирование и исправление....
  3. В открывшемся окне установим переключатель в положение "Тестирование и исправление".
  4. Среди списка проверок выберем только один пункт: Реструктуризация таблиц информационной базы. Остальные галочки (проверка логической целостности, ссылочной целостности и т.д.) в данном контексте не обязательны и лишь увеличат время выполнения процесса.
  5. Нажмем кнопку "Выполнить" и дождемся завершения процесса.

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

Решение 2: Использование механизма распределенных баз (РИБ)

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

  1. Создадим в основной базе подчиненный узел по любому полному плану обмена.
  2. Выгрузим начальный образ для этого узла. При создании образа система принудительно пересоберет всю структуру таблиц "с нуля".
  3. Зайдем в созданную базу (начальный образ) в режиме Конфигуратора.
  4. Отвяжем базу от главного узла, выполнив в консоли или через обработку команду: ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
  5. Попробуем удалить проблемный справочник и обновить конфигурацию БД. В новом образе, как правило, такие ошибки исчезают.

Решение 3: Очистка серверного и локального кэша

Иногда ошибка SDBL является ложной и вызвана тем, что платформа пытается использовать старое описание структуры таблиц из локального кэша. Проанализируем ситуацию: если на одном компьютере ошибка воспроизводится, а на другом (с той же базой) — нет, значит, проблема в кэше.

Для исправления выполним следующие действия:

Проблема "Table and field Description not contained in FROM"

Рассмотрим ситуацию, когда после успешного удаления справочника и обновления конфигурации в режиме "Предприятие" начинает возникать новая ошибка при открытии форм документов: Table and field Description not contained in FROM.

Эта ошибка означает, что в конфигурации остались "битые ссылки" на удаленный объект. Выясним, где они могут прятаться:

Проанализируем пример кода, который может вызывать подобное поведение после удаления справочника НовыйСправочник:


// Ошибка возникнет здесь, если тип реквизита "Спецификация" 
// ранее был "СправочникСсылка.НовыйСправочник"
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Продажи.Номенклатура,
    |   Продажи.Спецификация.Наименование КАК ОписаниеСпец
    |ИЗ
    |   РегистрНакопления.Продажи КАК Продажи";

В данном случае, после удаления справочника, обращение через точку Продажи.Спецификация.Наименование станет невалидным, так как поле Description (Наименование) больше не существует в контексте этого реквизита.

Выводы и рекомендации

Подводя итог, можно сказать, что ошибка SDBL при удалении объектов — это чаще всего следствие технического сбоя в структуре DBSchema. Основным инструментом лечения остается реструктуризация. Чтобы минимизировать риск возникновения таких проблем в будущем, старайтесь избегать "динамических обновлений" (обновлений "на лету") при изменении структуры метаданных и всегда делайте контрольное тестирование базы после крупных удалений.

← На главную