Каждый администратор баз данных или разработчик 1С хотя бы раз сталкивался с ситуацией, когда аварийное завершение работы компьютера, отключение электроэнергии или системный сбой во время обновления конфигурации приводили к полной блокировке базы. При попытке запустить базу как в режиме «Предприятие», так и в режиме «Конфигуратор», система выдает критическую ошибку: «Обнаружена незавершенная операция сохранения конфигурации».
В этой статье мы подробно разберем, почему возникает данная проблема, почему стандартные утилиты самодиагностики бессильны и как восстановить работоспособность базы данных с помощью специализированных инструментов. Мы рассмотрим как радикальные, так и точечные методы исправления структуры файла 1Cv8.1CD.
Для начала проанализируем внутреннее устройство файловой базы данных 1С. База представляет собой единый файл с расширением .1CD, внутри которого находится множество таблиц. Для хранения метаданных и структуры системы используются две ключевые таблицы:
CONFIG — в ней хранится основная, рабочая конфигурация базы данных, под управлением которой работают пользователи.CONFIGSAVE — в ней находится временная (редактируемая) конфигурация, которую разработчик правит в конфигураторе до нажатия клавиши F7 (обновление конфигурации базы данных).Когда вы запускаете процесс обновления конфигурации базы данных, платформа 1С переводит базу в транзакционное состояние. Чтобы зафиксировать этот переход и защитить базу от одновременных изменений, в таблицу CONFIG записываются специальные служебные строки-маркеры (флаги транзакции). После успешного завершения обновления эти маркеры автоматически удаляются.
Если в процессе записи происходит сбой (например, отключилось питание сервера, «вылетел» конфигуратор или принудительно завершили процесс через диспетчер задач), маркеры блокировки остаются в таблице CONFIG. При следующем запуске платформа считывает эти флаги, понимает, что предыдущая транзакция записи не завершилась, и блокирует любой доступ к базе во избежание разрушения данных.
Многие системные администраторы сразу пытаются запустить штатную утилиту chdbfl.exe. Однако в данном случае она абсолютно бесполезна. Физическая структура файла (страницы данных, индексы, таблицы) не повреждена. Сбой носит чисто логический характер — в таблице конфигурации просто взведены флаги незавершенной транзакции. Поскольку с точки зрения физики база здорова, chdbfl.exe выдаст отчет об отсутствии ошибок, но запустить 1С все равно не удастся.
Критически важно: перед выполнением любых описанных ниже манипуляций обязательно сделайте копию файла 1Cv8.1CD в отдельную папку! Любые низкоуровневые операции с базой данных могут необратимо повредить ее структуру при неаккуратном выполнении.
---
Этот метод является классическим и наиболее надежным, если вам нужно гарантированно открыть базу. Его суть заключается в полной замене таблиц конфигурации поврежденной базы на аналогичные таблицы из заведомо исправной копии или пустой базы того же релиза конфигурации.
Рассмотрим этот процесс пошагово:
Tool_1CD (версии 0.3.0 Alpha или более поздней, поддерживающей редактирование).Tool_1CD, которая умеет редактировать только базы формата 8.2, вам потребуется предварительно конвертировать поврежденную и чистую базы с помощью штатной утилиты конвертации:
cnvdbfl.exe -c -f 8.2.14 C:\test\1Cv8.1CD
Примечание: Современные версии утилит позволяют редактировать файлы баз данных 1С 8.3 напрямую, без конвертации. Рекомендуется использовать именно их, чтобы избежать лишних шагов.
Tool_1CD.CONFIG и CONFIGSAVE и выполните их экспорт на диск с помощью кнопки «Экспорт текущей таблицы». Вы получите два файла на диске.CONFIG и нажмите кнопку «Импорт текущей таблицы», указав ранее экспортированный файл таблицы CONFIG из чистой базы.CONFIGSAVE.Tool_1CD. Если вы выполняли конвертацию в формат 8.2, верните базу обратно в формат 8.3 аналогичной командой утилиты cnvdbfl.exe.После этого запустите конфигуратор рабочей базы. База откроется без ошибок. Недостатком данного метода является то, что если в поврежденной базе были уникальные доработки, которые вы еще не успели сохранить в архив, они заменятся типовой конфигурацией из чистой базы.
---
Этот способ более изящный и продвинутый. Он позволяет снять блокировку базы данных, сохранив при этом все ваши последние изменения в конфигурации. Вместо полной перезаписи таблиц мы удалим только те строки, которые сигнализируют системе о незавершенном обновлении.
Давайте проанализируем структуру таблицы CONFIG. Нам необходимо открыть поврежденную базу данных в утилите Tool_1CD или воспользоваться альтернативными инструментами прямой работы с базой (например, библиотеками Python или OneScript для работы с форматом 1CD).
Выполним следующие шаги:
1Cv8.1CD в редакторе таблиц.CONFIG и открываем список ее записей.FileName, которая содержит имена файлов конфигурации. Нам нужно отсортировать или отфильтровать записи по этой колонке.FileName содержатся следующие значения:commit — маркер фиксации транзакции обновления;dbStruFinal — флаг финальной перестройки структуры таблиц данных;dynamicCommit — маркер динамического обновления конфигурации;DynamicallyUpdated — флаг, указывающий на применение динамического обновления.metadata, root и т.д.) трогать нельзя!После удаления этих записей платформа 1С при запуске решит, что никаких прерванных транзакций не было. Вы сможете успешно зайти в конфигуратор базы данных. Сразу после входа рекомендуется выполнить команду «Конфигурация» — «Обновить конфигурацию базы данных» (F7) или запустить процедуру «Тестирование и исправление» для окончательного приведения метаданных в стабильное состояние.
---
Развитие сообщества разработчиков 1С не стоит на месте, и сегодня ручная конвертация баз утилитой cnvdbfl.exe для работы в старой Tool_1CD практически ушла в прошлое. Рассмотрим современные альтернативы:
# Концептуальный пример автоматического поиска и удаления маркеров блокировки
db = open_1cd_database("C:/Bases/WorkBase/1Cv8.1CD", mode="read-write")
config_table = db.get_table("CONFIG")
rows_to_delete = []
for row in config_table.select():
if row["FileName"] in ["commit", "dbStruFinal", "dynamicCommit", "DynamicallyUpdated"]:
rows_to_delete.append(row.id)
if rows_to_delete:
for row_id in rows_to_delete:
config_table.delete_row(row_id)
db.commit_changes()
print("Блокирующие маркеры успешно удалены. База разблокирована!")
else:
print("Маркеры незавершенной операции не найдены.")
Возникновение незавершенной операции сохранения конфигурации — неприятная, но полностью решаемая проблема. Главное — помнить три ключевых правила:
chdbfl.exe — в данном случае она не поможет.commit, dbStruFinal) в таблице CONFIG для сохранения ваших последних программных доработок, либо полностью импортируйте таблицы конфигурации из резервной копии того же релиза, если сохранность последних правок кода не критична.