В процессе обновления информационных баз 1С (особенно таких сложных конфигураций, как 1С:Зарплата и Управление Персоналом) администраторы и разработчики иногда сталкиваются с критическими сбоями. Одним из наиболее тяжелых симптомов является сочетание ошибки SDBL CAST(0:00000000000000000000000000000000 AS REF()) несовместим с типом поля и последующего падения системы с сообщением «Запись не найдена в менеджере имен базы данных». База данных перестает запускаться в режиме Предприятия, отложенное обновление зависает или аварийно завершается, а при попытке выполнить Тестирование и исправление (ТиИ) платформа сообщает об отсутствии физических таблиц в СУБД (например, Const, ScheduledJobs, AccumRg), хотя в служебных таблицах они числятся.
В этой статье мы подробно разберем, почему возникают эти ошибки, проанализируем внутренние механизмы платформы 1С и СУБД, а также рассмотрим пошаговые методы восстановления работоспособности базы данных, даже если у вас не оказалось свежего бэкапа.
---
Для начала проанализируем ситуацию и поймем физику процесса. Ошибка вида CAST(0:0000... AS REF()) несовместим с типом поля... возникает из-за конфликта ссылочных кодов в СУБД. В платформе 1С каждому объекту метаданных (справочнику, документу, регистру) сопоставляется внутренний числовой идентификатор — ссылочный код. При реструктуризации базы данных платформа создает новые таблицы и назначает им эти коды.
Сбой происходит по следующему сценарию:
rmngr.exe) продолжает удерживать в оперативной памяти кэш свободных ссылочных кодов, который уже не соответствует актуальному состоянию восстановленной базы.Что касается ошибки «Запись не найдена в менеджере имен базы данных» — это следствие аварийного прерывания реструктуризации. Менеджер имен (хранящийся в системной таблице СУБД params и файле метаданных DBNames) рассинхронизируется с реальным физическим набором таблиц на SQL-сервере. Платформа считает, что таблица должна быть, обращается к ней, но в SQL ее нет, либо наоборот.
---
Перед тем как приступать к любым восстановительным работам, в обязательном порядке сделайте копию текущего состояния базы данных, даже если она кажется полностью «мертвой». В процессе исправления таблиц SQL штатными средствами или сторонними утилитами всегда есть риск окончательно разрушить логическую структуру данных. Сделайте копию средствами вашей СУБД (создайте резервную копию .bak в MS SQL или дамп в PostgreSQL).
---
Если конфигуратор еще открывается, но база падает при обновлении или запуске Предприятия, попробуем заставить платформу принудительно перестроить схему данных через механизм изменения совместимости.
Выполним следующие шаги:
.1cd), если работа велась на SQL. На файловой базе некоторые проверки платформы отрабатывают мягче.---
Если тестирование и исправление прерывается ошибками отсутствия таблиц вроде ScheduledJobs32403 отсутствует в схеме базы данных, это указывает на повреждение конкретных служебных объектов (в данном случае — регламентированных заданий). Мы можем локализовать и устранить эти объекты программно.
Для того чтобы сопоставить внутренние имена SQL (например, ScheduledJobs32403) с реальными объектами метаданных 1С, используем встроенную функцию ПолучитьСтруктуруХраненияБазыДанных(). Поскольку база не запускается в обычном режиме, мы можем написать внешнюю обработку и запустить ее в режиме отладки или через запуск конфигуратора с параметрами.
Рассмотрим пример кода для поиска проблемной таблицы:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
Если СтрокаТаблицы.ИмяТаблицыХранения = "ScheduledJobs32403" Тогда
Сообщить("Проблемный объект: " + СтрокаТаблицы.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
После того как объект идентифицирован (например, конкретное регламентное задание или константа), выполним следующие действия:
Const32418), попробуем найти эту константу в конфигурации и временно удалить ее. При сохранении конфигурации платформа удалит упоминание о ней из менеджера имен, что позволит завершить реструктуризацию остальных таблиц.---
Это продвинутый метод, который позволяет полностью пересоздать структуру таблиц в базе СУБД, сохранив при этом конфигурацию и данные (путем их последующего переноса или очистки структуры в копии). Рассмотрим схему работы через очистку таблиц на копии базы данных в MS SQL.
Разберем процесс по шагам:
TRUNCATE TABLE для всех пользовательских таблиц). Это позволит получить базу с идентичной конфигурацией и структурой, но абсолютно пустую, что гарантирует прохождение реструктуризации без ошибок блокировок и несовместимости данных.Для быстрой очистки таблиц в копии базы данных на 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
---
Часто аварийное завершение обновления с ошибкой менеджера имен связано с использованием расширений конфигурации. В процессе реструктуризации платформа создает временные таблицы для объектов расширений и регистрирует их в системной таблице _ExtensionsRestruct.
Если процесс прервался, эта таблица остается заполненной «мусорными» записями, блокируя последующие попытки реструктуризации. Выясним, как это исправить:
_ExtensionsRestruct.
TRUNCATE TABLE _ExtensionsRestruct;
---
Если база данных запускается в конфигураторе, но физические таблицы разрушены настолько, что SQL-сервер постоянно выдает ошибки SDBL, одним из самых элегантных способов решения является создание начального образа подчиненного узла РИБ.
Платформа 1С при создании начального образа РИБ выполняет следующие действия:
Разберем этот процесс по шагам:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
---
Чтобы избежать подобных критических ситуаций в будущем, рекомендуем придерживаться простых правил администрирования: