В практике администраторов и разработчиков 1С нередко встречается ситуация, когда при попытке обновить конфигурацию информационной базы, особенно после её переноса из клиент-серверного варианта (SQL) в файловый, возникает критическая ошибка. Текст ошибки гласит: «Ошибка СУБД: Ошибка SQL: Запись значения NULL в поле, не допускающее NULL». Далее обычно указывается идентификатор поля, например, _FLD755.
На первый взгляд кажется странным видеть упоминание SQL в файловой базе данных (формат .1CD), однако это вполне логично. Внутренний движок файловой базы 1С использует библиотеку SDBL, которая работает по принципам реляционных баз данных и накладывает аналогичные ограничения на целостность данных. Разберем подробно, почему возникает эта ошибка и как её устранить.
Ошибка записи NULL в поле, которое его не поддерживает, чаще всего возникает в процессе реструктуризации таблиц. Это происходит, когда в конфигурации добавляется новый реквизит или меняется тип существующего, а платформа пытается заполнить новые колонки в существующих записях базы данных. Если в процессе переноса данных из SQL (где настройки полей могут быть менее строгими) возникли «битые» ссылки или неопределенные значения, файловый движок при реструктуризации может не справиться с их автоматической обработкой.
Проанализируем основные факторы, провоцирующие проблему:
Как показывает практика, зачастую проблема кроется в конфликте новых механизмов платформы со старой структурой данных. Рассмотрим, как это исправить:
Откроем конфигурацию в режиме Конфигуратор. Перейдем в свойства корневого узла конфигурации и найдем параметр Режим совместимости. Если вы обновляете базу и возникла ошибка, попробуем временно вернуть режим совместимости к той версии, на которой база работала стабильно (например, 8.3.8). После этого выполним команду Конфигурация – Обновить конфигурацию базы данных (или нажмем F7). Если обновление прошло успешно, можно попробовать повышать режим совместимости ступенчато, принимая изменения на каждом этапе.
Чтобы понять, какой именно объект метаданных вызывает сбой, нам нужно выяснить, какому реквизиту принадлежит поле, указанное в ошибке (например, _FLD755). Выясним это с помощью встроенных средств платформы.
Создадим внешнюю обработку и воспользуемся методом ПолучитьСтруктуруХраненияБазыДанных(). Рассмотрим пример кода, который выведет информацию о таблицах и полях в текстовое сообщение или таблицу значений:
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураХранения Цикл
Для Каждого Поле Из Таблица.Поля Цикл
Если Поле.ИмяПоляСУБД = "_FLD755" Тогда
Сообщить("Поле найдено в таблице: " + Таблица.ИмяТаблицы);
Сообщить("Объект метаданных: " + Таблица.Метаданные);
Сообщить("Имя реквизита: " + Поле.ИмяРеквизита);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если стандартный метод не находит поле, это может означать, что оно принадлежит системной таблице (например, таблице итогов или регистрации изменений). В этом случае проанализируем ситуацию с помощью сторонних инструментов.
Рассмотрим использование специализированной утилиты Tool_1CD. Вопреки распространенному мнению, современные версии этой программы (Alpha-версии) отлично работают с форматами платформы 8.3.
Tool_1CD и откроем файл нашей базы данных 1Cv8.1CD.NULL там, где платформа ожидает значение (например, пустую ссылку или 0), это и есть причина сбоя.cnvdbfl.exe, которая находится в папке bin установленной платформы.Пример команды для конвертации базы в формат, совместимый со старыми инструментами:
cnvdbfl -c -f 8.2.14 "C:\PathToBase\1Cv8.1CD"
Перед любыми манипуляциями с кодом или режимами совместимости обязательно проверим файл базы данных на физические повреждения. Рассмотрим стандартную утилиту chdbfl.exe:
C:\Program Files\1cv8\8.3.13.1513\bin).chdbfl.exe.1Cv8.1CD.Это позволит устранить ошибки в индексах и заголовках таблиц, которые часто становятся причиной некорректной интерпретации значений NULL.
Если ни один из методов не помог, а база небольшого объема, разберем радикальный, но эффективный способ — пересоздание структуры базы с нуля. Для этого используем обработку «Универсальный обмен данными в формате XML».
Схема действий следующая:
При таком подходе платформа заново сформирует все записи в таблицах, и вместо «кривых» значений NULL будут записаны корректные пустые значения (пустые ссылки, пустые строки, нули), соответствующие типам данных 1С. Это гарантированно очистит базу от «мусора», пришедшего из SQL-версии.
Чтобы в будущем не сталкиваться с подобными проблемами при миграции баз между SQL и файловым вариантом, придерживайтесь следующих правил:
.dt. Убедитесь, что установлены флаги «Проверка логической целостности» и «Очищать объекты при наличии битых ссылок».Резюме: Ошибка записи NULL — это сигнал о несоответствии структуры данных ожиданиям платформы. В большинстве случаев она успешно решается возвратом к предыдущему режиму совместимости или исправлением структуры через chdbfl.exe.