Ситуация, когда после рядового изменения метаданных или применения динамического обновления система внезапно выдает сообщение «Ошибка формата потока» и полностью блокирует доступ как в режим «1С:Предприятие», так и в «Конфигуратор», является кошмаром для любого администратора и программиста 1С. Ситуация усложняется, если за время работы в базу уже были введены новые документы, а простой системы обходится компании слишком дорого.
В этой статье мы подробно разберем, почему возникает данная ошибка в клиент-серверном варианте работы под управлением СУБД MS SQL Server, и рассмотрим проверенные практические методы восстановления работоспособности базы данных — от штатных утилит платформы до точечного хирургического вмешательства на уровне таблиц SQL.
Для того чтобы эффективно бороться с проблемой, необходимо понять физику процесса. В клиент-серверном варианте работы вся конфигурация 1С хранится непосредственно в базе данных SQL в виде бинарных данных (потоков), распределенных по специальным служебным таблицам. Основными из них являются:
Config — хранит основную конфигурацию базы данных, с которой работают пользователи.ConfigSave — хранит промежуточную (сохраняемую программистом) конфигурацию, которая еще не была применена к базе данных (не обновлена по кнопке F7).Когда вы выполняете обновление конфигурации (особенно динамическое обновление «на лету»), платформа производит чтение, декомпрессию, изменение и обратную запись этих бинарных данных. Если в этот момент происходит сетевой сбой, нехватка оперативной памяти, завершение сеанса СУБД по таймауту или переполнение системной базы данных TempDB, структура данных записывается некорректно. При следующем обращении к этим данным платформа 1С пытается прочитать деформированный бинарный поток, не может распознать его формат и аварийно завершает работу с ошибкой формата потока.
Давайте пошагово разберем методы решения этой проблемы, двигаясь от самых простых и безопасных к более радикальным.
Если доступ к графическому интерфейсу «Конфигуратора» закрыт, мы можем использовать запуск платформы в пакетном режиме с системными ключами. Для этого предназначен ключ командной строки /RollbackCfg, который осуществляет откат основной конфигурации к последней работоспособной конфигурации базы данных.
Выполним процедуру отката по шагам:
"C:\Program Files\1cv8\8.3.12.1440\bin\1cv8.exe" CONFIG /S"ИмяСервераSQL\ИмяБазы1С" /N"Администратор" /P"Пароль" /RollbackCfg
Разберем параметры этой команды:
CONFIG — указывает платформе на необходимость запуска в режиме конфигуратора./S — задает путь к информационной базе на сервере 1С./N и /P — имя и пароль пользователя с административными правами./RollbackCfg — ключевой параметр, инициирующий очистку незавершенных транзакций динамического обновления и возвращающий конфигурацию в стабильное состояние.В большинстве случаев этот простой метод позволяет за считанные секунды разблокировать базу данных без потери введенных пользователями документов.
Если штатный откат через командную строку не помог или завершился с ошибкой, нам придется обратиться к СУБД MS SQL Server напрямую. Часто причиной «петли» ошибки формата потока являются зависшие маркеры незавершенных транзакций динамического обновления в таблицах конфигурации.
Проанализируем структуру базы и выполним безопасную очистку временных таблиц. Для этого откроем SQL Server Management Studio (SSMS), создадим новый запрос к нашей проблемной базе данных и выполним следующие действия:
ConfigSave содержит несохраненные изменения, которые подготавливались к обновлению. Ее очистка безопасна для рабочих данных пользователей:
DELETE FROM [Имя_Вашей_Базы].[dbo].[ConfigSave]
2. Удалим служебные маркеры блокировок. В процессе обновления платформа создает специальные записи в таблице Config с именами файлов, сигнализирующими о начале процесса записи. Если эти записи зависли, платформа считает конфигурацию «битой». Выполним их удаление:
DELETE FROM [Имя_Вашей_Базы].[dbo].[Config] WHERE [FileName] = 'commit'
DELETE FROM [Имя_Вашей_Базы].[dbo].[Config] WHERE [FileName] = 'dynamicCommit'
DELETE FROM [Имя_Вашей_Базы].[dbo].[Config] WHERE [FileName] = 'dbStruFinal'
После выполнения данных SQL-запросов обязательно перезапустим службу сервера 1С:Предприятие (или перезагрузим сам сервер), чтобы сбросить кэш соединений, и попробуем зайти в Конфигуратор.
Рассмотрим ситуацию, при которой конфигурация базы данных оказалась повреждена настолько серьезно, что простые удаления маркеров коммита не помогают. У нас есть резервная копия (бэкап) базы данных, сделанная, например, несколько часов назад. Но за это время менеджеры успели ввести множество критически важных документов, и простой откат на старый бэкап вызовет панику и колоссальные трудозатраты по повторному вводу данных.
В этом случае мы можем применить стратегию «хирургического переноса». Мы восстановим рабочую конфигурацию из здорового бэкапа в нашу текущую «битую» базу данных средствами SQL, не затрагивая таблицы с пользовательскими данными (документами, справочниками, регистрами).
Выполним процедуру по шагам:
[Healthy_Backup]).[Broken_Database]), и остановим службу сервера 1С:Предприятие для разрыва всех кэшированных соединений.Config в сломанной базе аналогичными данными из здоровой копии:
USE [Broken_Database]
GO
-- Очищаем поврежденные таблицы конфигурации
TRUNCATE TABLE [dbo].[Config]
TRUNCATE TABLE [dbo].[ConfigSave]
GO
-- Переносим структуру метаданных из здорового бэкапа
INSERT INTO [Broken_Database].[dbo].[Config]
SELECT * FROM [Healthy_Backup].[dbo].[Config]
GO
4. Запустим службу сервера 1С:Предприятие.
Этот метод гарантирует стопроцентное восстановление структуры метаданных до состояния на момент создания бэкапа, при этом все данные пользователей, введенные за последние часы в СУБД, останутся в полной сохранности.
Иногда сама база данных в SQL уже исправлена, но платформа 1С продолжает выдавать ошибку формата потока. Это связано с тем, что скомпилированные модули и метаданные кэшируются как на стороне локального компьютера пользователя, так и на стороне сервера 1С:Предприятие.
Разберем процедуру полной очистки кэша.
Для очистки локального кэша пользователя:
Самый простой способ — удалить проблемную базу из списка запуска в окне запуска 1С и добавить ее заново под тем же адресом. При этом старый каталог кэша, привязанный к UUID базы в списке, перестает использоваться. Также можно вручную очистить содержимое папок:
%userprofile%\AppData\Local\1C\1Cv8
%userprofile%\AppData\Roaming\1C\1Cv8
Для очистки серверного кэша:
Серверный кэш хранит структуры сеансовых данных и может транслировать ошибку формата потока всем подключающимся клиентам. Чтобы очистить его:
C:\Program Files\1cv8\srvinfo).reg_1541).snccntry.dat и папки с именем v8system. Важно: ни в коем случае не удаляйте папку 1Cv8Log, так как в ней хранится журнал регистрации базы данных!Что делать, если база запускается, но ошибка формата потока возникает точечно при выполнении конкретной операции (например, при проведении определенного документа или формировании отчета)? Это говорит о повреждении конкретного объекта метаданных конфигурации (например, испортилась конкретная форма или макет).
Для поиска проблемного метаданного настроим Технологический Журнал (ТЖ):
C:\Program Files\1cv8\conf) создадим файл с именем logcfg.xml следующего содержания:
<config xmlns="http://v8.1c.ru/v8/tech-journal">
<log location="C:\1C_Logs\TJ" history="2">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="EXCPCNTX"/>
</event>
<property name="all"/>
</log>
</config>
2. Создадим на диске папку C:\1C_Logs\TJ и предоставим к ней права на запись для пользователя, от имени которого запущена служба сервера 1С (обычно это USR1CV8).
3. Воспроизведем ошибку формата потока в режиме «1С:Предприятие».
4. Откроем лог-файлы в созданной папке и найдем строку с событием EXCP, содержащую текст «Ошибка формата потока». Непосредственно перед ней в логе будет зафиксирован контекст обращения к метаданным, включая UUID конкретного объекта (например, макета или формы). Зная этот UUID, мы можем точечно заменить поврежденную запись в таблице Config, скопировав ее из аналогичной строки здоровой базы данных SQL.
Для того чтобы минимизировать риски возникновения подобных ситуаций в будущем, рекомендуем соблюдать простые правила администрирования:
TempDB имеет достаточный лимит авторасширения, а на диске, где она расположена, всегда есть запас свободного пространства (не менее 50-100 ГБ для крупных баз).