Как исправить ошибку «Запись значения NULL в поле, не допускающее NULL» при обновлении 1С

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При обновлении конфигурации «1С:Предприятие» пользователи и администраторы иногда сталкиваются с аварийным завершением процесса реструктуризации. Ошибка сопровождается системным сообщением вида «Ошибка SQL: Запись значения NULL в поле, не допускающее NULL '_FLD912'». При этом информационная база в режиме обычного использования функционирует без сбоев, утилита проверки файловых баз chdbfl.exe не фиксирует физических повреждений, а стандартное тестирование и исправление (ТиИ) завершается с аналогичным сбоем.

Рассмотрим подробно причины возникновения этой проблемы и разберем эффективные способы поиска и устранения некорректных данных.

Выясним причину ошибки реструктуризации

Проанализируем механизм работы платформы «1С:Предприятие» при обновлении структуры базы данных. Когда в конфигурации меняются состав реквизитов, типы данных или ограничения полей, платформа запускает процесс реструктуризации таблиц:

  1. Создается новая временная таблица информационной базы (с суффиксом NG).
  2. Данные из исходной таблицы переносятся во временную таблицу с конвертацией типов.
  3. На колонки временной таблицы накладываются ограничение СУБД NOT NULL (запрет на пустые значения NULL).

Если в исходной таблице базы данных присутствуют записи, где в конкретной колонке физически записано значение NULL (например, в результате сбоя обмена данными, битых ссылок или незавершенного прошлого обновления), СУБД отклоняет установку ограничения NOT NULL. Это приводит к откату транзакции и аварийному завершению обновления.

Поиск проблемной таблицы и реквизита

Для исправления ошибки проанализируем, к какому объекту метаданных относится физическое поле (в нашем примере — _FLD912). Воспользуемся встроенным методом ПолучитьСтруктуруХраненияБазыДанных().

Создадим внешнюю обработку или выполним фрагмент кода в отладчике для сопоставления объектов метаданных и физических таблиц хранения:


СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураБД Цикл
    Для Каждого Поле Из Таблица.Поля Цикл
        Если Поле.ИмяПоляХранения = "_FLD912" Тогда
            Сообщить("Объект метаданных: " + Таблица.ИмяМетаданных);
            Сообщить("Имя таблицы хранения: " + Таблица.ИмяТаблицыХранения);
            Сообщить("Реквизит: " + Поле.ИмяРеквизита);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

На практике выясняется, что поле _FLD912 может являться, например, реквизитом «Префикс» справочника Организации. Проанализировав записи найденного справочника, удается обнаружить невалидную строку с пустым кодом или незаполненными реквизитами, появившуюся из-за косяка при синхронизации данных (например, обмена с БГУ). После удаления или корректировки поврежденной записи обновление успешно завершается.

Способы решения ошибки

Рассмотрим несколько проверенных способов решения проблемы в зависимости от характера повреждений и условий работы информационной базы.

Способ 1. Исправление некорректных данных в режиме «1С:Предприятие»

После того как проблемный объект метаданных найден с помощью ПолучитьСтруктуруХраненияБазыДанных(), выполним следующие действия:

  1. Откроем соответствующий справочник или регистр в режиме «1С:Предприятие».
  2. Включим отображение служебных колонок в списке (Код, Наименование, Префикс и т.д.).
  3. Найдем битые строки (элементы с надписью «Объект не найден», либо пустые фантомные записи).
  4. Удалим некорректные записи или корректно заполним пустые поля.

Способ 2. Выгрузка и загрузка данных через XML

Если поиск битых записей вручную затруднен, применим механизм переноса данных через XML:

  1. Создадим пустую информационную базу той же конфигурации и того же релиза.
  2. Воспользуемся обработкой «Выгрузка и загрузка данных XML».
  3. Выгрузим данные из проблемной базы и загрузим их в пустую базу. Механизм XML-обмена пропустит битые физические ссылки и сформирует корректные таблицы без NULL, после чего обновление пройдет без ошибок.

Способ 3. Прямая коррекция через СУБД (клиент-серверный режим)

Если информационная база работает в клиент-серверном режиме (MS SQL Server или PostgreSQL), проанализируем и исправим данные напрямую SQL-запросами:

  1. Найдем проблемные строки в физической таблице: SELECT * FROM _ReferenceX WHERE _FLD912 IS NULL
  2. Обновим значения NULL на пустую строку или удалим битые записи: UPDATE _ReferenceX SET _FLD912 = '' WHERE _FLD912 IS NULL
  3. Запустим обновление конфигурации повторно.

Таким образом, сочетание точечной диагностики через ПолучитьСтруктуруХраненияБазыДанных() и очистки битых объектов позволяет полностью устранить ошибку реструктуризации и успешно обновить базу 1С.

← На главную