Как восстановить поврежденную базу 1С 2.0 после сбоя флешки и ошибок chdbfl.exe?

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

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

Когда пользователь запускает стандартную утилиту проверки физической целостности chdbfl.exe, она пытается исправить заголовки таблиц и индексы. Однако chdbfl.exe работает достаточно жестко: если повреждена таблица размещения данных, утилита не восстанавливает утерянные фрагменты, а просто удаляет поврежденные страницы файла. Именно поэтому база данных «усохла» на треть — огромный массив информации, включая структуру конфигурации и пользовательские данные, был безвозвратно стерт.

В результате мы получаем две критические проблемы:

  1. Повреждение системных таблиц CONFIG и PARAMS: Здесь хранится сама структура метаданных конфигурации. Из-за потери записей неограниченной длины Конфигуратор теряет способность прочитать дерево объектов и аварийно завершает работу при запуске.
  2. Отсутствие физической таблицы _infoRg9491: Платформа видит описание таблицы в схеме данных, но физически в файле .1CD ее не существует (она была удалена утилитой chdbfl.exe). При обращении к базе система выдает ошибку СУБД «Таблица не найдена».

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

Шаг 1. Восстановление структуры конфигурации через утилиту Tool1CD

Поскольку Конфигуратор поврежденной базы не открывается, мы не можем стандартным путем загрузить чистый файл конфигурации (.cf). Нам потребуется низкоуровневое восстановление системных таблиц с помощью специализированной утилиты Tool1CD. Проанализируем этот процесс по шагам.

Для начала нам понадобится «донор» — абсолютно чистая база данных той же самой конфигурации и точно того же релиза. В нашем случае это Бухгалтерия предприятия, редакция 2.0 (2.0.66.6).

  1. Развернем из дистрибутива чистую базу данных БП 2.0.66.6.
  2. Запустим утилиту Tool1CD и откроем в ней файл .1CD нашей чистой базы-донора.
  3. Найдем и экспортируем во внешние файлы таблицы, отвечающие за структуру базы данных. Это таблицы CONFIG, PARAMS и DBSCHEMA. В некоторых сложных случаях может потребоваться также таблица FILES.
  4. Закроем базу-донор в утилите. Перед дальнейшими действиями обязательно сделаем резервную копию нашей поврежденной базы данных!
  5. Откроем в Tool1CD поврежденный файл базы данных.
  6. Выберем таблицы CONFIG, PARAMS и DBSCHEMA и выполним операцию импорта (замены) ранее сохраненными исправными таблицами из базы-донора. Если в поврежденной базе присутствует таблица CONFIGSAVE, которая хранит конфигурацию в процессе обновления, ее необходимо полностью очистить, чтобы избежать конфликтов при запуске.

После проведения этой операции структура метаданных будет полностью приведена в соответствие с эталонным релизом. Теперь Конфигуратор должен успешно открываться, однако запустить режим «1С:Предприятие» или выполнить тестирование базы мы все еще не сможем из-за отсутствия физической таблицы регистра сведений.

Шаг 2. Воссоздание отсутствующей таблицы _infoRg9491

Префикс _infoRg указывает на то, что утерянная таблица принадлежит объекту метаданных Регистр сведений (Information Register). Нам необходимо искусственно воссоздать эту таблицу (пусть и пустую), чтобы платформа 1С перестала выдавать критическую ошибку СУБД. Рассмотрим два эффективных метода решения этой задачи.

Метод А. Принудительная реструктуризация в Конфигураторе

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

  1. Откроем поврежденную базу в режиме «Конфигуратор».
  2. Внесем любое минимальное, не влияющее на логику работы изменение. Например, добавим новую константу с именем ВременнаяКонстантаДляРеструктуризации или добавим неиспользуемый реквизит в любой справочник.
  3. Нажмем клавишу F7 (или выберем пункт меню «Конфигурация» — «Обновить конфигурацию базы данных»).
  4. Платформа запустит процесс реструктуризации таблиц. Сверяя схему данных (DBSCHEMA) с физическим наличием таблиц, система обнаружит, что физической таблицы для регистра _infoRg9491 не существует. Механизм реструктуризации автоматически создаст пустую таблицу _infoRg9491 с нужной структурой полей.
  5. После успешного обновления конфигурации базы данных удалим созданную нами временную константу и повторно нажмем F7 для возврата к исходной конфигурации.

Метод Б. Перенос на СУБД MS SQL / PostgreSQL и ручное создание таблицы

Если файловый вариант не поддается реструктуризации или мы хотим иметь полный контроль над СУБД, перенесем базу на клиент-серверный вариант работы.

  1. В восстановленном Конфигураторе выгрузим базу данных в файл резервной копии .dt.
  2. Развернем пустую базу данных на сервере СУБД (например, MS SQL Server) и загрузим в нее наш файл .dt.
  3. При попытке запуска или обновления мы снова столкнемся с ошибкой отсутствия таблицы _infoRg9491. Теперь мы можем воссоздать её вручную через консоль СУБД (например, SQL Server Management Studio).
  4. Для этого нам нужно узнать точную структуру полей таблицы _infoRg9491. Развернем на этом же SQL-сервере нашу чистую базу-донор БП 2.0.66.6.
  5. Запустим чистую базу в режиме «1С:Предприятие» и воспользуемся программным методом получения структуры хранения данных. Напишем простую внешнюю обработку со следующим кодом:

СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из СтруктураХранения Цикл
    Если СтрокаТаблицы.ИмяТаблицыХранения = "_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С при запуске.

Шаг 3. Логическое восстановление через Тестирование и Исправление (Тии)

После того как физическая структура базы данных восстановлена, системные таблицы обновлены, а недостающие таблицы воссозданы в пустом виде, база данных успешно запустится в режиме Конфигуратора и Предприятия. Однако на данном этапе у нас гарантированно присутствуют логические нарушения: битые ссылки на объекты, которые находились в удаленной трети файла, и отсутствие записей в восстановленном регистре сведений.

Для исправления логической целостности выполним процедуру Тестирования и исправления (ТиИ):

  1. В Конфигураторе перейдем в меню «Администрирование» — «Тестирование и исправление...».
  2. Установим следующие флаги:
    • Реиндексация таблиц информационной базы (поможет перестроить поврежденные индексы).
    • Проверка логической целостности (выявит логические ошибки в структуре связей).
    • Проверка ссылочной целостности (обнаружит ссылки на удаленные справочники и документы).
    • Реструктуризация таблиц информационной базы (окончательно перестроит физическую структуру под новые реалии).
  3. В настройках параметров проверки ссылочной целостности укажем:
    • При наличии битых ссылок: «Создавать объекты» (платформа автоматически создаст пустые элементы справочников или пустые документы с пометкой «Объект не найден», что позволит нам впоследствии вручную идентифицировать и восстановить утерянную информацию).
  4. Запустим процесс тестирования. Обратите внимание, что на больших базах данных этот процесс может занять значительное время.

Рекомендации по предотвращению подобных сбоев в будущем

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

← На главную