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