Как исправить неверную ссылку на предопределенный элемент и устранить ошибку СУБД DisplacedCKLineNo

Программист 1С v8.3 (Обычные формы)
← На главную

При обновлении сложных конфигураций, таких как 1С:Управление производственным предприятием (УПП) 1.3, специалисты иногда сталкиваются с редкой, но критической проблемой: предопределенные элементы начинают «жить своей жизнью». Представьте ситуацию: программный код обращается к элементу ОплатаПоСреднемуОтпКалендарныеДни, но платформа возвращает совершенно другой объект, например, Доля районного коэффициента. Это происходит из-за разрыва внутренней связи между метаданными и записями в таблицах базы данных.

В этой статье мы подробно разберем, почему возникают такие сбои, как программно восстановить привязку имен и что делать, если при попытке исправления система выдает пугающую ошибку Microsoft OLE DB Driver for SQL Server: Не удалось вставить значение NULL в столбец _DisplacedCKLineNo.

Анализируем причину разрыва связи

Предопределенные элементы в 1С — это не просто записи в базе. Это объекты, у которых есть жесткая связь между их GUID (уникальным идентификатором в таблице) и Именем, прописанным в конфигураторе. Платформа хранит эти соответствия в специальных системных таблицах. При масштабных обновлениях или сбоях в процессе реструктуризации (особенно при переходе между релизами платформы 8.3.24, 8.3.25 и 8.3.26) эта связь может нарушиться.

Ситуация осложняется тем, что в Планах видов расчета (ПВР) данные хранятся в нескольких связанных таблицах: основные данные, таблицы вытеснения, таблицы базовых и ведущих видов расчета. Если идентификатор «поплыл» в одной из них, это вызывает цепную реакцию ошибок в СУБД.

Решение 1: Программное восстановление Имени предопределенных данных

Если мы обнаружили, что предопределенный элемент ссылается не туда, первым делом попробуем восстановить его программно. Начиная с версии платформы 8.3.3, у объектов появилось свойство ИмяПредопределенныхДанных, которым можно манипулировать из кода.

Разберем алгоритм действий:

  1. Найдем «неправильный» элемент (тот, на который сейчас ошибочно указывает ссылка) и очистим у него признак предопределенности.
  2. Найдем «правильный» элемент (тот, который должен быть предопределенным) и назначим ему нужное имя.

Рассмотрим пример кода для реализации этой задачи:


// 1. Очищаем имя у ошибочного элемента
ОбъектОшибочный = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Доля районного коэфф...").ПолучитьОбъект();
Если ОбъектОшибочный <> Неопределено Тогда
    ОбъектОшибочный.ОбменДанными.Загрузка = Истина;
    ОбъектОшибочный.ИмяПредопределенныхДанных = "";
    ОбъектОшибочный.Записать();
КонецЕсли;

// 2. Устанавливаем имя правильному элементу
ОбъектПравильный = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("НужныйКод").ПолучитьОбъект();
Если ОбъектПравильный <> Неопределено Тогда
    ОбъектПравильный.ОбменДанными.Загрузка = Истина;
    ОбъектПравильный.ИмяПредопределенныхДанных = "ОплатаПоСреднемуОтпКалендарныеДни";
    ОбъектПравильный.Записать();
КонецЕсли;

Важное примечание: использование ОбменДанными.Загрузка = Истина критически важно, так как это позволяет обойти стандартные проверки платформы на уникальность имен предопределенных данных в момент записи.

Решение 2: Борьба с ошибкой СУБД в таблицах вытеснения

Часто при попытке применить изменения в Плане видов расчета или сохранить конфигурацию после программной правки возникает ошибка: Не удалось вставить значение NULL в столбец "_DisplacedCKLineNo", таблицы "_CKinds2_DisplacedCKNG". Проанализируем ситуацию: этот столбец отвечает за порядковый номер строки в списке вытесняющих видов расчета.

Причина ошибки кроется в «мусорных» записях в таблице вытеснения. Платформа пытается пересчитать индексы и порядковые номера, но натыкается на записи, для которых не может определить родительский объект или последовательность. Чтобы решить эту проблему без прямого вмешательства в SQL, выполним следующие шаги:

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

Этот метод заставляет платформу полностью перезаписать строки в таблице _DisplacedCKNG, удаляя некорректные записи с NULL значениями.

Решение 3: Перенос данных через XML

Если программные методы и очистка вытеснения не помогают, а тестирование и исправление выдает ошибки, проанализируем радикальный, но эффективный способ — перенос через XML. Этот метод позволяет «пересобрать» объект в чистой среде.

Выполним следующие действия:

  1. Используем обработку «Выгрузка и загрузка данных XML».
  2. Выгрузим только нужные элементы Плана видов расчета из архивной (исправной) копии базы данных.
  3. В текущей базе удалим проблемные элементы (предварительно заменив ссылки на них во всех документах с помощью обработки «Поиск и замена значений»).
  4. Загрузим данные из XML в текущую базу.

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

Рекомендации по профилактике

Чтобы избежать подобных ситуаций при обновлении на релизы 8.3.24 - 8.3.26, придерживаемся следующих правил:

Используя предложенные методы, мы можем восстановить работоспособность базы данных без потери информации и необходимости полного отката к старым бэкапам.

← На главную