При настройке интеграции между системами 1С на базе универсального формата обмена EnterpriseData разработчики часто сталкиваются с ситуацией, когда в типовом XDTO-пакете формата отсутствует нужный вид документа (например, ЗаказНаПроизводство). При этом конфигурация-приемник 1С:ERP находится на официальной поддержке, и вносить изменения в основную конфигурацию крайне нежелательно.
Разберем архитектурные подходы и технические решения, которые позволяют решить данную задачу с сохранением типовой конфигурации на полной поддержке.
Формат EnterpriseData основан на строгих XDTO-пакетах, а логика сериализации и десериализации описывается в рамках технологии КД 3.0. В типовых решениях алгоритмы конвертации вынесены в общий модуль МенеджерОбменаЧерезУниверсальныйФормат (или версионные модули, например МенеджерОбменаЧерезУниверсальныйФормат_1_11).
Если произвольно отправить XML-элемент, не описанный в XDTO-схеме пакета, платформа 1С выбросит исключение еще на этапе проверки схемы до вызова программных обработчиков загрузки. Поэтому передача нестандартных объектов требует одного из корректных путей реализации.
Платформа 1С:Предприятие 8.3 позволяет дорабатывать механизмы обмена через расширения конфигурации без модификации основной конфигурации.
Рассмотрим по шагам реализацию данного варианта:
МенеджерОбменаЧерезУниверсальныйФормат.&Вместо, &После или &ИзменениеИКонтроль переопределяются правила обработки данных (ПОД) и правила конвертации объектов (ПКО).Посмотрим на пример переопределения обработчика загрузки данных в модуле расширения:
&После("ПриКонвертацииДанныхXDTO")
Процедура Расш1_ПриКонвертацииДанныхXDTO(КомпонентыОбмена, ДанныеXDTO, ПолученныеДанные)
Если ДанныеXDTO.Тип().Имя = "Документ.ЗаказНаПроизводство" Тогда
// Формируем целевой объект в базе-приемнике
ДокументОбъект = Документы.ЗаказНаПроизводство.СоздатьДокумент();
ДокументОбъект.Дата = ДанныеXDTO.Дата;
ДокументОбъект.Номер = ДанныеXDTO.Номер;
ДокументОбъект.Организация = ПолученныеДанные.Организация;
// Заполняем табличную часть и реквизиты
ПолученныеДанные = ДокументОбъект;
КонецЕсли;
КонецПроцедуры
В Библиотеке стандартных подсистем (БСП) предусмотрен штатный механизм переопределения правил конвертации данных без внесения изменений в метаданные. В форме настройки синхронизации данных доступна загрузка внешних правил из файла.
Разберем логику работы этого метода:
.epf).При этом весь код модуля менеджера обмена подменяется алгоритмами из подключенной внешней обработки. Основная конфигурация остается типовой.
Если нет возможности дорабатывать XDTO-пакет, передачу произвольных структур данных можно организовать через типовые строковые контейнеры формата EnterpriseData, например узел AdditionalInfo (дополнительная информация) или строковые дополнительные реквизиты.
Проанализируем шаги реализации:
ЗаказНаПроизводство сериализуется в формат JSON или XML-строку и помещается в узел AdditionalInfo типового документа (или фиктивного объекта обмена, максимально близкого по смыслу).ПриКонвертацииДанныхXDTO или ПослеЗагрузкиВсехДанных) строка извлекается и десериализуется встроенными объектами платформы ЧтениеJSON или ЧтениеXML.Посмотрим на пример разбора сериализованных данных в обработчике загрузки:
Если Не ПустаяСтрока(ДанныеXDTO.AdditionalInfo) Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ДанныеXDTO.AdditionalInfo);
СтруктураЗаказа = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Если СтруктураЗаказа.Свойство("ТипОбъекта") И СтруктураЗаказа.ТипОбъекта = "ЗаказНаПроизводство" Тогда
НовыйЗаказ = Документы.ЗаказНаПроизводство.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДатаСеанса();
НовыйЗаказ.Комментарий = "Загружено из EnterpriseData: " + СтруктураЗаказа.НомерИсходный;
// Заполнение остальных реквизитов из структуры
НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЕсли;
При выборе варианта реализации обратим внимание на следующие технические ограничения:
.epf) могут потребовать повторной адаптации, тогда как модуль расширения легче поддерживать при помощи директивы &После.