При модификации структуры существующих метаданных (например, при добавлении нового реквизита в регистр накопления ЗаказыПокупателей в 1С:Управление торговлей 10.3) разработчики могут столкнуться со сбоем обновления конфигурации базы данных:
Ошибка SQL: Запись значения NULL в поле, не допускающее NULL '_FLD..._TYPE'
Разберем природу возникновения этой ошибки на уровне платформы и СУБД, а также пошагово рассмотрим способы ее устранения.
Проанализируем внутреннее устройство хранения данных платформы 1С:
_TYPE (бинарный дескриптор типа данных), а также поля для конкретных типов (_RTRef, _RRRef, _N, _T и др.). Поле _TYPE имеет ограничение NOT NULL.INSERT INTO ... SELECT ...._TYPE для какого-то существующего поля оказалась равной NULL) или при добавлении нового реквизита был случайно включен составной тип, операция массовой вставки завершается ошибкой СУБД.Выясним, к какому именно реквизиту относится поле, указанное в тексте ошибки (например, _FLD7470). Для этого воспользуемся функцией платформы или SQL-запросом.
В среде 1С для сопоставления полей метаданных и физических таблиц СУБД применим метод ПолучитьСтруктуруХраненияБазыДанных():
Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из Структура Цикл
Для Каждого Поле Из Стр.Поля Цикл
Если Найти(Поле.ИмяПоляХранения, "7470") > 0 Тогда
Сообщить("Таблица: " + Стр.ИмяТаблицы + " (" + Стр.ИмяТаблицыХранения + ")");
Сообщить("Реквизит: " + Поле.Имя);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Также определить проблемную таблицу можно напрямую в Microsoft SQL Server Management Studio:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%_FLD7470%';
После выявления проблемной таблицы и поля проанализируем строки, вызвавшие ошибку:
SELECT *
FROM _AccumRg12345
WHERE _FLD7470_TYPE IS NULL;
Если запрос вернул строки с NULL, необходимо восстановить корректное значение дескриптора типа (например, обновив значение через UPDATE на эталонное бинарное значение дескриптора) либо удалить битые записи, предварительно сделав полную резервную копию базы данных.
Проверим свойства добавляемого реквизита в дереве конфигурации:
ДатаРазмещения).Дата, а не составной тип с пустыми или лишними флажками.Если прямое исправление данных в SQL затруднено, воспользуемся обходным путем через файловую информационную базу:
.dt..dt в локальную файловую информационную базу. Встроенная СУБД файлового формата менее жестко обрабатывает ограничения NOT NULL при реструктуризации..dt и загрузим обратно на SQL-сервер.Реструктуризация крупных регистров накопления на рабочей базе может приводить к длительным блокировкам и пересчету итогов. Если новое поле (например, ДатаРазмещения) носит сугубо справочный или информационный характер и не используется в итогах регистра, надежнее вынести эти сведения в отдельный непериодический регистр сведений. Это позволит не изменять структуру тяжелой таблицы движений и исключит риск сбоев реструктуризации.