При обмене данными между различными конфигурациями с помощью Конвертации данных 2.0 часто возникает проблема: стандартные механизмы сериализации ссылаются на внутренние идентификаторы (CLSID) объектов метаданных. Если конфигурации отличаются, эти идентификаторы не совпадают, что делает прямую передачу ОписаниеТипов невозможной. Рассмотрим, как решить эту задачу, избегая ошибок и обеспечивая корректный перенос состава типов.
Основная сложность заключается в том, что ОписаниеТипов внутри себя содержит ссылки на типы, которые имеют уникальный идентификатор в рамках конкретной базы. При попытке перенести этот объект «как есть» через ЗначениеВСтрокуВнутр, база-приемник не сможет сопоставить переданный код с собственными метаданными. Вместо этого нам нужно передавать метаданные типа как текстовое описание, которое мы сможем интерпретировать в приемнике.
Для решения задачи мы будем использовать механизмы XMLТипЗнч и ИзXMLТипа. Суть метода заключается в преобразовании типа в «имя типа» и «пространство имен», которые являются константными для одинаковых объектов в разных конфигурациях.
Рассмотрим по шагам, как реализовать экспорт типа из источника:
Пример кода для выгрузки (в обработчике Перед выгрузкой или в параметрах):
ЗначениеТипа = Источник.ТипЗначения.ПривестиЗначение(Неопределено);
ХМЛТип = XMLТипЗнч(ЗначениеТипа);
// Сериализуем структуру XMLТипа в строку
СтрокаДляПередачи = ЗначениеВСтрокуВнутр(ХМЛТип);
Параметры.Вставить("Типы", СтрокаДляПередачи);
После того как мы передали строковое представление, нам необходимо в базе-приемнике корректно восстановить объект ОписаниеТипов. Мы используем метод ИзXMLТипа, который позволяет по имени типа и URI пространства имен найти соответствующий объект метаданных в текущей конфигурации.
Реализация в обработчике После загрузки:
// Получаем строку из параметров
ПолученноеЗначение = ПараметрыОбъекта.Получить("Типы");
ЗначениеТипа = ЗначениеИзСтрокиВнутр(ПолученноеЗначение);
// Восстанавливаем тип
Типы = Новый Массив;
Тип = ИзXMLТипа(ЗначениеТипа.ИмяТипа, ЗначениеТипа.URIПространстваИмен);
Типы.Добавить(Тип);
// Формируем финальное ОписаниеТипов
Объект.ТипЗначения = Новый ОписаниеТипов(Типы);
Если задача требует более гибкой настройки или передачи дополнительных характеристик (например, квалификаторов строк или чисел), мы можем использовать метод создания собственных узлов в XML-файле обмена. Это позволяет напрямую манипулировать структурой данных при выгрузке.
Для реализации в Конвертации данных можно использовать следующий программный подход:
УзелИД = СоздатьУзел("ТипаЗначение");
УстановитьАтрибут(УзелИД, "ЗначениеТипа", ЗначениеТипа);
УзелДобавить = УзелИД;
ДобавитьПодчиненный(Приемник, УзелДобавить);
При реализации обмена всегда учитывайте следующие моменты:
ОписаниеТипов включает в себя ЧисловыеКвалификаторы, СтроковыеКвалификаторы и КвалификаторыДаты. Если их не учитывать, после загрузки вы можете получить тип данных без ограничений по длине или точности, что приведет к ошибкам при записи объекта.СправочникСсылка.Номенклатура) совпадают в обеих конфигурациях. Если имена разные, вам потребуется дополнительная таблица соответствий (маппинг), чтобы преобразовывать одно имя в другое перед созданием объекта ОписаниеТипов.Проанализировав эти подходы, вы сможете создать надежный механизм переноса настроек ПВХ (План видов характеристик) или любых реквизитов с типом ОписаниеТипов между базами, даже если они были разработаны независимо друг от друга.