При интеграции конфигураций «1С:Предприятия» с помощью технологии Конвертации данных 3.0 (КД 3.0) разработчики часто сталкиваются с жестким ограничением: архитектура обмена построена вокруг Универсального формата (EnterpriseData). В отличие от старой доброй Конвертации данных 2.0, где правила описывали прямой перенос «Источник -> Приемник», в КД 3.0 схема выглядит как «Источник -> Универсальный формат -> Приемник». Такой подход гарантирует слабую связанность систем, но создает серьезную проблему, если в используемой версии формата отсутствует необходимый нам прикладной объект.
Представим ситуацию: в обеих базах (и в источнике, и в приемнике) есть нужный нам справочник (например, БрендыНоменклатуры или ВидыСкидок), но в XML-схеме EnterpriseData (XDTO-пакете) такого типа данных просто нет. Как быть в этой ситуации? Рассмотрим подробнее несколько практических, надежных и элегантных способов решения этой задачи — от простых обходных путей до использования передовых механизмов Библиотеки стандартных подсистем (БСП).
Проанализируем аналогию, прозвучавшую на форуме: если вам нужно перенести шурупы, а у вас есть только коробка с надписью «Гвозди», вы можете временно насыпать шурупы в эту коробку, перенести их и на складе получателя разложить в правильные ячейки. В КД 3.0 этот метод вполне жизнеспособен.
Суть метода заключается в том, что мы привязываем наш нетиповой справочник к любому подходящему по структуре справочнику из формата EnterpriseData. Например, мы можем использовать объект формата Справочник.КлассификаторВидовЭкономическойДеятельности или любой другой простой справочник, имеющий поля Код, Наименование и Предопределенный.
Разберем по шагам, как это настроить:
БрендыНоменклатуры. В качестве объекта формата (целевого объекта) указываем, например, Справочник.КлассификаторВидовЭкономическойДеятельности. Настраиваем сопоставление полей: Наименование -> Наименование, Код -> Код.Справочник.КлассификаторВидовЭкономическойДеятельности мы сопоставляем с реальным справочником приемника БрендыНоменклатуры.Преимущества метода:
Недостатки метода:
Более элегантным и технологичным способом передачи нетиповых данных без изменения схемы формата является использование стандартного свойства AdditionalInfo. Практически каждый объект в схеме EnterpriseData имеет предопределенное поле AdditionalInfo с типом anyType (произвольный тип). Это штатная «лазейка», оставленная разработчиками фирмы «1С» специально для нестандартных сценариев интеграции.
Этот метод идеально подходит, если ваш отсутствующий в формате справочник логически связан с каким-то другим, типовым объектом. Например, справочник БрендыНоменклатуры выступает в качестве реквизита справочника Номенклатура.
Рассмотрим пример реализации этого подхода на уровне кода.
На стороне источника в обработчике ПКО номенклатуры (например, в событии ПриОтправкеДанных или непосредственно при заполнении свойств XDTO) мы упаковываем данные бренда в структуру и помещаем их в AdditionalInfo:
// Пример кода на стороне источника (КД 3.0 / БСП)
// В обработчике конвертации номенклатуры в данные формата
ДанныеБренда = Новый Структура;
ДанныеБренда.Вставить("Код", ДанныеИмпорта.Бренд.Код);
ДанныеБренда.Вставить("Наименование", ДанныеИмпорта.Бренд.Наименование);
ДанныеБренда.Вставить("УИД", Строка(ДанныеИмпорта.Бренд.УникальныйИдентификатор()));
// Сериализуем структуру в XML или JSON и записываем в AdditionalInfo
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеБренда);
СтрокаДанныхБренда = ЗаписьJSON.Закрыть();
// Записываем строковое представление данных в объект формата
ДанныеФормата.AdditionalInfo = СтрокаДанныхБренда;
На стороне приемника в обработчике загрузки (например, в событии ПередЗаписьюПолученныхДанных или ПослеЗагрузки для номенклатуры) мы извлекаем эти данные, программно создаем или находим нужный бренд и записываем ссылку на него в реквизит загруженной номенклатуры:
// Пример кода на стороне приемника
// Извлекаем данные из AdditionalInfo
Если ЗначениеЗаполнено(ДанныеФормата.AdditionalInfo) Тогда
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ДанныеФормата.AdditionalInfo);
СтруктураБренда = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Ищем бренд по уникальному идентификатору или коду
СсылкаНаБренд = Справочники.БрендыНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураБренда.УИД));
Если Не ЗначениеЗаполнено(СсылкаНаБренд.ПолучитьОбъект()) Тогда
// Если объект не найден, создаем новый
НовыйБренд = Справочники.БрендыНоменклатуры.СоздатьЭлемент();
НовыйБренд.Код = СтруктураБренда.Код;
НовыйБренд.Наименование = СтруктураБренда.Наименование;
НовыйБренд.УстановитьСсылкуНового(СсылкаНаБренд);
НовыйБренд.Записать();
КонецЕсли;
// Устанавливаем ссылку в реквизит объекта номенклатуры
ПолученныеДанные.Бренд = СсылкаНаБренд;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными.ЗагрузкаБренда",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Преимущества метода:
Недостатки метода:
Самым правильным, профессиональным и современным подходом является создание XDTO-расширения формата обмена. В современных версиях Библиотеки стандартных подсистем (начиная с БСП 3.1.3) этот механизм поддерживается на штатном уровне. Он позволяет расширять схему EnterpriseData собственными типами объектов, не нарушая при этом стандартную поддержку конфигурации.
Проанализируем, как устроен этот процесс:
BrandType со свойствами Key, Description).ОбменДаннымиПереопределяемый в процедуре ПриПолученииДоступныхРасширенийФормата.
Процедура ПриПолученииДоступныхРасширенийФормата(МассивРасширений) Экспорт
МассивРасширений.Добавить("http://www.yourcompany.ru/EnterpriseData/Extension/1.0");
КонецПроцедуры
Преимущества метода:
Недостатки метода:
Если отсутствующий в формате справочник фактически выполняет роль дополнительной аналитики для других объектов (например, «Сезонность» у номенклатуры), можно использовать штатный механизм БСП — Дополнительные реквизиты и сведения.
В EnterpriseData этот механизм отлично поддерживается по умолчанию. Данные дополнительных реквизитов автоматически выгружаются в коллекцию AdditionalProperties (Дополнительные свойства) объектов формата. На стороне приемника БСП сама распределит эти значения по соответствующим элементам ПВХ ДополнительныеРеквизитыИСведения.
Для реализации этого метода вам вообще не придется писать код в правилах обмена — достаточно выполнить пользовательские настройки состава дополнительных реквизитов в обеих базах.
Выбор оптимального способа зависит от ваших задач и сложности переносимых данных: