Ситуация, когда единственная копия базы данных 1С активно эксплуатируется прямо на флеш-накопителе, к сожалению, встречается нередко. Это крайне небезопасный подход. Флеш-накопители не предназначены для постоянных транзакционных нагрузок, которые создает файловая СУБД 1С. В результате внезапного отключения питания, извлечения накопителя или износа ячеек памяти происходит повреждение структуры файла .1CD.
Когда пользователь запускает стандартную утилиту проверки физической целостности chdbfl.exe, она пытается исправить заголовки таблиц и индексы. Однако chdbfl.exe работает достаточно жестко: если повреждена таблица размещения данных, утилита не восстанавливает утерянные фрагменты, а просто удаляет поврежденные страницы файла. Именно поэтому база данных «усохла» на треть — огромный массив информации, включая структуру конфигурации и пользовательские данные, был безвозвратно стерт.
В результате мы получаем две критические проблемы:
CONFIG и PARAMS: Здесь хранится сама структура метаданных конфигурации. Из-за потери записей неограниченной длины Конфигуратор теряет способность прочитать дерево объектов и аварийно завершает работу при запуске._infoRg9491: Платформа видит описание таблицы в схеме данных, но физически в файле .1CD ее не существует (она была удалена утилитой chdbfl.exe). При обращении к базе система выдает ошибку СУБД «Таблица не найдена».Рассмотрим подробнее, как по шагам восстановить работоспособность базы данных и спасти уцелевшую информацию.
Поскольку Конфигуратор поврежденной базы не открывается, мы не можем стандартным путем загрузить чистый файл конфигурации (.cf). Нам потребуется низкоуровневое восстановление системных таблиц с помощью специализированной утилиты Tool1CD. Проанализируем этот процесс по шагам.
Для начала нам понадобится «донор» — абсолютно чистая база данных той же самой конфигурации и точно того же релиза. В нашем случае это Бухгалтерия предприятия, редакция 2.0 (2.0.66.6).
Tool1CD и откроем в ней файл .1CD нашей чистой базы-донора.CONFIG, PARAMS и DBSCHEMA. В некоторых сложных случаях может потребоваться также таблица FILES.Tool1CD поврежденный файл базы данных.CONFIG, PARAMS и DBSCHEMA и выполним операцию импорта (замены) ранее сохраненными исправными таблицами из базы-донора. Если в поврежденной базе присутствует таблица CONFIGSAVE, которая хранит конфигурацию в процессе обновления, ее необходимо полностью очистить, чтобы избежать конфликтов при запуске.После проведения этой операции структура метаданных будет полностью приведена в соответствие с эталонным релизом. Теперь Конфигуратор должен успешно открываться, однако запустить режим «1С:Предприятие» или выполнить тестирование базы мы все еще не сможем из-за отсутствия физической таблицы регистра сведений.
Префикс _infoRg указывает на то, что утерянная таблица принадлежит объекту метаданных Регистр сведений (Information Register). Нам необходимо искусственно воссоздать эту таблицу (пусть и пустую), чтобы платформа 1С перестала выдавать критическую ошибку СУБД. Рассмотрим два эффективных метода решения этой задачи.
Если нам удалось восстановить запуск Конфигуратора на предыдущем шаге, мы можем заставить механизм реструктуризации платформы самостоятельно создать недостающую таблицу в файловой базе данных.
ВременнаяКонстантаДляРеструктуризации или добавим неиспользуемый реквизит в любой справочник.DBSCHEMA) с физическим наличием таблиц, система обнаружит, что физической таблицы для регистра _infoRg9491 не существует. Механизм реструктуризации автоматически создаст пустую таблицу _infoRg9491 с нужной структурой полей.Если файловый вариант не поддается реструктуризации или мы хотим иметь полный контроль над СУБД, перенесем базу на клиент-серверный вариант работы.
.dt..dt._infoRg9491. Теперь мы можем воссоздать её вручную через консоль СУБД (например, SQL Server Management Studio)._infoRg9491. Развернем на этом же SQL-сервере нашу чистую базу-донор БП 2.0.66.6.
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из СтруктураХранения Цикл
Если СтрокаТаблицы.ИмяТаблицыХранения = "_infoRg9491" Тогда
Сообщить("Имя объекта метаданных: " + СтрокаТаблицы.ИмяТаблицы);
Для Каждого Поле Из СтрокаТаблицы.Поля Цикл
Сообщить("Поле: " + Поле.ИмяПоляХранения + " | Тип: " + Поле.ТипДанных);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Этот код позволит нам точно сопоставить имя физической таблицы _infoRg9491 с объектом метаданных (например, это может быть регистр сведений «Адресный классификатор» или «Соответствие объектов для обмена»).
Зная имя объекта метаданных в чистой базе-доноре, мы можем сгенерировать скрипт создания (CREATE) этой таблицы непосредственно из SQL-сервера чистой базы и выполнить этот скрипт в нашей поврежденной базе данных.
Примерный SQL-скрипт создания структуры таблицы в MS SQL Server будет выглядеть следующим образом:
-- Пример создания таблицы регистра сведений
CREATE TABLE [dbo].[_infoRg9491] (
[_Period] [datetime] NOT NULL,
[_RecorderTRef] [binary](4) NOT NULL,
[_RecorderRRef] [binary](16) NOT NULL,
[_LineNo] [numeric](9, 0) NOT NULL,
[_Active] [binary](1) NOT NULL,
[_Fld9492_Type] [binary](1) NOT NULL,
[_Fld9492_RRef] [binary](16) NOT NULL
) ON [PRIMARY];
-- Создание кластеризованного индекса для обеспечения целостности
CREATE UNIQUE CLUSTERED INDEX [_info9491_Idx1] ON [dbo].[_infoRg9491] (
[_Period] ASC,
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
) ON [PRIMARY];
Выполнив данный скрипт в поврежденной базе данных на SQL-сервере, мы получим физическую, пустую таблицу _infoRg9491, которая полностью удовлетворит требования платформы 1С при запуске.
После того как физическая структура базы данных восстановлена, системные таблицы обновлены, а недостающие таблицы воссозданы в пустом виде, база данных успешно запустится в режиме Конфигуратора и Предприятия. Однако на данном этапе у нас гарантированно присутствуют логические нарушения: битые ссылки на объекты, которые находились в удаленной трети файла, и отсутствие записей в восстановленном регистре сведений.
Для исправления логической целостности выполним процедуру Тестирования и исправления (ТиИ):
Проанализировав данную критическую ситуацию, сделаем важные выводы для предотвращения подобных инцидентов в будущем:
.dt или копирование файла .1CD в облачное хранилище или на выделенный сетевой диск спасет вас от необходимости сложного низкоуровневого восстановления.