Как исправить ошибку «Значение не является значением объектного типа (УникальныйИдентификатор)» при обмене данными через КД 2.1?

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

При настройке обмена данными между двумя конфигурациями «Управление торговлей» с использованием правил, созданных в Конвертации данных 2.1 (КД 2.1), программисты часто сталкиваются с системными ошибками в модулях БСП (Библиотеки стандартных подсистем). Одной из наиболее труднодиагностируемых является ошибка при записи в регистр сведений СоответствияОбъектовИнформационныхБаз. Рассмотрим ситуацию, когда обмен успешно переносит большинство объектов, но «спотыкается» на справочниках, добавленных через расширения конфигурации.

Анализ причины возникновения ошибки

Проанализируем текст ошибки, который выдает система. Основная проблема локализована в модуле набора записей регистра СоответствияОбъектовИнформационныхБаз. Код пытается обратиться к свойству УникальныйИдентификатор у переменной, которая на момент вызова уже не является объектом ссылочного типа или типом УникальныйИдентификатор.

Ошибка выглядит следующим образом:


ЭтотОбъект[0]["УникальныйИдентификаторИсточникаСтрокой"] = Строка(ЭтотОбъект[0]["УникальныйИдентификаторИсточника"].УникальныйИдентификатор);
...
по причине: Значение не является значением объектного типа (УникальныйИдентификатор)

Выясним причину: в типовых механизмах БСП поле УникальныйИдентификаторИсточника может содержать либо сам объект идентификатора, либо ссылку. Если при загрузке данных из XML-пакета система не смогла правильно десериализовать тип данных (например, вместо объекта UUID пришла обычная строка), попытка вызвать метод .УникальныйИдентификатор() приведет к аварийному завершению транзакции.

Шаг 1. Проверка режима совместимости и версии платформы

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

  1. Сериализация данных: Разные версии платформы (например, переход с 8.3.16 на 8.3.18) могут по-разному формировать XML-структуру для типов данных из расширений.
  2. Типизация в расширениях: Если справочник «Регионы» находится в расширении, платформа должна четко понимать, к какому метаданному относится передаваемый УИД. При несовпадении версий или режимов совместимости объект может быть прочитан как «Строка», а не как «УникальныйИдентификатор».

Рекомендация: Убедитесь, что обе базы работают на идентичных или максимально близких версиях платформы и имеют одинаковый режим совместимости в свойствах конфигурации.

Шаг 2. Использование отладчика для выявления «битых» данных

Чтобы понять, какой именно объект вызывает сбой, необходимо использовать механизм остановки по ошибке. Рассмотрим последовательность действий:

  1. Запустите базу-приемник в режиме конфигуратора.
  2. В меню «Отладка» выберите пункт «Остановка по ошибке».
  3. Установите флажок «Останавливаться по ошибке» (включая ошибки в фоновом задании, если обмен идет через регламентные задания).
  4. Запустите процесс загрузки данных.

Когда отладчик остановится на строке кода в регистре СоответствияОбъектовИнформационныхБаз, проанализируйте содержимое переменной ЭтотОбъект[0]. Если в поле УникальныйИдентификаторИсточника находится строка, похожая на "00000000-0000-0000-0000-000000000000" или просто текст, значит, правила КД 2.1 передают данные некорректно или в базе-источнике объект имеет поврежденную ссылку.

Шаг 3. Корректировка правил конвертации объектов (ПКО) в КД 2.1

Если ошибка повторяется для конкретного справочника из расширения, попробуем изменить логику поиска объекта. В Конвертации данных по умолчанию часто включен поиск по уникальному идентификатору. Рассмотрим альтернативный подход:

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

Это позволит системе сопоставить объекты по текстовым полям, не обращаясь к программным методам преобразования УИД в модулях БСП, которые вызывают ошибку.

Шаг 4. Проверка регистрации метаданных расширения

Посмотрим на процесс выгрузки метаданных. Часто разработчики выгружают метаданные основной конфигурации через обработку MD82Exp.epf, забывая, что объекты расширений требуют особого внимания.

Важные моменты:

Шаг 5. Работа с регистром «Соответствия объектов информационных баз»

Проанализируем ситуацию, когда в приемнике уже создана некорректная запись сопоставления. Если для региона «Москва» в регистре СоответствияОбъектовИнформационныхБаз уже записана «битая» ссылка или пустой УИД, обмен будет падать постоянно.

Попробуйте выполнить следующие действия в базе-приемнике:

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

Пример программной проверки типа в обработчике

Если вы имеете возможность редактировать расширение в базе-приемнике, можно добавить «защитный» код в модуль набора записей регистра соответствий. Рассмотрим пример кода, который предотвратит падение системы:


Процедура ПередЗаписью(Отказ, Замещение)
    Для Каждого Запись Из ЭтотОбъект Цикл
        // Проверяем, является ли значение УИД объектом, прежде чем брать его свойство
        Если ТипЗнч(Запись.УникальныйИдентификаторИсточника) = Тип("УникальныйИдентификатор") Тогда
            Запись.УникальныйИдентификаторИсточникаСтрокой = Строка(Запись.УникальныйИдентификаторИсточника);
        ИначеЕсли ТипЗнч(Запись.УникальныйИдентификаторИсточника) = Тип("Строка") Тогда
            Запись.УникальныйИдентификаторИсточникаСтрокой = Запись.УникальныйИдентификаторИсточника;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Резюме: Основной причиной ошибки является передача строкового представления УИД вместо объекта типа УникальныйИдентификатор, что часто связано с рассинхронизацией режимов совместимости платформ или спецификой работы объектов в расширениях. Переход на поиск по наименованию и выравнивание версий платформ обычно решают эту проблему.

← На главную