Как исправить ошибку формата потока в 1С на MS SQL Server?

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

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

В этой статье мы подробно разберем, почему возникает данная ошибка в клиент-серверном варианте работы под управлением СУБД MS SQL Server, и рассмотрим проверенные практические методы восстановления работоспособности базы данных — от штатных утилит платформы до точечного хирургического вмешательства на уровне таблиц SQL.

Выясняем причины возникновения ошибки

Для того чтобы эффективно бороться с проблемой, необходимо понять физику процесса. В клиент-серверном варианте работы вся конфигурация 1С хранится непосредственно в базе данных SQL в виде бинарных данных (потоков), распределенных по специальным служебным таблицам. Основными из них являются:

  1. Config — хранит основную конфигурацию базы данных, с которой работают пользователи.
  2. ConfigSave — хранит промежуточную (сохраняемую программистом) конфигурацию, которая еще не была применена к базе данных (не обновлена по кнопке F7).

Когда вы выполняете обновление конфигурации (особенно динамическое обновление «на лету»), платформа производит чтение, декомпрессию, изменение и обратную запись этих бинарных данных. Если в этот момент происходит сетевой сбой, нехватка оперативной памяти, завершение сеанса СУБД по таймауту или переполнение системной базы данных TempDB, структура данных записывается некорректно. При следующем обращении к этим данным платформа 1С пытается прочитать деформированный бинарный поток, не может распознать его формат и аварийно завершает работу с ошибкой формата потока.

Давайте пошагово разберем методы решения этой проблемы, двигаясь от самых простых и безопасных к более радикальным.

Способ 1. Использование штатного механизма отката конфигурации (/RollbackCfg)

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

Выполним процедуру отката по шагам:

  1. Запустим командную строку (cmd) от имени администратора на сервере, где установлена платформа 1С.
  2. Выполним команду запуска конфигуратора в пакетном режиме. Шаблон команды выглядит следующим образом:

"C:\Program Files\1cv8\8.3.12.1440\bin\1cv8.exe" CONFIG /S"ИмяСервераSQL\ИмяБазы1С" /N"Администратор" /P"Пароль" /RollbackCfg

Разберем параметры этой команды:

В большинстве случаев этот простой метод позволяет за считанные секунды разблокировать базу данных без потери введенных пользователями документов.

Способ 2. Очистка блокирующих записей динамического обновления в SQL

Если штатный откат через командную строку не помог или завершился с ошибкой, нам придется обратиться к СУБД MS SQL Server напрямую. Часто причиной «петли» ошибки формата потока являются зависшие маркеры незавершенных транзакций динамического обновления в таблицах конфигурации.

Проанализируем структуру базы и выполним безопасную очистку временных таблиц. Для этого откроем SQL Server Management Studio (SSMS), создадим новый запрос к нашей проблемной базе данных и выполним следующие действия:

  1. Очистим таблицу черновика конфигурации. Таблица 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С:Предприятие (или перезагрузим сам сервер), чтобы сбросить кэш соединений, и попробуем зайти в Конфигуратор.

Способ 3. Восстановление конфигурации из резервной копии через SQL

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

В этом случае мы можем применить стратегию «хирургического переноса». Мы восстановим рабочую конфигурацию из здорового бэкапа в нашу текущую «битую» базу данных средствами SQL, не затрагивая таблицы с пользовательскими данными (документами, справочниками, регистрами).

Выполним процедуру по шагам:

  1. Развернем наш здоровый бэкап на SQL-сервере под другим именем (например, [Healthy_Backup]).
  2. Убедимся, что все пользователи вышли из аварийной базы данных (назовем ее [Broken_Database]), и остановим службу сервера 1С:Предприятие для разрыва всех кэшированных соединений.
  3. Откроем SSMS и напишем скрипт, который полностью заменит содержимое таблицы 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С:Предприятие.

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

Способ 4. Очистка серверного и локального кэша

Иногда сама база данных в SQL уже исправлена, но платформа 1С продолжает выдавать ошибку формата потока. Это связано с тем, что скомпилированные модули и метаданные кэшируются как на стороне локального компьютера пользователя, так и на стороне сервера 1С:Предприятие.

Разберем процедуру полной очистки кэша.

Для очистки локального кэша пользователя:

Самый простой способ — удалить проблемную базу из списка запуска в окне запуска 1С и добавить ее заново под тем же адресом. При этом старый каталог кэша, привязанный к UUID базы в списке, перестает использоваться. Также можно вручную очистить содержимое папок:

%userprofile%\AppData\Local\1C\1Cv8

%userprofile%\AppData\Roaming\1C\1Cv8

Для очистки серверного кэша:

Серверный кэш хранит структуры сеансовых данных и может транслировать ошибку формата потока всем подключающимся клиентам. Чтобы очистить его:

  1. Остановим службу сервера «1С:Предприятие».
  2. Перейдем в каталог службы (по умолчанию для 64-битной платформы это C:\Program Files\1cv8\srvinfo).
  3. Найдем папку кластера (обычно она называется reg_1541).
  4. Внутри этой папки расположены каталоги с UUID-идентификаторами баз. Найдем папку нашей базы данных.
  5. Удалим внутри этой папки файлы и каталоги временных данных сеансов: snccntry.dat и папки с именем v8system. Важно: ни в коем случае не удаляйте папку 1Cv8Log, так как в ней хранится журнал регистрации базы данных!
  6. Запустим службу сервера 1С.

Способ 5. Локализация поврежденного объекта через Технологический Журнал

Что делать, если база запускается, но ошибка формата потока возникает точечно при выполнении конкретной операции (например, при проведении определенного документа или формировании отчета)? Это говорит о повреждении конкретного объекта метаданных конфигурации (например, испортилась конкретная форма или макет).

Для поиска проблемного метаданного настроим Технологический Журнал (ТЖ):

  1. В каталоге шаблонов конфигурационных файлов (по умолчанию 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.

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

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

← На главную