При обновлении нетиповых или даже полностью стандартных конфигураций на платформе 1С:Предприятие 8.3 специалисты нередко сталкиваются со сбоями реструктуризации. В результате пользователи получают неработоспособную базу данных с критическими ошибками: «Обнаружена незавершенная операция сохранения конфигурации», «Ошибка формата потока» или «Файл базы данных поврежден».
В этой статье мы подробно разберем, почему возникают эти ошибки, как реанимировать поврежденный файл базы данных 1Cv8.1CD с помощью утилит низкоуровневого редактирования таблиц, а также рассмотрим, как правильно перенести документы в более ранний архивный бэкап с сохранением всех внутренних связей.
---
Прежде чем приступать к ремонту, разберем физику процесса. В файловой СУБД 1С структура метаданных (конфигурация) хранится в специальных системных таблицах внутри единого файла 1Cv8.1CD. Основными здесь являются таблицы CONFIG (где записана текущая рабочая конфигурация) и CONFIGSAVE (куда конфигуратор сохраняет промежуточные изменения до нажатия кнопки «Обновить конфигурацию базы данных»).
В процессе реструктуризации и обновления платформой выполняются следующие шаги:
CONFIGSAVE.CONFIG создаются временные служебные маркеры с именами commit, dynamicCommit и dbStruFinal, которые сигнализируют системе о начале транзакции обновления.CONFIGSAVE переносятся в CONFIG, служебные маркеры удаляются, а сама таблица CONFIGSAVE очищается.Если в процессе реструктуризации (на шагах 2 или 3) происходит аварийное завершение (выключили свет, завис ПК, заблокировал антивирус, исчерпалась оперативная память), база остается в «зависшем» промежуточном состоянии. При попытке входа система видит маркеры незавершенной транзакции и выдает ошибку: «Обнаружена незавершенная операция сохранения конфигурации».
---
Если утилита chdbfl.exe рапортует об успешном исправлении повреждений в таблицах CONFIG и CONFIGSAVE, но ошибка незавершенной операции сохранения все равно продолжает появляться, это означает, что физическая целостность файла восстановлена, но логическая структура метаданных нарушена. Рассмотрим пошаговый алгоритм решения проблемы, который помог автору темы реанимировать базу:
Перед началом любых манипуляций обязательно сделайте копию поврежденного файла 1Cv8.1CD! Каждый раз перед проверкой работоспособности базы полностью удаляйте её из списка баз в стартовом окне 1С и добавляйте заново. В противном случае платформа будет обращаться к старому кэшу базы в локальных папках пользователя, и вы будете постоянно видеть «Ошибку формата потока», даже если сама база уже исправлена.
Для прямого редактирования таблиц нам потребуется утилита Tool_1CD. Однако старые и наиболее стабильные версии этой программы (например, 0.3.1 alpha) не умеют корректно работать со структурой файлов современных версий платформ 8.3. Поэтому нам необходимо временно понизить версию формата файла базы данных.
Для этого воспользуемся встроенной в платформу утилитой cnvdbfl.exe (или автоматизируем процесс через «Обновлятор 1С»):
Выполнять конвертацию напрямую в формат 8.2.14 не рекомендуется, так как файлы баз новых релизов могут выдавать ошибку несовместимости при резком переходе через несколько поколений версий формата файлов.
Поскольку у нас есть архивный бэкап месячной давности, его конфигурация отличается от той, которая была на момент сбоя. Чтобы вернуть базу в работоспособное состояние, нам нужно взять работоспособную конфигурацию из бэкапа и внедрить её в сломанную базу. При этом все документы за последний месяц, которые уже были внесены пользователями, останутся нетронутыми в таблицах документов битой базы.
Tool_1CD. Находим таблицы CONFIG, CONFIGSAVE и таблицу поврежденного справочника (в случае автора это была _Reference73).Tool_1CD.CONFIG, CONFIGSAVE, а также поврежденный справочник _Reference73.После успешной замены таблиц преобразуем файл базы данных обратно в актуальный формат платформы 8.3 через утилиту cnvdbfl.exe. Добавляем базу в список и запускаем в режиме Конфигуратора. Программа успешно откроется и предложит завершить обновление или выполнить реструктуризацию данных. Выполняем обновление в режиме предприятия. Документы, счета и накладные за последний месяц спасены!
---
Если вы не хотите выполнять трудоемкую операцию по конвертации файлов базы «туда-обратно», существует альтернативный вариант точечного ремонта таблиц. Его можно выполнить непосредственно в файле базы данных с помощью современных HEX-редакторов или утилит, поддерживающих чтение и запись новых форматов 1Cv8.1CD.
Для восстановления логической целостности и сброса зависшей транзакции обновления достаточно выполнить два действия:
CONFIGSAVE (удалить все записи).CONFIG найти и удалить строки, в которых в колонке имени файла (FileName) содержатся служебные значения:
commitdynamicCommitdbStruFinalПосле удаления этих записей и очистки кэша платформа 1С перестанет считать конфигурацию поврежденной или находящейся в процессе обновления. Она запустится в штатном режиме, откатившись к конфигурации базы данных, которая была активна до запуска неудавшегося обновления. Все данные документов при этом не пострадают.
---
Если база данных не открывается даже в конфигураторе, выдавая ошибку формата потока, применим следующие административные меры:
/IBRestoreIntegrity: Попробуем запустить Конфигуратор через командную строку с флагом принудительного восстановления целостности. Пример команды запуска:
"C:\Program Files\1cv8\8.3.18.1211\bin\1cv8.exe" DESIGNER /F "C:\Bases\MyBase" /IBRestoreIntegrity
.cf) из чистой рабочей базы аналогичного релиза и загрузим его в поврежденную базу через меню Конфигурация — Загрузить конфигурацию из файла... (в обход стандартного процесса сравнения/объединения).---
Бывают ситуации (как у автора темы в сообщении №40), когда при запуске тестирования и исправления (на этапе реструктуризации) абсолютно все базы данных на компьютере — даже архивные бэкапы и базы других конфигураций (например, ЗУП) — начинают аварийно завершаться с ошибкой «Файл базы данных поврежден».
Выясним причины такого аномального поведения системы:
%TEMP%. Антивирусное ПО или встроенный Защитник Windows блокируют эти файлы для сканирования «на лету». Монопольный процесс записи базы прерывается, что СУБД 1С расценивает как повреждение файла. Перед запуском тяжелых процедур тестирования обязательно добавляйте папки с базами и процессы 1С в исключения антивируса либо временно отключайте его.C: должно быть свободное место, превышающее размер самой базы минимум в 2–3 раза.---
Если повреждения базы оказались слишком серьезными и запустить её не удается, единственным выходом остается перенос документов за упущенный период (например, за последний месяц) из сломанной базы в восстановленную архивную копию с помощью обработки ВыгрузкаЗагрузкаДанныхXML.epf.
Однако при обычном переносе документов «по отдельности» (например, если отдельно выгрузить только счета, а затем только платежки) внутренние связи между ними могут разорваться. В результате платежное поручение больше не будет ссылаться на счет, а реализация — на документ-основание.
Рассмотрим, как правильно настроить выгрузку, чтобы не потерять ссылочную целостность:
При использовании обработки ВыгрузкаЗагрузкаДанныхXML на этапе экспорта данных в обязательном порядке установите флаг «Выгружать связанные объекты по ссылкам» (или аналогичную настройку субконто в зависимости от версии обработки).
В этом случае при выгрузке документа «Платежное поручение» система автоматически проанализирует все его реквизиты, найдет связанный объект «Счет на оплату» и выгрузит его уникальный идентификатор (GUID). При загрузке в чистую базу 1С не просто создаст документы заново, а сохранит оригинальные GUID, благодаря чему все перекрестные ссылки восстановятся автоматически.
Проанализируем пример кода на встроенном языке 1С, который иллюстрирует, как платформа осуществляет поиск и сопоставление объектов по уникальным идентификаторам (GUID) при XML-обмене:
// Пример программного сопоставления объектов по GUID
УникальныйИдентификатор = Новый УникальныйИдентификатор(СтрокаGUIDИзФайла);
СсылкаНаДокумент = Документы.СчетНаОплатуПокупателю.ПолучитьСсылку(УникальныйИдентификатор);
// Проверяем, существует ли уже такой документ в базе данных
Если СсылкаНаДокумент.ПолучитьОбъект() = Неопределено Тогда
// Если объект не найден, создаем новый с предопределенным GUID
НовыйДокумент = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
НовыйДокумент.УстановитьСсылкуНового(СсылкаНаДокумент);
НовыйДокумент.Записать();
КонецЕсли;
Если вы уже успели загрузить документы «вразброс» без сохранения связей, исправить это можно с помощью типовой обработки «Групповое изменение реквизитов», отобрав нужные документы и массово заполнив реквизиты оснований. Если связи сложные, придется написать простую внешнюю обработку, которая найдет в базе подходящие по дате, сумме и контрагенту документы и свяжет их программно.