Проанализируем крайне неприятную и опасную ситуацию: в СУБД Microsoft SQL Server по какой-то причине отсутствует физическая таблица регистра сведений (например, dbo._InfoRgXXXX), однако в дереве метаданных Конфигуратора 1С этот регистр по-прежнему присутствует. При любой попытке удалить объект, выполнить реструктуризацию или обновить конфигурацию базы данных платформа аварийно завершает работу (происходит крэш) либо выдает критическую ошибку вида Invalid object name с кодом ошибки 42S02.
Выясним причину такого поведения платформы и подробно рассмотрим по шагам надежные способы восстановления работоспособности информационной базы.
Платформа 1С:Предприятие при операциях изменения или удаления объектов метаданных выполняет транзакционную проверку и реструктуризацию физических таблиц в СУБД. Если объект удаляется из дерева метаданных, платформа пытается обратиться к соответствующей таблице в SQL (для анализа данных или выполнения инструкции DROP TABLE). Когда таблица в базе физически отсутствует, СУБД возвращает ошибку отсутствия объекта, с которой механизм реструктуризации ряда версий платформы не может корректно справиться и аварийно завершает процесс.
Посмотрим на типовой стек ошибки из технологического журнала или системных сообщений:
Ошибка СУБД: Microsoft SQL Server Native Client: Invalid object name 'dbo._InfoRg12066'. HRESULT=80040E37, SQLSrvr: SQLSTATE=42S02
Разберем первый подход, который позволяет вернуть платформе ожидаемый физический объект в СУБД, после чего выполнить штатное удаление или реструктуризацию через Конфигуратор без потери остальных данных.
Попробуем получить имя таблицы программным путем с помощью функции ПолучитьСтруктуруХраненияБазыДанных. Выполним следующий фрагмент кода во внешней обработке:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
Отбор = Новый Структура;
Отбор.Вставить("Метаданные", "РегистрСведений.ИмяПроблемногоРегистра");
НайденныеСтроки = СтруктураБД.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
Сообщить("Имя таблицы в SQL: " + НайденныеСтроки[0].ИмяТаблицыХранения);
КонецЕсли;
Если прямое обращение через встроенный язык также приводит к аварийному завершению работы сеанса, определим имя таблицы через трассировку SQL Server Profiler, сбор расширенных событий (Extended Events) или по тексту ошибки в журнале регистрации и технологическом журнале.
Выгрузим файл конфигурации (.cf) из поврежденной базы через меню Конфигурация - Сохранить конфигурацию в файл. Развернем из этого файла новую чистую базу на SQL Server. В SQL Server Management Studio (SSMS) найдем в чистой базе созданную таблицу проблемного регистра, нажмем по ней правой кнопкой мыши и выберем пункт Script Table as - CREATE To - New Query Editor Window.
Сверим имя таблицы в скрипте с именем, которое зафиксировано в рабочей базе. Если имена совпадают (или если имя скорректировано под рабочую базу), выполним сгенерированный SQL-скрипт создания пустой таблицы в рабочей базе данных.
Теперь, когда физическая таблица присутствует в SQL, откроем Конфигуратор рабочей базы, удалим ненужный объект метаданных и штатно обновим конфигурацию базы данных (клавиша F7). Платформа найдет таблицу, выполнит системные инструкции удаления и зафиксирует целостность метаданных.
Рассмотрим альтернативный способ, который помог автору вопроса восстановить базу без прямого написания DDL-скриптов в СУБД.
.cf из поврежденной SQL-базы..cf. В файловой базе принудительно удаляем проблемный регистр сведений из дерева метаданных и сохраняем изменения (F7)..cf файл, в котором проблемный регистр уже отсутствует..cf. Соглашаемся с удалением объекта и выполняем обновление базы данных.Если падение Конфигуратора происходит сразу при открытии или попытке обновления из-за зависшей незавершенной реструктуризации, разберем сброс промежуточного состояния метаданных на уровне СУБД.
В базе данных 1С системная таблица ConfigSave хранит редактируемую, но еще не примененную к базе данных конфигурацию. Выполним команду в SQL Server Management Studio:
DELETE FROM ConfigSave;
Этот запрос очищает несохраненные промежуточные изменения и возвращает конфигуратор к стабильному состоянию, записанному в основной таблице Config.
Проанализируем обязательные регламентные шаги после выполнения любых низкоуровневых исправлений структуры:
1C:Enterprise 8.3 Server Agent, чтобы сбросить кэш метаданных кластера серверов.snccntx... в каталоге srvinfo) и пользовательские кэши на клиентских машинах.