При обновлении конфигурации «1С:Предприятие» пользователи и администраторы иногда сталкиваются с аварийным завершением процесса реструктуризации. Ошибка сопровождается системным сообщением вида «Ошибка SQL: Запись значения NULL в поле, не допускающее NULL '_FLD912'». При этом информационная база в режиме обычного использования функционирует без сбоев, утилита проверки файловых баз chdbfl.exe не фиксирует физических повреждений, а стандартное тестирование и исправление (ТиИ) завершается с аналогичным сбоем.
Рассмотрим подробно причины возникновения этой проблемы и разберем эффективные способы поиска и устранения некорректных данных.
Проанализируем механизм работы платформы «1С:Предприятие» при обновлении структуры базы данных. Когда в конфигурации меняются состав реквизитов, типы данных или ограничения полей, платформа запускает процесс реструктуризации таблиц:
NG).NOT NULL (запрет на пустые значения NULL).Если в исходной таблице базы данных присутствуют записи, где в конкретной колонке физически записано значение NULL (например, в результате сбоя обмена данными, битых ссылок или незавершенного прошлого обновления), СУБД отклоняет установку ограничения NOT NULL. Это приводит к откату транзакции и аварийному завершению обновления.
Для исправления ошибки проанализируем, к какому объекту метаданных относится физическое поле (в нашем примере — _FLD912). Воспользуемся встроенным методом ПолучитьСтруктуруХраненияБазыДанных().
Создадим внешнюю обработку или выполним фрагмент кода в отладчике для сопоставления объектов метаданных и физических таблиц хранения:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураБД Цикл
Для Каждого Поле Из Таблица.Поля Цикл
Если Поле.ИмяПоляХранения = "_FLD912" Тогда
Сообщить("Объект метаданных: " + Таблица.ИмяМетаданных);
Сообщить("Имя таблицы хранения: " + Таблица.ИмяТаблицыХранения);
Сообщить("Реквизит: " + Поле.ИмяРеквизита);
КонецЕсли;
КонецЦикла;
КонецЦикла;
На практике выясняется, что поле _FLD912 может являться, например, реквизитом «Префикс» справочника Организации. Проанализировав записи найденного справочника, удается обнаружить невалидную строку с пустым кодом или незаполненными реквизитами, появившуюся из-за косяка при синхронизации данных (например, обмена с БГУ). После удаления или корректировки поврежденной записи обновление успешно завершается.
Рассмотрим несколько проверенных способов решения проблемы в зависимости от характера повреждений и условий работы информационной базы.
После того как проблемный объект метаданных найден с помощью ПолучитьСтруктуруХраненияБазыДанных(), выполним следующие действия:
Если поиск битых записей вручную затруднен, применим механизм переноса данных через XML:
NULL, после чего обновление пройдет без ошибок.Если информационная база работает в клиент-серверном режиме (MS SQL Server или PostgreSQL), проанализируем и исправим данные напрямую SQL-запросами:
SELECT * FROM _ReferenceX WHERE _FLD912 IS NULL
NULL на пустую строку или удалим битые записи:
UPDATE _ReferenceX SET _FLD912 = '' WHERE _FLD912 IS NULL
Таким образом, сочетание точечной диагностики через ПолучитьСтруктуруХраненияБазыДанных() и очистки битых объектов позволяет полностью устранить ошибку реструктуризации и успешно обновить базу 1С.