При обновлении сложных конфигураций, таких как 1С:Управление производственным предприятием (УПП) 1.3, специалисты иногда сталкиваются с редкой, но критической проблемой: предопределенные элементы начинают «жить своей жизнью». Представьте ситуацию: программный код обращается к элементу ОплатаПоСреднемуОтпКалендарныеДни, но платформа возвращает совершенно другой объект, например, Доля районного коэффициента. Это происходит из-за разрыва внутренней связи между метаданными и записями в таблицах базы данных.
В этой статье мы подробно разберем, почему возникают такие сбои, как программно восстановить привязку имен и что делать, если при попытке исправления система выдает пугающую ошибку Microsoft OLE DB Driver for SQL Server: Не удалось вставить значение NULL в столбец _DisplacedCKLineNo.
Предопределенные элементы в 1С — это не просто записи в базе. Это объекты, у которых есть жесткая связь между их GUID (уникальным идентификатором в таблице) и Именем, прописанным в конфигураторе. Платформа хранит эти соответствия в специальных системных таблицах. При масштабных обновлениях или сбоях в процессе реструктуризации (особенно при переходе между релизами платформы 8.3.24, 8.3.25 и 8.3.26) эта связь может нарушиться.
Ситуация осложняется тем, что в Планах видов расчета (ПВР) данные хранятся в нескольких связанных таблицах: основные данные, таблицы вытеснения, таблицы базовых и ведущих видов расчета. Если идентификатор «поплыл» в одной из них, это вызывает цепную реакцию ошибок в СУБД.
Если мы обнаружили, что предопределенный элемент ссылается не туда, первым делом попробуем восстановить его программно. Начиная с версии платформы 8.3.3, у объектов появилось свойство ИмяПредопределенныхДанных, которым можно манипулировать из кода.
Разберем алгоритм действий:
Рассмотрим пример кода для реализации этой задачи:
// 1. Очищаем имя у ошибочного элемента
ОбъектОшибочный = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Доля районного коэфф...").ПолучитьОбъект();
Если ОбъектОшибочный <> Неопределено Тогда
ОбъектОшибочный.ОбменДанными.Загрузка = Истина;
ОбъектОшибочный.ИмяПредопределенныхДанных = "";
ОбъектОшибочный.Записать();
КонецЕсли;
// 2. Устанавливаем имя правильному элементу
ОбъектПравильный = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("НужныйКод").ПолучитьОбъект();
Если ОбъектПравильный <> Неопределено Тогда
ОбъектПравильный.ОбменДанными.Загрузка = Истина;
ОбъектПравильный.ИмяПредопределенныхДанных = "ОплатаПоСреднемуОтпКалендарныеДни";
ОбъектПравильный.Записать();
КонецЕсли;
Важное примечание: использование ОбменДанными.Загрузка = Истина критически важно, так как это позволяет обойти стандартные проверки платформы на уникальность имен предопределенных данных в момент записи.
Часто при попытке применить изменения в Плане видов расчета или сохранить конфигурацию после программной правки возникает ошибка: Не удалось вставить значение NULL в столбец "_DisplacedCKLineNo", таблицы "_CKinds2_DisplacedCKNG". Проанализируем ситуацию: этот столбец отвечает за порядковый номер строки в списке вытесняющих видов расчета.
Причина ошибки кроется в «мусорных» записях в таблице вытеснения. Платформа пытается пересчитать индексы и порядковые номера, но натыкается на записи, для которых не может определить родительский объект или последовательность. Чтобы решить эту проблему без прямого вмешательства в SQL, выполним следующие шаги:
ВытесняющиеВидыРасчета.Этот метод заставляет платформу полностью перезаписать строки в таблице _DisplacedCKNG, удаляя некорректные записи с NULL значениями.
Если программные методы и очистка вытеснения не помогают, а тестирование и исправление выдает ошибки, проанализируем радикальный, но эффективный способ — перенос через XML. Этот метод позволяет «пересобрать» объект в чистой среде.
Выполним следующие действия:
При такой загрузке платформа создает записи «с нуля», корректно прописывая все внутренние идентификаторы и системные поля в таблицах SQL, что устраняет проблему с _DisplacedCKLineNo.
Чтобы избежать подобных ситуаций при обновлении на релизы 8.3.24 - 8.3.26, придерживаемся следующих правил:
DBCC CHECKDB на уровне SQL-сервера, чтобы убедиться в отсутствии физических повреждений индексов.ОбновлениеПредопределенныхДанных в свойствах конфигурации. Иногда установка значения «Автоматически» и последующий запуск базы в режиме /ОбновитьКонфигурациюИБ помогает системе самостоятельно сопоставить ссылки.Используя предложенные методы, мы можем восстановить работоспособность базы данных без потери информации и необходимости полного отката к старым бэкапам.