Ошибка «Нарушена целостность структуры конфигурации» в 1С 8.3 значит, что платформа не может прочитать конфигурацию: ту, что хранится в базе, или её копию в кэше на компьютере пользователя. Документы и справочники лежат в других таблицах, поэтому данные почти всегда целы — главное не испортить их лечением. Ниже: как понять, что повреждено, порядок восстановления от безопасных шагов к радикальным, пакетный скрипт и код 1С для диагностики и страховки.
Конфигурация лежит в базе в двух экземплярах. Основную редактирует и сохраняет конфигуратор. С конфигурацией базы данных работают пользователи, а основная попадает в неё командой «Конфигурация → Обновить конфигурацию базы данных» (F7) вместе с реструктуризацией таблиц. Третья копия — кэш на каждом компьютере. Оборвалась запись любой из них (сбой питания, снятый процесс, обрыв сети) — получаем эту ошибку. В клиент-серверной базе конфигурация хранится в служебных таблицах Config, ConfigSave и родственных; править их запросами SQL не нужно.
| Когда появилась | Что повреждено | С чего начать |
|---|---|---|
| У одного-двух пользователей, у остальных база открывается | кэш на их компьютерах | шаг 1 |
| Пользователи работают, а конфигуратор не открывает конфигурацию | основная конфигурация | шаг 4 |
| У всех после прерванного обновления: F7, установка обновления, обновление из программы на БСП | конфигурация БД и структура таблиц | шаг 3 |
| Файловая база после сбоя питания или обрыва сети | файл 1Cv8.1CD | шаг 5 |
| Только при загрузке конкретного cf-файла | сам файл: недокачан или обрезан | взять файл заново |
С той же причиной бывают и другие сообщения. «Обнаружена ошибка целостности структуры конфигурации. Исправить?» — шаг 2. «Обнаружена незавершенная операция сохранения конфигурации» (или «…обновления конфигурации БД»), «Обнаружена незавершенная операция конвертации структуры конфигурации» и «При обновлении данных после последней реструктуризации произошла критическая ошибка» — шаг 3.
Если база перестала открываться после динамического обновления конфигурации, порядок действий другой — см. ошибка динамического обновления 1С.
Идите сверху вниз и останавливайтесь, как только база заработала: каждый следующий шаг рискованнее предыдущего.
До любых исправлений сделайте копию: у файловой базы — весь каталог с 1Cv8.1CD, когда в ней никого нет, у клиент-серверной — резервную копию средствами СУБД. На выгрузку в dt не рассчитывайте: она читает конфигурацию и на повреждённой базе может не пройти. А тестирование с исправлением, по справке платформы, необратимо.
Если ошибка не у всех, закройте 1С у пострадавшего и запустите базу с ключом /ClearCache: окно запуска → «Изменить…» → «Дополнительные параметры запуска». Не помогло — удалите целиком папку %LOCALAPPDATA%\1C\1cv8\<ID базы>, в ней лежит и кэш конфигурации. Подробности, в том числе для терминального сервера, — в статье «Кэш сервера 1С». Если ошибка у всех сразу, кэш обычно ни при чём.
Вместо ошибки конфигуратор может спросить «Обнаружена ошибка целостности структуры конфигурации. Исправить?». Отвечайте «Да» только после шага 0, а затем проверьте результат: сравните конфигурацию с последним сохранённым cf («Конфигурация → Сравнить конфигурации») и выполните тестирование из шага 5.
Если нарушена целостность структуры конфигурации при обновлении, которое не дошло до конца, запустите конфигуратор в пакетном режиме с ключом /IBRestoreIntegrity (скрипт ниже). Ключ есть с 8.3.9 и предназначен ровно для этого — обновления, оборванного падением конфигуратора или выключением компьютера: структура восстанавливается, конфигуратор закрывается, остальные команды игнорируются. Код возврата 0 — структура цела или восстановлена, 1 — восстановление не удалось, подробности в файле /Out. Пользователей на это время уберите из базы — см. «Блокировка базы 1С». В 8.3.27 похожая команда есть и у ibcmd: infobase config repair завершает или отменяет незавершённую операцию с конфигурацией.
Признак — пользователи работают, а конфигуратор нет. Сначала сохраните то, с чем работают пользователи: «Конфигурация → Конфигурация базы данных → Сохранить конфигурацию БД в файл». Затем «Конфигурация → Конфигурация базы данных → Вернуться к конфигурации БД» — основная станет её копией. Правки, которые успели сохранить, но не применили к базе, пропадут: ищите их в хранилище или у разработчика. В пакетном режиме это ключи /DumpDBCfg и /RollbackCfg.
Файловую базу сначала проверьте утилитой chdbfl.exe из каталога bin платформы: укажите «Имя файла БД», включите «Исправлять обнаруженные ошибки» и нажмите «Выполнить», база в это время не должна быть открыта. Затем в конфигураторе «Администрирование → Тестирование и исправление» в монопольном режиме: «Только тестирование», флажок «Проверка логической целостности информационной базы», при установленных расширениях — «Проверка логической целостности расширений конфигурации». Прочитайте отчёт и только потом запускайте исправление. Подробно о галочках — в статье «Тестирование и исправление базы 1С».
Если конфигурация БД не читается, её заменяют исправной копией, а данные остаются текущими. Откуда взять cf:
/ConfigurationRepositoryDumpCfg (без -v — последняя версия). Подключённую к хранилищу базу перед загрузкой отключите (/ConfigurationRepositoryUnbindCfg -force без авторизации в хранилище отключает только локально), а после подключите снова. Подробнее — «Хранилище конфигурации 1С 8.3».%APPDATA%\1C\1cv8\tmplts\1c\<конфигурация>\<версия>\1Cv8.cf той же версии, что в базе.Загрузка — «Конфигурация → Загрузить конфигурацию из файла», затем F7. В окне «Реорганизация информации» прочитайте список до кнопки «Принять»: удалённый объект или реквизит — это данные, которые реструктуризация сотрёт. Так типовой cf, загруженный в доработанную базу, уничтожает данные доработок. Видите лишнее — «Отказ».
Крайний случай: повреждены и конфигурация, и данные, а тестирование не помогло. Всё, что ввели после копии, придётся вводить заново.
Скрипт проходит шаги 3–6 без окон и складывает журналы в один каталог. Платформа на компьютере нужна той же версии, что и сервер:
@echo off
rem repair-cfg.cmd - диагностика после ошибки "Нарушена целостность структуры конфигурации".
rem Перед запуском: копия базы (бэкап СУБД или каталог файловой базы), вход в базу закрыт.
rem Имя и пароль администратора базы не храните в файле, задайте их перед запуском:
rem set V8USER=...
rem set V8PWD=...
rem Если в базе нет пользователей, уберите из RUN ключи /N и /P.
rem Файл сохраните в ANSI или UTF-8 без BOM.
setlocal
set V8="C:\Program Files\1cv8\8.3.27.1786\bin\1cv8.exe"
set IB=/S "srv01\trade"
rem Файловая база: set IB=/F "D:\Bases\Trade"
set OUT=D:\1c-repair\trade
set RUN=start "" /wait %V8% DESIGNER %IB% /N "%V8USER%" /P "%V8PWD%" /DisableStartupDialogs /DisableStartupMessages
if not exist "%OUT%" mkdir "%OUT%"
rem 1. Восстановление структуры после прерванного обновления конфигурации БД.
rem Другие команды в этом запуске игнорируются. 0 - структура цела или восстановлена.
%RUN% /IBRestoreIntegrity /Out "%OUT%\1-restore.log"
echo 1. IBRestoreIntegrity: %ERRORLEVEL%
rem 2. Какой экземпляр конфигурации читается: конфигурация БД и основная.
%RUN% /DumpDBCfg "%OUT%\db.cf" /Out "%OUT%\2-dbcfg.log"
echo 2. DumpDBCfg: %ERRORLEVEL%
%RUN% /DumpCfg "%OUT%\main.cf" /Out "%OUT%\3-cfg.log"
echo 3. DumpCfg: %ERRORLEVEL%
rem 3. Только тестирование логической целостности базы и расширений: ничего не исправляет.
%RUN% /IBCheckAndRepair -LogIntegrity -ConfigurationExtensionsLogIntegrity -TestOnly /Out "%OUT%\4-test.log"
echo 4. IBCheckAndRepair: %ERRORLEVEL%
rem 4. По результатам раскомментируйте нужное.
rem Основная конфигурация повреждена, конфигурация БД цела - вернуться к конфигурации БД:
rem %RUN% /RollbackCfg /Out "%OUT%\5-rollback.log"
rem Конфигурация БД не читается - загрузить проверенный cf и обновить конфигурацию БД:
rem %RUN% /LoadCfg "%OUT%\good.cf" /UpdateDBCfg /Out "%OUT%\5-load.log"
endlocal
Как читать результат: /DumpDBCfg прошёл, а /DumpCfg упал — повреждена основная конфигурация, раскомментируйте /RollbackCfg. Упал /DumpDBCfg — повреждена конфигурация БД, нужен исправный cf из шага 6. Оба прошли, а у пользователей ошибка осталась — возвращайтесь к кэшу.
Команда обработки показывает, отличается ли основная конфигурация от конфигурации БД, у кого открыт конфигуратор и подключаются ли расширения. Запускайте до и после обновления: отчёт попадёт и в журнал регистрации.
// Модуль формы обработки «Состояние конфигурации», команда ПроверитьКонфигурацию.
// Запускайте под администратором: без права «Активные пользователи» список сеансов недоступен.
// Отчёт пишется и в журнал регистрации, чтобы сравнить состояние до и после обновления.
&НаКлиенте
Процедура ПроверитьКонфигурацию(Команда)
Отчет = Новый ТекстовыйДокумент;
Отчет.УстановитьТекст(СостояниеКонфигурации());
Отчет.Показать("Состояние конфигурации");
КонецПроцедуры
&НаСервереБезКонтекста
Функция СостояниеКонфигурации()
Строки = Новый Массив;
Система = Новый СистемнаяИнформация;
Строки.Добавить(СтрШаблон("Конфигурация: %1, версия %2", Метаданные.Синоним, Метаданные.Версия));
Строки.Добавить(СтрШаблон("Платформа: %1, режим совместимости: %2",
Система.ВерсияПриложения, Метаданные.РежимСовместимости));
// Изменения сохранены в основную конфигурацию, но не перенесены в конфигурацию БД:
// обновление не запускали или оно оборвалось
Если КонфигурацияИзменена() Тогда
Строки.Добавить("! Основная конфигурация отличается от конфигурации БД");
КонецЕсли;
Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда
Строки.Добавить("! Конфигурация БД обновлена динамически, сеансы нужно перезапустить");
КонецЕсли;
// Открытый конфигуратор - первый подозреваемый, если сохранение или обновление оборвётся
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
Если Сеанс.ИмяПриложения = "Designer" Тогда
Строки.Добавить(СтрШаблон("! Открыт конфигуратор: компьютер %1, с %2",
Сеанс.ИмяКомпьютера, Формат(Сеанс.НачалоСеанса, "ДЛФ=DT")));
КонецЕсли;
КонецЦикла;
// Расширения и проблемы их применения к текущей конфигурации
Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
Строки.Добавить(СтрШаблон("Расширение %1, версия %2, активно: %3",
Расширение.Имя, Расширение.Версия, Формат(Расширение.Активно, "БЛ=нет; БИ=да")));
КонецЦикла;
Для Каждого Проблема Из РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех() Цикл
Строки.Добавить(СтрШаблон("! %1 (%2): %3",
Проблема.Расширение.Имя, Проблема.Важность, Проблема.Описание));
КонецЦикла;
Текст = СтрСоединить(Строки, Символы.ПС);
ЗаписьЖурналаРегистрации("Обслуживание.СостояниеКонфигурации",
УровеньЖурналаРегистрации.Информация, , , Текст);
Возврат Текст;
КонецФункции
Обработка сохраняет основную конфигурацию и конфигурацию БД в cf, не выгоняя пользователей. Функцию ВыполнитьКонфигуратор можно вызывать и с командами из скрипта: например, /IBRestoreIntegrity для повреждённой базы из любой рабочей. Для поля «Пароль» включите режим пароля.
// Модуль формы внешней обработки «Снимок конфигурации». Тонкий клиент, платформа 8.3.18+.
// Сохраняет основную конфигурацию и конфигурацию БД в cf; монопольный режим не нужен.
// Реквизиты обработки: База - строка вида /S "srv01\trade" или /F "D:\Bases\Trade";
// Пользователь и Пароль (пусто - вход по учётной записи Windows); Каталог для снимков.
// Конфигуратор запускается на этом компьютере: нужна полная установка платформы версии сервера.
&НаКлиенте
Асинх Процедура СнимокКонфигурации(Команда)
Если ПустаяСтрока(Объект.База) Или ПустаяСтрока(Объект.Каталог) Тогда
ПоказатьПредупреждение(, "Заполните реквизиты «База» и «Каталог»");
Возврат;
КонецЕсли;
Каталог = Объект.Каталог + "\" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm") + "\";
Ждать СоздатьКаталогАсинх(Каталог);
Результат = Ждать ВыполнитьКонфигуратор("/DumpCfg """ + Каталог + "main.cf""", Каталог + "main.log");
Если Результат.КодВозврата = 0 Тогда
Результат = Ждать ВыполнитьКонфигуратор("/DumpDBCfg """ + Каталог + "db.cf""", Каталог + "db.log");
КонецЕсли;
Если Результат.КодВозврата = 0 Тогда
ПоказатьОповещениеПользователя("Снимок конфигурации сохранён", , Каталог);
Иначе
Журнал = Новый ТекстовыйДокумент;
Журнал.УстановитьТекст(Результат.Журнал);
Журнал.Показать(СтрШаблон("Конфигуратор завершился с кодом %1", Результат.КодВозврата));
КонецЕсли;
КонецПроцедуры
// Запускает конфигуратор в пакетном режиме, ждёт завершения, возвращает код и журнал /Out.
&НаКлиенте
Асинх Функция ВыполнитьКонфигуратор(Знач КомандаКонфигуратора, Знач ИмяФайлаЖурнала)
КаталогПлатформы = КаталогПрограммы();
Если Не СтрЗаканчиваетсяНа(КаталогПлатформы, "\") Тогда
КаталогПлатформы = КаталогПлатформы + "\";
КонецЕсли;
Конфигуратор = Новый Файл(КаталогПлатформы + "1cv8.exe");
ЕстьКонфигуратор = Ждать Конфигуратор.СуществуетАсинх();
Если Не ЕстьКонфигуратор Тогда
ВызватьИсключение "Не найден " + Конфигуратор.ПолноеИмя + ": установлен только тонкий клиент";
КонецЕсли;
Части = Новый Массив;
Части.Добавить("""" + Конфигуратор.ПолноеИмя + """ DESIGNER " + Объект.База);
Если ЗначениеЗаполнено(Объект.Пользователь) Тогда
Части.Добавить(СтрШаблон("/N ""%1"" /P ""%2""", Объект.Пользователь, Объект.Пароль));
КонецЕсли;
// Без этих ключей запуск может остановиться на стартовом диалоге или вопросе
Части.Добавить("/DisableStartupDialogs /DisableStartupMessages");
Части.Добавить(КомандаКонфигуратора);
Части.Добавить("/Out """ + ИмяФайлаЖурнала + """");
КодВозврата = Ждать ЗапуститьПриложениеАсинх(СтрСоединить(Части, " "), , Истина);
// Журнал /Out конфигуратор пишет в UTF-8
Журнал = Новый ТекстовыйДокумент;
ФайлЖурнала = Новый Файл(ИмяФайлаЖурнала);
ЕстьЖурнал = Ждать ФайлЖурнала.СуществуетАсинх();
Если ЕстьЖурнал Тогда
Ждать Журнал.ПрочитатьАсинх(ИмяФайлаЖурнала, КодировкаТекста.UTF8);
КонецЕсли;
Возврат Новый Структура("КодВозврата, Журнал", КодВозврата, Журнал.ПолучитьТекст());
КонецФункции
Загрузка cf расширения не трогает, а развёрнутый бэкап откатывает и их. Перед восстановлением сохраните расширения в файлы, после — проверьте, что они встают на восстановленную конфигурацию. Об устройстве расширений — «Расширение конфигурации 1С».
// Общий модуль ОбслуживаниеКонфигурацииСервер (флажок «Сервер») или модуль объекта обработки.
// Код выполняется на сервере: в клиент-серверной базе каталог должен быть на сервере 1С,
// а у учётной записи службы - права на запись в него.
// Сохраняет все расширения в cfe-файлы и опись extensions.txt. Возвращает их количество.
Функция СохранитьРасширения(Знач Каталог) Экспорт
Разделитель = ПолучитьРазделительПути();
Если Не СтрЗаканчиваетсяНа(Каталог, Разделитель) Тогда
Каталог = Каталог + Разделитель;
КонецЕсли;
СоздатьКаталог(Каталог);
Опись = Новый Массив;
Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
Расширение.ПолучитьДанные().Записать(Каталог + Расширение.Имя + ".cfe");
// Опись пригодится при восстановлении: что было активно и в каком безопасном режиме
Опись.Добавить(СтрШаблон("%1; версия %2; активно %3; безопасный режим %4",
Расширение.Имя, Расширение.Версия, Расширение.Активно, Расширение.БезопасныйРежим));
КонецЦикла;
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(СтрСоединить(Опись, Символы.ПС));
Текст.Записать(Каталог + "extensions.txt", КодировкаТекста.UTF8);
Возврат Опись.Количество();
КонецФункции
// Загружает расширение из cfe: обновляет одноимённое или добавляет новое.
// Возвращает проблемы применения к текущей конфигурации, пустой массив - всё в порядке.
// Запись расширений в безопасном режиме запрещена: запускайте под администратором.
Функция ЗагрузитьРасширение(Знач ИмяФайла, Знач ВБезопасномРежиме = Истина) Экспорт
Данные = Новый ДвоичныеДанные(ИмяФайла);
Новое = РасширенияКонфигурации.Создать(Данные); // имя и версия берутся из файла
Найденные = РасширенияКонфигурации.Получить(Новый Структура("Имя", Новое.Имя));
Если Найденные.Количество() = 0 Тогда
Расширение = Новое;
Расширение.БезопасныйРежим = ВБезопасномРежиме;
Иначе
Расширение = Найденные[0]; // у существующего безопасный режим не меняем
КонецЕсли;
Расширение.Записать(Данные);
Проблемы = Новый Массив;
Для Каждого Проблема Из РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех() Цикл
Если Проблема.Расширение.Имя = Расширение.Имя Тогда
Проблемы.Добавить(СтрШаблон("%1: %2", Проблема.Важность, Проблема.Описание));
КонецЕсли;
КонецЦикла;
Возврат Проблемы;
КонецФункции
/IBRestoreIntegrity безопасно запускать всегда: если восстанавливать нечего, конфигуратор просто завершится./DumpDBCfg и /DumpCfg — дешёвый способ понять, какой экземпляр конфигурации не читается.start "" /wait дожидается конфигуратора и кладёт его код возврата в %ERRORLEVEL%./DisableStartupMessages гасит стартовый вопрос «Конфигурация базы данных не соответствует сохраненной конфигурации. Продолжить?»: после прерванного обновления основная конфигурация как раз не совпадает с конфигурацией БД.КонфигурацияИзменена() доступна на сервере и в толстом клиенте, поэтому вызов вынесен в &НаСервереБезКонтекста.ЗапуститьПриложениеАсинх(…, Истина) ждёт завершения и возвращает код. На сервере ЗапуститьПриложение вызывает исключение, поэтому конфигуратор запускаем с клиента.РасширенияКонфигурации.Создать(Данные) ничего не записывает, но даёт имя расширения из файла: по нему решаем, обновлять существующее или добавлять новое.ПроверитьВозможностьПримененияВсех() значит, что расширение не подключится: после загрузки старого cf оно может ссылаться на объекты, которых там нет.Обычно нет: повреждена конфигурация, а документы и справочники хранятся отдельно. Данные теряют при лечении, когда разворачивают старый бэкап поверх рабочей базы или загружают cf без своих объектов.
Если в режиме 1С:Предприятие всё открывается, пользователи работают с конфигурацией БД, и она читается. Но ничего не сохраняйте и не обновляйте, пока не пройдёте шаг 4.
Загрузка dt создаёт таблицы базы заново и иногда снимает физические повреждения. Но выгрузке нужно прочитать конфигурацию и все данные: на повреждённой базе она может не пройти, а на большой идёт часами. Это вариант после шагов 3–5, а не вместо них.
ИБП на сервере и у разработчика; файловую базу, с которой работают по сети, — в клиент-серверный вариант или за веб-сервер; снимок конфигурации и резервная копия базы перед каждым обновлением; доработки — в хранилище или в расширениях. И не прерывайте обновление, даже если кажется, что оно зависло.
Если база не открывается ни в одном режиме, свежей копии нет или после загрузки cf пропали данные доработок, не экспериментируйте на единственном экземпляре базы. Опишите, что делали перед ошибкой, приложите журналы /Out и разместите задачу на площадке: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.