В процессе разработки или обновления конфигурации из хранилища 1С:Предприятие может возникнуть критическая ситуация: основная конфигурация оказывается поврежденной, и при попытке открыть конфигуратор система выдает «ошибку формата потока». При этом работающая (актуальная) конфигурация базы данных остается исправной, и пользователи могут продолжать работу в режиме «Предприятие». Разберем подробно, как реанимировать такую базу, сохранив накопленные данные.
Прежде чем приступать к радикальным мерам, проанализируем ситуацию. Ошибка формата потока означает, что структура бинарных данных внутри таблиц конфигурации (в частности, в таблице Config) нарушена. Поскольку база данных в режиме предприятия запускается, это подтверждает исправность таблицы DbConfig. Рассмотрим стандартные шаги, которые необходимо выполнить в первую очередь:
Для попытки отката конфигурации воспользуемся следующей командой:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "ПутьКБазе" /N "Логин" /P "Пароль" /RollbackCfg
Если база подключена к хранилищу и команда /RollbackCfg не помогает из-за блокировок, проанализируем возможность принудительного отключения от хранилища:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "ПутьКБазе" /N "Логин" /P "Пароль" /ConfigurationRepositoryUnbindCfg
Если эти команды также возвращают ошибку формата потока, значит, повреждение затронуло системные объекты, отвечающие за связь с хранилищем или базовые структуры метаданных.
Это самый надежный способ, если стандартные средства восстановления не срабатывают. Поскольку конфигурация базы данных (та, что работает у пользователей) исправна, мы можем извлечь ее в файл .cf и использовать для создания новой чистой базы.
Выполним следующие шаги:
"C:\Program Files\1cv8\8.3.X.X\bin\1cv8.exe" DESIGNER /S "Сервер\База" /N "Admin" /P "Pass" /DumpDbCfgHierarchical "C:\temp\actual_config.cf"
actual_config.cf в новую базу.Если база данных имеет значительный объем и перенос данных через XML займет слишком много времени, рассмотрим вариант «лечения» на уровне СУБД. Внимание: Перед любыми манипуляциями в SQL обязательно создайте полную резервную копию базы данных.
Основная конфигурация хранится в таблице Config, а конфигурация базы данных — в DbConfig. Наша задача — заменить поврежденное содержимое Config исправным содержимым из DbConfig.
Проанализируем алгоритм действий в консоли SQL Server Management Studio:
DELETE FROM ConfigSave
DELETE FROM Config
INSERT INTO Config SELECT * FROM DbConfig
После выполнения этих запросов попробуем открыть конфигуратор. Система увидит, что основная конфигурация идентична конфигурации базы данных, и должна запуститься без ошибок.
Если мы хотим выяснить, какой именно объект вызывает ошибку формата потока, воспользуемся Технологическим журналом (ТЖ). Это поможет, если мы планируем точечно заменить поврежденный поток в SQL-таблице.
Настроим файл logcfg.xml для сбора событий исключений EXCP:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\1C" history="1">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Посмотрим логи ТЖ после неудачной попытки открытия конфигуратора. Найдем запись об ошибке Error format stream. В логе часто указывается идентификатор (GUID) потока или имя файла внутри конфигурации (например, metadata или root). Зная этот ID, опытный администратор может найти соответствующую запись в таблице Config и заменить поле BinaryData, взяв его из бэкапа или из таблицы DbConfig.
Иногда ошибка формата потока вызвана не самой базой, а повреждением локального кэша хранилища. Проанализируем состояние папки профиля пользователя. Помимо стандартного кэша, существует каталог кэша версий хранилища. Он находится по пути:
%AppData%\1C\1cv8\PersonalFolderID\src-cache
Если разрушение произошло в момент получения данных из хранилища, попробуем полностью удалить папку с идентификатором базы в AppData (и в Local, и в Roaming). Это заставит систему при следующем подключении заново загрузить данные из хранилища, игнорируя поврежденные локальные копии объектов.
Выясним, какой из методов наиболее предпочтителен. Если данные критичны и база большая — используем SQL-запросы для синхронизации Config и DbConfig. Если база небольшая (как в случае автора темы), самым безопасным будет метод с созданием новой базы и переносом данных, так как это гарантирует отсутствие скрытых повреждений в системных таблицах Files и DBSchema.