Как правильно передать ОписаниеТипа между разными конфигурациями в 1С:Конвертации данных?

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

При обмене данными между различными конфигурациями с помощью Конвертации данных 2.0 часто возникает проблема: стандартные механизмы сериализации ссылаются на внутренние идентификаторы (CLSID) объектов метаданных. Если конфигурации отличаются, эти идентификаторы не совпадают, что делает прямую передачу ОписаниеТипов невозможной. Рассмотрим, как решить эту задачу, избегая ошибок и обеспечивая корректный перенос состава типов.

Разбор проблемы несовпадения идентификаторов

Основная сложность заключается в том, что ОписаниеТипов внутри себя содержит ссылки на типы, которые имеют уникальный идентификатор в рамках конкретной базы. При попытке перенести этот объект «как есть» через ЗначениеВСтрокуВнутр, база-приемник не сможет сопоставить переданный код с собственными метаданными. Вместо этого нам нужно передавать метаданные типа как текстовое описание, которое мы сможем интерпретировать в приемнике.

Решение через строковое представление XML-типа

Для решения задачи мы будем использовать механизмы XMLТипЗнч и ИзXMLТипа. Суть метода заключается в преобразовании типа в «имя типа» и «пространство имен», которые являются константными для одинаковых объектов в разных конфигурациях.

Рассмотрим по шагам, как реализовать экспорт типа из источника:

  1. Получаем тип из реквизита.
  2. Преобразуем его в XML-тип.
  3. Сериализуем полученную структуру в строку, чтобы передать ее через параметры конвертации.

Пример кода для выгрузки (в обработчике Перед выгрузкой или в параметрах):


ЗначениеТипа = Источник.ТипЗначения.ПривестиЗначение(Неопределено);
ХМЛТип = XMLТипЗнч(ЗначениеТипа);
// Сериализуем структуру XMLТипа в строку
СтрокаДляПередачи = ЗначениеВСтрокуВнутр(ХМЛТип);
Параметры.Вставить("Типы", СтрокаДляПередачи);

Восстановление описания типов в приемнике

После того как мы передали строковое представление, нам необходимо в базе-приемнике корректно восстановить объект ОписаниеТипов. Мы используем метод ИзXMLТипа, который позволяет по имени типа и URI пространства имен найти соответствующий объект метаданных в текущей конфигурации.

Реализация в обработчике После загрузки:


// Получаем строку из параметров
ПолученноеЗначение = ПараметрыОбъекта.Получить("Типы");
ЗначениеТипа = ЗначениеИзСтрокиВнутр(ПолученноеЗначение);

// Восстанавливаем тип
Типы = Новый Массив;
Тип = ИзXMLТипа(ЗначениеТипа.ИмяТипа, ЗначениеТипа.URIПространстваИмен);
Типы.Добавить(Тип);

// Формируем финальное ОписаниеТипов
Объект.ТипЗначения = Новый ОписаниеТипов(Типы);

Альтернативный подход: передача через узлы XML

Если задача требует более гибкой настройки или передачи дополнительных характеристик (например, квалификаторов строк или чисел), мы можем использовать метод создания собственных узлов в XML-файле обмена. Это позволяет напрямую манипулировать структурой данных при выгрузке.

Для реализации в Конвертации данных можно использовать следующий программный подход:


УзелИД = СоздатьУзел("ТипаЗначение");
УстановитьАтрибут(УзелИД, "ЗначениеТипа", ЗначениеТипа);
УзелДобавить = УзелИД;
ДобавитьПодчиненный(Приемник, УзелДобавить);

Важные рекомендации при работе с типами

При реализации обмена всегда учитывайте следующие моменты:

Проанализировав эти подходы, вы сможете создать надежный механизм переноса настроек ПВХ (План видов характеристик) или любых реквизитов с типом ОписаниеТипов между базами, даже если они были разработаны независимо друг от друга.

← На главную