При активной разработке или внесении правок в базу данных 1С программисты нередко сталкиваются с ситуацией, когда конфигуратор блокирует сохранение или обновление базы, выдавая сообщение: «Нарушена целостность структуры конфигурации». При этом пользователи могут продолжать работу в обычном режиме, но применить любые последующие доработки (даже незначительные изменения в модулях) становится невозможно.
Разберем природу возникновения этой ошибки, выясним, почему стандартная очистка локального кэша не всегда дает результат, и подробно рассмотрим шаги по восстановлению нормальной работы базы данных с помощью SQL-запросов и служебных утилит платформы.
Проанализируем цепочку событий, приводящих к нарушению целостности структуры метаданных:
rphost аварийно перезапустился или принудительно оборвал сеансы, транзакция фиксации изменений в системных таблицах СУБД остается незавершенной.ConfigSave и служебных маркерах. При сбое платформенный кэш DynamicalWorkCache теряет соответствие с реальным содержимым базы данных.Config и Params. В таблице Params хранится специальная бинарная запись DBNames, сопоставляющая внутренние идентификаторы (GUID) метаданных 1С с именами таблиц и полей в СУБД. Если данные в Config откатились или повредились, а в DBNames остались ссылки на несуществующие метаданные (или наоборот), платформа выдает фатальную ошибку целостности.Перед началом низкоуровневых манипуляций полезно зафиксировать точный момент ошибки. Для этого настроим технологический журнал (файл logcfg.xml в каталоге conf платформы 1С), указав отдельный пустой каталог для логов:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="C:\1C_Logs\TechLog" history="24">
<event>
<eq property="name" value="excp"/>
</event>
<event>
<eq property="name" value="excpcntx"/>
</event>
<property name="all"/>
</log>
</config>
В логах технологического журнала на клиенте или сервере вы сможете увидеть исключения вида ClientFileCacheImpl с указанием на каталог DynamicalWorkCache, а также ошибку Exception=Exception,Descr=Нарушена целостность структуры конфигурации. Это подтверждает конфликт закешированных метаданных с системными таблицами.
Если у вас есть свежая резервная копия базы (или копия, созданная до попытки неудачного обновления), переносить все пользовательские данные обратно не требуется. Достаточно синхронизировать служебные таблицы конфигурации в рабочей базе с эталонными данными из копии.
Важно: Все действия на сервере СУБД необходимо выполнять после создания полной резервной копии рабочей базы и при остановленной службе агента сервера 1С:Предприятия (ragent), чтобы исключить удержание старых метаданных в оперативной памяти процессов rphost.
Выполним в среде SQL Server Management Studio следующий скрипт (где erp — имя рабочей базы данных, а test — имя развернутой резервной копии базы данных до сбоя):
USE erp;
-- 1. Очищаем поврежденную конфигурацию основной базы
TRUNCATE TABLE Config;
-- 2. Переносим целостную конфигурацию из резервной копии
INSERT INTO Config SELECT * FROM test.dbo.Config;
-- 3. Очищаем таблицу несохраненных/динамических изменений
TRUNCATE TABLE ConfigSave;
-- 4. Обновляем соответствие имен метаданных DBNames из эталонной базы
UPDATE Params
SET Attributes = t1.Attributes,
BinaryData = t1.BinaryData,
Creation = t1.Creation,
DataSize = t1.DataSize,
Modified = t1.Modified,
PartNo = t1.PartNo
FROM test.dbo.Params AS t1
WHERE t1.FileName = 'DBNames' AND Params.FileName = 'DBNames';
Проанализируем, что делает этот скрипт:
Config, возвращая конфигурацию в согласованное состояние.ConfigSave, снимая состояние «конфигурация изменена, но не сохранена».DBNames в таблице Params, что устраняет фантомные ссылки на новые метаданные, из-за которых прервалась реструктуризация.Если резервной копии для подмены DBNames нет, можно принудительно удалить служебные маркеры динамического обновления и незавершенных транзакций:
USE erp;
DELETE FROM Config WHERE FileName IN ('DynamicallyUpdated', 'commit', 'dbStruFinal');
DELETE FROM Params WHERE FileName IN ('DynamicallyUpdated', 'commit', 'dbStruFinal');
После выполнения запросов на уровне SQL крайне важно сбросить кэш, иначе клиенты и сервер продолжат считывать поврежденные структуры из временных файлов:
C:\Program Files\1cv8\srvinfo\reg_xxxx\snccntx* при остановленной службе 1C:Enterprise 8.3 Server Agent.%LocalAppData%\1C\1cv8\%AppData%\1C\1cv8\Запустим службу сервера 1С. Для первого сохранения изменений рекомендуется применить обновление конфигурации базы данных в пакетном режиме с ключом -Server, который выполняет процедуру напрямую на сервере приложений без участия кэша клиентского конфигуратора:
"C:\Program Files\1cv8\8.3.10.2252\bin\1cv8.exe" DESIGNER /S "ИмяСервера\ИмяБазы" /UpdateDBCfg -Server -Dynamic- /UC "КодБлокировки"
Параметр -Dynamic- принудительно запрещает динамическое обновление, гарантируя корректную монопольную фиксацию метаданных.
После успешного завершения команды откройте базу данных в режиме Конфигуратора обычным способом. Теперь применение изменений через файл .cf или ручная правка модулей и метаданных будет проходить штатно без ошибок структуры.
tempdb и журналов транзакций (LDF) в MS SQL в момент реструктуризации является частой причиной аварийного завершения фоновых процессов 1С.