Внезапное отключение электропитания, сбой сети или зависание компьютера во время обновления конфигурации 1С — это классический кошмар любого администратора и разработчика. В процессе реструктуризации базы данных транзакция записи метаданных обрывается на полуслове. При следующей попытке запустить систему пользователи сталкиваются с тем, что Конфигуратор сообщает о «пустой конфигурации», а при попытке открыть дерево метаданных выдает критическую «Ошибка формата потока».
В этой статье мы подробно разберем, почему возникает эта проблема, что происходит с таблицами базы данных в этот момент, и рассмотрим несколько эффективных способов реанимации системы как для клиент-серверного (SQL), так и для файлового вариантов работы.
Для того чтобы понять логику восстановления, проанализируем внутреннее устройство хранения конфигурации в СУБД. В любой базе данных 1С (будь то MS SQL, PostgreSQL или файловый вариант .1CD) метаданные хранятся в виде бинарных данных в специальных системных таблицах. Наиболее важными для нас являются:
Когда мы запускаем процесс обновления (динамическое обновление или принятие изменений), платформа 1С создает в таблице Config служебную запись. В поле имени файла (которое в SQL-таблице называется FileName) записывается маркер «commit». Наличие этой записи сигнализирует платформе о том, что транзакция обновления находится в процессе выполнения. Если в этот момент сервер или компьютер разработчика экстренно выключается, маркер «commit» остается заблокированным в таблице в поврежденном или незавершенном состоянии. При следующем запуске платформа видит этот флаг незавершенной транзакции и блокирует доступ к конфигурации, выдавая ошибку формата потока.
---
Если ваша база данных работает под управлением Microsoft SQL Server или PostgreSQL, это самый надежный и быстрый способ исправления ситуации. Нам потребуется удалить ту самую зависшую запись транзакции напрямую через консоль СУБД.
Важно: Перед выполнением любых операций с таблицами базы данных на уровне SQL в обязательном порядке сделайте резервную копию базы средствами СУБД (создайте .bak-файл или дамп PostgreSQL)!
Разберем по шагам процесс очистки таблиц для MS SQL Server:
SELECT *
FROM dbo.Config
WHERE FileName = 'commit';
Если запрос вернул строку, значит, гипотеза подтвердилась: авария произошла ровно в момент фиксации изменений. Теперь нам нужно избавиться от этой блокирующей записи, выполнив команду удаления:
DELETE
FROM dbo.Config
WHERE FileName = 'commit';
После успешного выполнения этого запроса попробуйте открыть базу данных в режиме Конфигуратора. Очень часто этого простого действия достаточно, чтобы вернуть систему к жизни: платформа проигнорирует сорванное обновление и загрузит последнее стабильное состояние конфигурации.
Если ошибка формата потока сохраняется, велика вероятность, что повреждения затронули также таблицу редактируемой конфигурации. В этом случае мы можем полностью очистить временную таблицу изменений, выполнив запрос:
TRUNCATE TABLE dbo.ConfigSave;
После очистки таблицы ConfigSave конфигурация вернется к своему исходному («чистому») состоянию до начала злополучного обновления, и вы сможете заново начать процесс модификации метаданных.
---
Платформа 1С:Предприятие имеет встроенные скрытые механизмы самовосстановления. Мало кто знает, но у исполняемого файла платформы есть специальный параметр запуска из командной строки, предназначенный для отката незавершенных транзакций обновления метаданных.
Рассмотрим, как запустить этот процесс:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /F "ПутьКБазеДанных" /N "ИмяАдминистратора" /P "Пароль" /IBRestoreIntegrity
Если база данных серверная, то вместо ключа /F используйте ключ соединения с сервером /S:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /S "ИмяСервера\ИмяБазы" /N "ИмяАдминистратора" /P "Пароль" /IBRestoreIntegrity
При запуске с ключом /IBRestoreIntegrity платформа в фоновом режиме анализирует структуру базы данных на наличие оборванных сессий реструктуризации, автоматически удаляет поврежденные служебные записи (включая пресловутый «commit») и восстанавливает согласованность конфигурации базы данных.
---
Рассмотрим более сложную ситуацию: база данных SQL повреждена настолько сильно, что очистка записи «commit» не помогает, а Конфигуратор по-прежнему отказывается запускаться, сообщая об ошибке формата потока. При этом у вас нет свежей резервной копии всей базы, но есть вчерашний архив или тестовая копия с точно такой же структурой конфигурации.
В этом случае мы можем спасти актуальные данные пользователей (справочники, документы, регистры), которые хранятся в пользовательских таблицах, просто перенеся рабочую («здоровую») конфигурацию из копии в поврежденную базу на уровне СУБД. Разберем этот алгоритм:
Test_Base_Copy.Work_Base_Broken).
DELETE FROM [Work_Base_Broken].[dbo].[Config];
Теперь скопируем двоичные данные здоровой конфигурации из архивной базы в рабочую напрямую одним запросом:
INSERT INTO [Work_Base_Broken].[dbo].[Config]
SELECT * FROM [Test_Base_Copy].[dbo].[Config];
После выполнения данного переноса структура метаданных в вашей рабочей базе станет полностью корректной и идентичной архивной копии. Попробуйте запустить Конфигуратор рабочей базы — он должен открыться штатно. Все документы и проводки, введенные пользователями за последний день, останутся в целости и сохранности.
---
Что делать, если база данных файловая, и у нас нет прямого доступа к SQL-серверу для выполнения запросов? Для файловых баз существуют свои эффективные инструменты.
Утилита Tool_1CD — это известная в сообществе разработчиков программа для прямого чтения и редактирования файлов баз данных 1С формата .1CD без использования самой платформы. С её помощью мы можем провести те же манипуляции, что и в SQL:
1Cv8.1CD.Tool_1CD.Config в списке таблиц базы данных.FileName записано значение «commit», и удалите эту строку.Не пренебрегайте стандартным инструментом проверки физической целостности файлов баз данных. Утилита chdbfl.exe находится в каталоге установленной платформы (в папке bin вашей версии платформы, например: C:\Program Files\1cv8\8.3.23.1688\bin\chdbfl.exe).
Запустите утилиту, укажите путь к файлу вашей поврежденной базы данных, установите флаг «Исправлять обнаруженные ошибки» и нажмите кнопку «Выполнить». Зачастую аварийное завершение работы компьютера повреждает заголовки файловых таблиц на уровне дисковой системы, и эта утилита успешно справляется с их ремонтом.
---
Иногда «Ошибка формата потока» бывает ложной. Сама база данных на сервере или диске может быть абсолютно исправна, но локальные временные файлы (кэш метаданных) на компьютере конкретного пользователя забиваются мусором в момент сбоя. Прежде чем приступать к операциям удаления таблиц в SQL, обязательно выполните очистку кэша:
%USERPROFILE%\AppData\Local\1C\1cv8%USERPROFILE%\AppData\Roaming\1C\1cv8После удаления этих директорий запустите систему. Если ошибка была вызвана локальным кэшем, база откроется без каких-либо дополнительных манипуляций.
Проанализировав все представленные методы, мы видим, что даже при полном отсутствии актуального бэкапа базы данных, восстановить работоспособность 1С после сбоя при обновлении вполне возможно. Главное — четко понимать структуру хранения метаданных и последовательно применять инструменты СУБД или утилиты восстановления файлов.