Внезапное переименование сетевого каталога с активной файловой базой 1С, аварийный обрыв соединения или сбой сетевого протокола SMB часто приводят к критическому повреждению структуры файла 1Cv8.1CD. В результате при попытке авторизации в режиме предприятия или конфигуратора система выдает критическое сообщение: «Ошибка формата потока». При этом штатная утилита проверки chdbfl.exe нередко рапортует, что ошибок не обнаружено, поскольку она контролирует лишь физическую целостность страниц, но не способна распознать разрушение упакованных потоков двоичных данных BLOB.
Проанализируем природу этой неисправности и разберем по шагам действенный инженерный способ восстановления базы данных, когда стандартные методы не помогают, а резервные копии отсутствуют.
Выясним причину сбоя. При работе пользователей с файловой базой через сетевой ресурс Windows активно задействует механизмы кэширования SMB (Oplocks, лизинг каталогов). Если каталог переименовывается «на лету» или разрывается связь, клиенты мгновенно теряют дескрипторы файлов. Отложенные операции записи сбрасываются не полностью, формируя так называемые «рваные страницы».
Ошибка формата потока возникает на этапе распаковки данных алгоритмом zlib/deflate или при разборе внутренних XML/двоичных структур конфигурации. Таблица PARAMS содержит внутренние параметры информационной базы, включая список пользователей, схему сопоставления имен объектов и структуру конфигурации. Если в этой таблице повреждается дескриптор или поток, платформа не может инициализировать сеанс.
Утилита chdbfl.exe проверяет только размещение блоков и структуру B-деревьев на диске. Если блоки распределены без физических пересечений, утилита считает файл исправным. В такой ситуации логическое восстановление требует переноса физических таблиц с данными в заведомо здоровую структуру новой базы.
Перед тем как приступать к глубокому вмешательству в бинарную структуру, выполним обязательные предварительные действия:
1Cv8.1CD в безопасное место. Все дальнейшие манипуляции проводим строго на копии.AppData\Local\1C\1cv8 и AppData\Roaming\1C\1cv8). Это исключит влияние испорченного клиентского кэша.Если эти шаги не привели к результату, а тестирование в специализированной утилите показывает ошибки в таблице PARAMS, перейдем к процедуре переноса таблиц данных.
Для выполнения процедуры нам понадобятся специализированные инструменты работы с форматом 1CD:
.1cd, что критически важно для корректного сопоставления дескрипторов.Рассмотрим подробнее суть метода. Поскольку таблица PARAMS в исходной базе необратимо повреждена, мы создаем чистую базу с идентичной конфигурацией метаданных. Затем мы переносим пользовательские таблицы данных из сломанной базы в новую, выравнивая внутренние файлы описания (дескрипторы descr).
Шаг 1. Получение конфигурации метаданных.
Откроем поврежденную базу в утилите Tool_1CD. Сохраним файл конфигурации поставщика или основной конфигурации (файл с расширением .cf) через меню экспорта конфигурации. Если из-за повреждений сделать это не удается, найдем чистый дистрибутив или архивную копию точно такого же релиза конфигурации.
Шаг 2. Экспорт таблиц из поврежденной базы.
В утилите Tool_1CD выполним выгрузку:
V8USERS, USERSWORKHISTORY, FRMDTSETTING, _SYSTEMSETTING, COMMONSETTING (при их наличии).Каждая выгруженная таблица представляет собой набор файлов: descr (описание полей и индексов), data (строки таблицы), blob (двоичные данные неограниченной длины), index и root.
Шаг 3. Создание эталонной базы и экспорт ее дескрипторов.
Создадим средствами платформы 1С совершенно новую пустую информационную базу. Загрузим в нее полученный ранее файл .cf и применим изменения (нажав F7 в конфигураторе), чтобы платформа физически создала таблицы в файле 1Cv8.1CD.
Откроем эту чистую рабочую базу в Tool_1CD и выгрузим из нее таблицы данных во второй отдельный каталог. Главная ценность этих файлов — корректные, неповрежденные файлы описания descr, созданные платформой.
Шаг 4. Сопоставление таблиц и замена дескрипторов.
Проанализируем главную сложность: внутренние физические имена таблиц в двух базах могут различаться (например, справочнику номенклатуры в старой базе соответствовала таблица _REFERENCE12, а в новой — _REFERENCE15). Если просто скопировать файлы данных, база потеряет логические связи.
Для сопоставления задействуем обработку от компоненты 1cLib. Откроем в ней обе базы для анализа метаданных. В модуле обработки обратим внимание на функцию сопоставления объектов. Передадим обе базы в контекст функции для парного сравнения:
// Пример доработки функции сопоставления таблиц двух баз
Функция ПолучитьСоответствиеТаблиц(БазаИсточник, БазаПриемник)
Соответствие = Новый Соответствие;
ТаблицыИсточника = БазаИсточник.ПолучитьТаблицы();
Для Каждого Таблица Из ТаблицыИсточника Цикл
ИмяМетаданных = БазаИсточник.ПолучитьИмяОбъектаПоТаблице(Таблица.Имя);
ИмяТаблицыПриемника = БазаПриемник.ПолучитьИмяТаблицыПоОбъекту(ИмяМетаданных);
Если ЗначениеЗаполнено(ИмяТаблицыПриемника) Тогда
Соответствие.Вставить(Таблица.Имя, ИмяТаблицыПриемника);
КонецЕсли;
КонецЦикла;
Возврат Соответствие;
КонецФункции
После установления соответствия для каждой выгруженной таблицы из сломанной базы заменяем файл descr на аналогичный файл descr соответствующей таблицы из новой рабочей базы.
Шаг 5. Подготовка структуры новой базы к приему данных.
Откроем новую базу через инструментарий 1cLib. Удалим из нее все таблицы с данными, а также таблицы пользователей, которые мы планируем вернуть из старой базы (V8USERS, USERSWORKHISTORY, FRMDTSETTING).
Важно: ни в коем случае не удаляем ключевые системные таблицы новой базы, хранящие структуру метаданных:
CONFIG — основная конфигурация;CONFIGSAVE — служебная таблица сохранения (в стабильном состоянии пустая);PARAMS — таблица параметров информационной базы;DBSCHEMA — схема базы данных;IBVERSION — версия формата информационной базы;FILES — служебные системные файлы.Шаг 6. Импорт данных и финализация.
Соберем в итоговом каталоге выгруженные таблицы данных из поврежденной базы с уже замененными и сопоставленными файлами descr, а также служебные таблицы пользователей. В утилите Tool_1CD откроем подготовленную новую базу и нажмем кнопку импорта и создания таблиц.
После завершения импорта запустим базу данных в режиме «1С:Предприятие». База успешно откроется, сохранив всю пользовательскую информацию, а поврежденные участки конфигурационных потоков будут заменены чистыми данными.
Чтобы исключить повторение ситуации с повреждением потоков, пересмотрим архитектуру эксплуатации файловых баз:
1Cv8.1CD выполняет единственный локальный процесс сервера, что исключает сетевые повреждения файла базы.