Как исправить ошибку SDBL CAST AS REF и восстановить менеджер имен базы данных при обновлении 1С?

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

В процессе обновления информационных баз 1С (особенно таких сложных конфигураций, как 1С:Зарплата и Управление Персоналом) администраторы и разработчики иногда сталкиваются с критическими сбоями. Одним из наиболее тяжелых симптомов является сочетание ошибки SDBL CAST(0:00000000000000000000000000000000 AS REF()) несовместим с типом поля и последующего падения системы с сообщением «Запись не найдена в менеджере имен базы данных». База данных перестает запускаться в режиме Предприятия, отложенное обновление зависает или аварийно завершается, а при попытке выполнить Тестирование и исправление (ТиИ) платформа сообщает об отсутствии физических таблиц в СУБД (например, Const, ScheduledJobs, AccumRg), хотя в служебных таблицах они числятся.

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

---

Выясняем причины: почему СУБД и 1С теряют связь?

Для начала проанализируем ситуацию и поймем физику процесса. Ошибка вида CAST(0:0000... AS REF()) несовместим с типом поля... возникает из-за конфликта ссылочных кодов в СУБД. В платформе 1С каждому объекту метаданных (справочнику, документу, регистру) сопоставляется внутренний числовой идентификатор — ссылочный код. При реструктуризации базы данных платформа создает новые таблицы и назначает им эти коды.

Сбой происходит по следующему сценарию:

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

Что касается ошибки «Запись не найдена в менеджере имен базы данных» — это следствие аварийного прерывания реструктуризации. Менеджер имен (хранящийся в системной таблице СУБД params и файле метаданных DBNames) рассинхронизируется с реальным физическим набором таблиц на SQL-сервере. Платформа считает, что таблица должна быть, обращается к ней, но в SQL ее нет, либо наоборот.

---

Подготовка: создание «слепого» бэкапа

Перед тем как приступать к любым восстановительным работам, в обязательном порядке сделайте копию текущего состояния базы данных, даже если она кажется полностью «мертвой». В процессе исправления таблиц SQL штатными средствами или сторонними утилитами всегда есть риск окончательно разрушить логическую структуру данных. Сделайте копию средствами вашей СУБД (создайте резервную копию .bak в MS SQL или дамп в PostgreSQL).

---

Метод 1. Манипуляции с платформой и понижением режима совместимости

Если конфигуратор еще открывается, но база падает при обновлении или запуске Предприятия, попробуем заставить платформу принудительно перестроить схему данных через механизм изменения совместимости.

Выполним следующие шаги:

  1. Выгрузим информационную базу в файловый вариант (формат .1cd), если работа велась на SQL. На файловой базе некоторые проверки платформы отрабатывают мягче.
  2. Попробуем запустить базу на разных версиях платформы 1С. Если вы обновлялись на релизе 8.3.13, попробуйте запустить конфигуратор на более поздней стабильной версии (например, 8.3.17 или 8.3.20). Иногда обновленные алгоритмы платформы умеют обходить подобные тупики реструктуризации.
  3. В конфигураторе откроем свойства конфигурации и временно понизим режим совместимости (например, до версии 8.3.10 или ниже, в зависимости от требований конфигурации).
  4. Выполним обновление конфигурации базы данных.
  5. Запустим утилиту Тестирование и исправление со следующими настройками:
    • Включим только одну галку: Реструктуризация таблиц информационной базы.
  6. После успешного завершения реструктуризации вернем исходный режим совместимости и обновим конфигурацию базы данных еще раз.

---

Метод 2. Поиск и удаление сбойных объектов через программный код

Если тестирование и исправление прерывается ошибками отсутствия таблиц вроде ScheduledJobs32403 отсутствует в схеме базы данных, это указывает на повреждение конкретных служебных объектов (в данном случае — регламентированных заданий). Мы можем локализовать и устранить эти объекты программно.

Для того чтобы сопоставить внутренние имена SQL (например, ScheduledJobs32403) с реальными объектами метаданных 1С, используем встроенную функцию ПолучитьСтруктуруХраненияБазыДанных(). Поскольку база не запускается в обычном режиме, мы можем написать внешнюю обработку и запустить ее в режиме отладки или через запуск конфигуратора с параметрами.

Рассмотрим пример кода для поиска проблемной таблицы:


ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
    Если СтрокаТаблицы.ИмяТаблицыХранения = "ScheduledJobs32403" Тогда
        Сообщить("Проблемный объект: " + СтрокаТаблицы.ИмяТаблицы);
    КонецЕсли;
КонецЦикла;

После того как объект идентифицирован (например, конкретное регламентное задание или константа), выполним следующие действия:

  1. Если это регламентное задание — найдем его в дереве метаданных в конфигураторе и временно удалим его или отключим.
  2. Если повреждена таблица константы (например, Const32418), попробуем найти эту константу в конфигурации и временно удалить ее. При сохранении конфигурации платформа удалит упоминание о ней из менеджера имен, что позволит завершить реструктуризацию остальных таблиц.

---

Метод 3. Метод «чистой схемы» (Truncate и реструктуризация в SQL)

Это продвинутый метод, который позволяет полностью пересоздать структуру таблиц в базе СУБД, сохранив при этом конфигурацию и данные (путем их последующего переноса или очистки структуры в копии). Рассмотрим схему работы через очистку таблиц на копии базы данных в MS SQL.

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

  1. Создадим полную копию поврежденной базы данных на SQL-сервере.
  2. Подключимся к SQL-серверу через SQL Server Management Studio (SSMS).
  3. Сгенерируем и выполним скрипт очистки данных во всех таблицах копии базы данных (используя команду TRUNCATE TABLE для всех пользовательских таблиц). Это позволит получить базу с идентичной конфигурацией и структурой, но абсолютно пустую, что гарантирует прохождение реструктуризации без ошибок блокировок и несовместимости данных.
  4. Запустим Конфигуратор на этой пустой копии базы данных и выполним полное Тестирование и исправление с галкой Реструктуризация. Платформа создаст идеальную чистую физическую схему таблиц, соответствующую менеджеру имен.
  5. Используя средства SQL (импорт/экспорт схем или сторонние утилиты сравнения схем БД), перенесем исправленную структуру таблиц (особенно системные таблицы и менеджер имен) в оригинальную рабочую базу.

Для быстрой очистки таблиц в копии базы данных на MS SQL можно использовать следующий SQL-скрипт, который генерирует команды очистки для всех таблиц, кроме системных конфигурационных таблиц 1С (таких как Config, Params, DBNames):


DECLARE @TableName NVARCHAR(380)
DECLARE @Sql NVARCHAR(MAX)

DECLARE TableCursor CURSOR FOR
SELECT name FROM sys.tables 
WHERE name NOT LIKE 'Config%' 
  AND name NOT LIKE 'Params%' 
  AND name NOT LIKE 'Files%' 
  AND name NOT LIKE '_YearOffset%'

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Sql = 'TRUNCATE TABLE [' + @TableName + ']'
    BEGIN TRY
        EXEC sp_executesql @Sql
    END TRY
    BEGIN CATCH
        -- Если таблица имеет внешние ключи, используем DELETE
        SET @Sql = 'DELETE FROM [' + @TableName + ']'
        EXEC sp_executesql @Sql
    END CATCH
    FETCH NEXT FROM TableCursor INTO @TableName
END

CLOSE TableCursor
DEALLOCATE TableCursor

---

Метод 4. Очистка системной таблицы реструктуризации расширений

Часто аварийное завершение обновления с ошибкой менеджера имен связано с использованием расширений конфигурации. В процессе реструктуризации платформа создает временные таблицы для объектов расширений и регистрирует их в системной таблице _ExtensionsRestruct.

Если процесс прервался, эта таблица остается заполненной «мусорными» записями, блокируя последующие попытки реструктуризации. Выясним, как это исправить:

  1. Откроем СУБД (MS SQL или PostgreSQL) и найдем в базе данных таблицу _ExtensionsRestruct.
  2. Выполним команду очистки этой таблицы: TRUNCATE TABLE _ExtensionsRestruct;
  3. Попробуем снова открыть Конфигуратор и запустить обновление базы данных. Во многих случаях после очистки этой таблицы рассинхронизация менеджера имен исчезает, и база успешно обновляется.

---

Метод 5. Обход проблемы через создание РИБ (Распределенной информационной базы)

Если база данных запускается в конфигураторе, но физические таблицы разрушены настолько, что SQL-сервер постоянно выдает ошибки SDBL, одним из самых элегантных способов решения является создание начального образа подчиненного узла РИБ.

Платформа 1С при создании начального образа РИБ выполняет следующие действия:

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

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

---

Профилактика: как не допустить сбоя при будущих обновлениях

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

← На главную