В процессе обновления конфигураций 1С (особенно на этапе сохранения конфигурации базы данных и реструктуризации таблиц) разработчики и администраторы нередко сталкиваются с сообщением: «В процессе обновления базы произошла критическая ошибка». В детальном описании ошибки система часто указывает на недопустимое значение NULL в определенном поле или таблице СУБД. Стандартные процедуры, такие как очистка кэша, запуск внешней утилиты chdbfl.exe или типовое тестирование и исправление, в подобной ситуации могут не приносить результата.
Разберем детально, почему возникает такая ошибка, как определить проблемный объект метаданных и как восстановить работоспособность информационной базы.
Проанализируем внутренний механизм обновления структуры базы данных. При изменении состава или свойств реквизитов платформа 1С выполняет реструктуризацию: создает новую временную таблицу целевого формата и переносит в нее данные из старой таблицы. На этом этапе могут возникнуть сложности:
NOT NULL, а в исходной таблице присутствуют записи с незаполненными полями, операция копирования прерывается аварийно.ОбменДанными.Загрузка = Истина типовые проверки модулей объектов (события ПередЗаписью и ПриЗаписи) отключаются. В базу могут попасть «полупустые» элементы, содержащие только код или наименование без обязательных системных реквизитов..1CD контролирует только физическую целостность страниц и блоков файла, но не проверяет логическую целостность и бизнес-ограничения прикладных данных.Если в окне ошибки фигурирует техническое имя поля (например, _Fld985 или _ReferenceXX), выясним, какому объекту метаданных оно принадлежит. Для сопоставления внутренних имен таблиц и полей с объектами конфигурации воспользуемся методом ПолучитьСтруктуруХраненияБазыДанных().
Рассмотрим пример программного кода для внешней обработки или консоли кода, позволяющий найти имя метаданных по техническому наименованию поля:
ТаблицаХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
ИскомоеПоле = "_Fld985";
Для Каждого СтрТаблица Из ТаблицаХранения Цикл
Для Каждого СтрПоле Из СтрТаблица.Поля Цикл
Если ВРег(СтрПоле.ИмяПоляХранения) = ВРег(ИскомоеПоле) Тогда
Сообщить("Объект метаданных: " + СтрТаблица.Имя);
Сообщить("Реквизит: " + СтрПоле.Имя);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Выяснив, в каком объекте (например, справочнике Организации или КодыОКПД) произошел сбой, проверим данные на наличие некорректных записей. Чаще всего сбой вызывают элементы, записанные без ключевых реквизитов.
Разберем по шагам алгоритм поиска и перезаписи таких объектов:
ПроверитьЗаполнение().ОбменДанными.Загрузка = Ложь. Это инициирует заполнение значений по умолчанию и выявит ошибки валидации до запуска реструктуризации.
Выборка = Справочники.Организации.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Попытка
// Отключаем режим обмена, чтобы сработали типовые проверки модуля объекта
Объект.ОбменДанными.Загрузка = Ложь;
Если Не Объект.ПроверитьЗаполнение() Тогда
Сообщить("Найден некорректный элемент: " + Объект.Ссылка + " (Код: " + Объект.Код + ")");
КонецЕсли;
Объект.Записать();
Исключение
Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Если в процессе анализа обнаружены «фантомные» или ошибочно созданные при обмене элементы, у которых заполнен только код, а остальные поля пусты, пометим их на удаление или физически удалим через процедуру удаления помеченных объектов.
Если поиск битых записей встроенными средствами затруднен, рассмотрим дополнительные варианты решения проблемы:
.cf / .cfu).После удаления незаполненных элементов справочника или их корректного дозаполнения повторим процедуру обновления конфигурации. Реструктуризация завершится в штатном режиме без критических ошибок.