При настройке обмена данными через «1С:Конвертацию данных 3.0» на базе универсального формата EnterpriseData разработчики часто сталкиваются с ситуацией, когда в конфигурации-источнике присутствует специфический объект (например, Справочник.МойСправочник), аналогов которому в стандартной XDTO-схеме формата попросту нет.
Разберем основные архитектурные подходы решения этой задачи: от штатного расширения формата XDTO до передачи данных внутри служебных полей типовых объектов.
Наиболее правильным и поддерживаемым способом по стандартам разработки 1С является создание собственного пакета расширения XDTO. Это позволяет не снимать типовой формат с поддержки и корректно формировать валидные XML-сообщения.
Разберем процесс реализации по шагам:
http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8/custom. В директивах импорта подключаем базовую схему EnterpriseData и описываем структуру нового типа данных (все необходимые свойства и типы реквизитов).ОбменДаннымиПереопределяемый:
Процедура ПриПолученииДоступныхРасширенийФормата(РасширенияФормата) Экспорт
// Регистрируем соответствие версии базового формата и нашего пространства имен
НоваяСтрока = РасширенияФормата.Добавить();
НоваяСтрока.ВерсияФормата = "1.8";
НоваяСтрока.ПространствоИмен = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8/custom";
КонецПроцедуры
ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(
ПравилоКонвертации,
"http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8/custom"
);
СинхронизацияДанныхЧерезУниверсальныйФормат) и настроить правила регистрации данных (ПРД), иначе изменения не будут попадать в очередь выгрузки.Если расширять XDTO-схему нецелесообразно (например, требуется быстрое решение или справочник простой), можно задействовать существующий, но не используемый в вашем обмене типовой тип XDTO (например, Справочник.ЗначенияСвойствОбъектов или общий служебный тип).
Чтобы избежать коллизий при чтении в базе-приемнике, проанализируем маршрутизацию в правилах обработки данных (ПОД):
ДополнительнаяИнформация или наименование), указывая строковый маркер исходного типа — "Справочник.МойСправочник".
// Проверяем признак принадлежности к нашему нестандартному справочнику
Если ДанныеXDTO.Свойство("ДополнительнаяИнформация")
И ДанныеXDTO.ДополнительнаяИнформация = "Справочник.МойСправочник" Тогда
ИмяПКО = "Справочник_МойСправочник_Получение";
Иначе
ИмяПКО = "Справочник_ЗначенияСвойствОбъектов_Получение";
КонецЕсли;
Еще один гибкий вариант без доработки XDTO-схемы — передача структуры справочника в виде текстовой строки формата JSON внутри типового поля ДополнительнаяИнформация или через типовую табличную часть ДополнительныеРеквизиты базового объекта.
Рассмотрим логику работы:
ЗаписьJSON и помещаем строку в доступное текстовое свойство сообщения.ПослеЗагрузки или ПриКонвертацииДанныхXDTO) десериализуем строку обратно в структуру и программно создаем либо обновляем элемент нетипового справочника:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ДанныеXDTO.ДополнительнаяИнформация);
ДанныеОбъекта = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Выполняем поиск или создание элемента справочника
СсылкаНаОбъект = Справочники.МойСправочник.НайтиПоРеквизиту("Идентификатор", ДанныеОбъекта.Идентификатор);
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
ОбъектСправочника = Справочники.МойСправочник.СоздатьЭлемент();
Иначе
ОбъектСправочника = СсылкаНаОбъект.ПолучитьОбъект();
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОбъектСправочника, ДанныеОбъекта);
ОбъектСправочника.Записать();
Проанализируем критерии выбора подхода для вашего проекта: