При настройке обмена данными между двумя конфигурациями «Управление торговлей» с использованием правил, созданных в Конвертации данных 2.1 (КД 2.1), программисты часто сталкиваются с системными ошибками в модулях БСП (Библиотеки стандартных подсистем). Одной из наиболее труднодиагностируемых является ошибка при записи в регистр сведений СоответствияОбъектовИнформационныхБаз. Рассмотрим ситуацию, когда обмен успешно переносит большинство объектов, но «спотыкается» на справочниках, добавленных через расширения конфигурации.
Проанализируем текст ошибки, который выдает система. Основная проблема локализована в модуле набора записей регистра СоответствияОбъектовИнформационныхБаз. Код пытается обратиться к свойству УникальныйИдентификатор у переменной, которая на момент вызова уже не является объектом ссылочного типа или типом УникальныйИдентификатор.
Ошибка выглядит следующим образом:
ЭтотОбъект[0]["УникальныйИдентификаторИсточникаСтрокой"] = Строка(ЭтотОбъект[0]["УникальныйИдентификаторИсточника"].УникальныйИдентификатор);
...
по причине: Значение не является значением объектного типа (УникальныйИдентификатор)
Выясним причину: в типовых механизмах БСП поле УникальныйИдентификаторИсточника может содержать либо сам объект идентификатора, либо ссылку. Если при загрузке данных из XML-пакета система не смогла правильно десериализовать тип данных (например, вместо объекта UUID пришла обычная строка), попытка вызвать метод .УникальныйИдентификатор() приведет к аварийному завершению транзакции.
Одной из скрытых причин некорректной передачи типов данных является различие в режимах совместимости между базой-источником и базой-приемником. Разберем, как это влияет на обмен:
Рекомендация: Убедитесь, что обе базы работают на идентичных или максимально близких версиях платформы и имеют одинаковый режим совместимости в свойствах конфигурации.
Чтобы понять, какой именно объект вызывает сбой, необходимо использовать механизм остановки по ошибке. Рассмотрим последовательность действий:
Когда отладчик остановится на строке кода в регистре СоответствияОбъектовИнформационныхБаз, проанализируйте содержимое переменной ЭтотОбъект[0]. Если в поле УникальныйИдентификаторИсточника находится строка, похожая на "00000000-0000-0000-0000-000000000000" или просто текст, значит, правила КД 2.1 передают данные некорректно или в базе-источнике объект имеет поврежденную ссылку.
Если ошибка повторяется для конкретного справочника из расширения, попробуем изменить логику поиска объекта. В Конвертации данных по умолчанию часто включен поиск по уникальному идентификатору. Рассмотрим альтернативный подход:
Наименование или Код (предварительно убедившись, что они уникальны).Это позволит системе сопоставить объекты по текстовым полям, не обращаясь к программным методам преобразования УИД в модулях БСП, которые вызывают ошибку.
Посмотрим на процесс выгрузки метаданных. Часто разработчики выгружают метаданные основной конфигурации через обработку MD82Exp.epf, забывая, что объекты расширений требуют особого внимания.
Важные моменты:
Проанализируем ситуацию, когда в приемнике уже создана некорректная запись сопоставления. Если для региона «Москва» в регистре СоответствияОбъектовИнформационныхБаз уже записана «битая» ссылка или пустой УИД, обмен будет падать постоянно.
Попробуйте выполнить следующие действия в базе-приемнике:
СоответствияОбъектовИнформационныхБаз через «Все функции» (или «Функции для технического специалиста»).Если вы имеете возможность редактировать расширение в базе-приемнике, можно добавить «защитный» код в модуль набора записей регистра соответствий. Рассмотрим пример кода, который предотвратит падение системы:
Процедура ПередЗаписью(Отказ, Замещение)
Для Каждого Запись Из ЭтотОбъект Цикл
// Проверяем, является ли значение УИД объектом, прежде чем брать его свойство
Если ТипЗнч(Запись.УникальныйИдентификаторИсточника) = Тип("УникальныйИдентификатор") Тогда
Запись.УникальныйИдентификаторИсточникаСтрокой = Строка(Запись.УникальныйИдентификаторИсточника);
ИначеЕсли ТипЗнч(Запись.УникальныйИдентификаторИсточника) = Тип("Строка") Тогда
Запись.УникальныйИдентификаторИсточникаСтрокой = Запись.УникальныйИдентификаторИсточника;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Резюме: Основной причиной ошибки является передача строкового представления УИД вместо объекта типа УникальныйИдентификатор, что часто связано с рассинхронизацией режимов совместимости платформ или спецификой работы объектов в расширениях. Переход на поиск по наименованию и выравнивание версий платформ обычно решают эту проблему.