Последний год я плотно занимался интеграцией в EnterpriseData и хочу поделиться основами и нюансами.
Во-первых я замечу, что дорабатывать типовые обмены в отдельном расширении довольно удобно. Во-вторых, удобно передавать новые табличные части или дополнять реквизитный состав табличных частей уже настроенных обменов, что при иных способах реализации –довольно громоздкая реализация.
Итак. Решаем следующую практическую задачу. Есть две конфигурации на поддержке между которыми уже есть настроенный обмена Синхронизация данных на основе универсального формата EnterpriseData. Возьмем, к примеру, последние конфигурации УТ11 и БП3 Демо По возможности, пытаемся всё оставить на поддержке.
Для целей иллюстрации выбрал документ «Встреча», который есть и в УТ11 и в БП3 и который мы и будем передавать из УТ11 в БП3. Важно, что во встрече есть табличная часть "Участники", которую мы и передадим из УТ11 в БП3.
Практического смысла в этой задаче особенно нет, а вот для демонстрации технологии- отличный пример. Объекта формата для данного документа Фирмой 1С для него не разработано на текущий момент. Это нам и нужно.
Разработаем синхронизацию данного документа в расширении
Регистрация объекта в плане обмена «СинхронизацияДанныхЧерезУниверсальныйФормат»
Несмотря на то, что в расширении потенциально есть возможность добавлять новые объекты регистрации- в коде типовой это не поддержано. Поэтому в данном случае, исключительно для регистрации нового документа в плане обмена – придется это сделать в основной конфигурации. Но это единственное место, где пришлось снять с поддержки и править основную конфигурацию (но только Источника).

Далее добавим расширение, в расширении нам понадобится расширить метод «ИнициализацияПравилРегистрации» модуля МенеджерРегистрации" (под спойлером)
Заимствуем также подписку на событие СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияДокумента
С регистрацией «Встречи» собственно все. Теперь можем видеть в дереве объектов для регистрации


Конфигурирование XDTO пакетов
На ИТС и на ИС уже есть несколько хороших статей по Конфигурированию настройке XDTO пакетов – например, https://its.1c.ru/db/metod8dev/content/6013/hdoc и //infostart.ru/1c/articles/944359/. Довольно подробные. Поэтому я вкратце пробегусь в начальных настройках расширения. Эта часть у всех одинаковая.
- Сначала заимствуем ExchangeMessage. Заимствуем Ref и Object

- Далее заимствуем тот формат, который планируем использовать в качестве основы обмена. Пусть это будет самый последний формат EnterpriseData_1_20_2

- Далее нам понадобится добавить XDTO пакет и указать произвольный (можно выдуманный)адрес для пространства имен. Этот адрес будет использоваться впоследствии в нашем пакете как адрес расширяемого пространства

- Для документа Встреча понадобится тип значений ДокументСсылка.Встреча типа ExchangeMessage и данная ссылка будет использоваться в объектах

- Далее делаем все по аналогии с типовыми форматами: Ключевые свойства, Реквизиты, Табличная часть, строки табличной части. Тут главное не торопиться и не путать ссылки и объекты или еще что-то.


- Ну это вкратце. Нюансы все-таки придется в отдельных статьях рассказать
Инициализация XDTO пакета расширения
Тут главное просто не забыть. В наследуемом модуле ОбменДаннымиПереопределяемый добавляем(под спойлером)
Доработка правил на стороне Источника
Доработку ведем с наследуемом модуле МенеджерОбменаЧерезУниверсальныйФормат
1.Тут все стандартно:Добавляем Правило ПОД, ПКО, дополнительные обработчики при обработке или выгрузке
2.Обратите внимание, по сравнению со стандартным методом Описания ПКО дополнительно вызывается инициализация расширения с «нашим» пространством имен ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации,EDПространствоИмен());
Под спойлером весь текст модуля(он небольшой)
Функция EDПространствоИмен() Экспорт
БПро_ПространствоИмен = "http://sstud.ru/EnterpriseData/1.20";
Возврат БПро_ПространствоИмен;
КонецФункции
&После("ЗаполнитьПравилаОбработкиДанных")
Процедура EDЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных)
Если НаправлениеОбмена = "Отправка" Тогда
EDДобавитьПОД_Документ_Встреча(ПравилаОбработкиДанных);
КонецЕсли;
КонецПроцедуры
&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура БПро_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации)
Если НаправлениеОбмена = "Отправка" Тогда
EDДобавитьПКО_Документ_Встреча_Отправка(ПравилаКонвертации);
КонецЕсли;
КонецПроцедуры
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура БПро_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры)
Если ИмяПроцедуры = "EDПОД_Документ_Встреча_Отправка_ПриОбработке" Тогда
EDПОД_Документ_Встреча_Отправка_ПриОбработке(
Параметры.ОбъектОбработки, Параметры.ИспользованиеПКО, Параметры.КомпонентыОбмена);
ИначеЕсли ИмяПроцедуры = "EDПКО_Документ_Встреча_Отправка_ПриОтправкеДанных" Тогда
EDПКО_Документ_Встреча_Отправка_ПриОтправкеДанных(
Параметры.ДанныеИБ, Параметры.ДанныеXDTO, Параметры.КомпонентыОбмена, Параметры.СтекВыгрузки);
КонецЕсли;
КонецПроцедуры
#Область Документ_Встреча
Процедура EDДобавитьПОД_Документ_Встреча(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
ПравилоОбработки.Имя = "Документ_Встреча";
ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.Встреча;
ПравилоОбработки.ПриОбработке = "EDПОД_Документ_Встреча_Отправка_ПриОбработке";
ПравилоОбработки.ОчисткаДанных = Ложь;
ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_Встреча_Отправка");
КонецПроцедуры
Процедура EDПОД_Документ_Встреча_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
КонецПроцедуры
Процедура EDДобавитьПКО_Документ_Встреча_Отправка(ПравилаКонвертации)
ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
ПравилоКонвертации.ИмяПКО = "Документ_Встреча_Отправка";
ПравилоКонвертации.ОбъектДанных = Метаданные.Документы.Встреча;
ПравилоКонвертации.ОбъектФормата = "Документ.Встреча"; //@NON-NLS-1
ПравилоКонвертации.ПриОтправкеДанных = "EDПКО_Документ_Встреча_Отправка_ПриОтправкеДанных";
ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации,EDПространствоИмен());
СвойстваШапки = ПравилоКонвертации.Свойства;
ДобавитьПКС(СвойстваШапки, "Дата", "Дата",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "ДатаНачала", "ДатаНачала",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "ДатаОкончания", "ДатаОкончания",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "Номер", "Номер",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "Тема", "Тема",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "Описание", "Описание",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "Комментарий", "Комментарий",,,EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "Ответственный", "Ответственный",1,"Справочник_Пользователи",EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "", "Контрагент",1,"Справочник_Контрагенты",EDПространствоИмен());
ДобавитьПКС(СвойстваШапки, "", "КонтактноеЛицо",1,"Справочник_КонтактныеЛицаПартнеров_Отправка",EDПространствоИмен());
СвойстваТЧ = ДобавитьПКТЧ(ПравилоКонвертации, "", "Участники",EDПространствоИмен());
ДобавитьПКС(СвойстваТЧ, "ПредставлениеКонтакта", "ПредставлениеКонтакта",1,,EDПространствоИмен());
ДобавитьПКС(СвойстваТЧ, "Контакт", "Контакт",1,,EDПространствоИмен());
ДобавитьПКС(СвойстваТЧ, "Партнер", "Партнер",,,EDПространствоИмен());
ДобавитьПКС(СвойстваТЧ, "КакСвязаться", "КакСвязаться",,,EDПространствоИмен());
КонецПроцедуры
Процедура EDПКО_Документ_Встреча_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
Если СтекВыгрузки.Количество() > 1 Тогда
Возврат;
КонецЕсли;
ТЗУчастники = ДанныеИБ.Участники.Выгрузить();
ТЗУчастники.Колонки.Добавить("Инструкция");
Для каждого Строка Из ТЗУчастники Цикл
Инструкция = Новый Структура("ИмяПКО,Значение","", Строка.Контакт);
Если ТипЗнч(Строка.Контакт) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
Инструкция.ИмяПКО = "Справочник_ФизическиеЛица_Отправка";
Строка.Инструкция = Инструкция;
ИначеЕсли ТипЗнч(Строка.Контакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда
Инструкция.ИмяПКО = "Справочник_КонтактныеЛицаПартнеров_Отправка";
Строка.Инструкция = Инструкция;
Если не ДанныеXDTO.Свойство("КонтактноеЛицо") Тогда
ДанныеXDTO.Вставить("КонтактноеЛицо", Строка.Контакт);
КонецЕсли;
ИначеЕсли ТипЗнч(Строка.Контакт) = Тип("СправочникСсылка.Партнеры") Тогда
Если не ДанныеXDTO.Свойство("Партнер") Тогда
КонтрагентВладелец = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Строка.Контакт);
ДанныеXDTO.Вставить("Контрагент", КонтрагентВладелец);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТЗУчастники.Колонки.Удалить("Контакт");
ТЗУчастники.Колонки["Инструкция"].Имя = "Контакт";
ДанныеXDTO.Вставить("Участники", ТЗУчастники);
КонецПроцедуры
#КонецОбласти
XDTO –пакет и инициализация XDTO пакета расширения в Приёмнике
Тут очень важно: нужна полная идентичность пакетов Источника и Приемника: ExchangeMessage, Наследуемомого EnterpriseData_1_20_2 и добавленного EDEnterpriseData_1_20_2_Ext. Сделать это проще всего через сравнение объединение выгруженного расширения Источника . И делать надо так каждый раз при любом изменении пакетов

Опять –таки не забываем в наследуемом модуле ОбменДаннымиПереопределяемый добавляем
EDПространствоИмен()- просто отдает выдуманный адрес нашего пространства имен(писал выше)
Доработка правил на стороне Приемника
1.Тут все стандартно:Добавляем Правило ПОД, ПКО, дополнительные обработчики при конвертации XDTO и при записи объекта
Полный текст - под спойлером(он компактный)
Проверка формата. Тестовый обмен.
Перед первой выгрузкой нужно провести тестовый обмен в обоих базах, чтобы базы инициализировали метаданные объектов Приемника и Источника. Если предыдущие шаги были сделаны правильно, то зайдя в регистр сведений НастройкиОбменаДаннымиXDTO в Источнике мы увидим наш новый объект как в текущей базе, так и в базе корреспонденте


Выгрузка.
Зарегистрируем и выгрузим документ «Встреча» и посмотрим на файл выгрузки
Так выглядит файл формата с основным и расширяемым форматом(я только Body оставил для компактности). Часть объектов типа, Все реквизиты добавленные в дополнительном расширении – идет с префиксом «ext1» , но сами объекты типа Контрагенты и Физлица – основного пакета, наследуемого основного пакета EnterpriseData_1_20_2
Результат загрузки
Как выглядит исходный и загруженный объект

И в БП3

К сожалению, форма объекта в БП3 не доделана и не видит ТЧ «Участники»- Посмотрим ТЧ редактором объекта

Выводы и планы
- Собственно, задача решена, вся доработка в расширении(кроме модификации в плане обмена Источника для целей регистрации)
- Можете скачать архив с расширениями для УТ11(11.5.22.149) БП3.0.191.41 и использовать его как шаблон. Там все полностью рабочее
- В отдельной публикации планирую остановиться на реквизитах составного типа и на передаче объекта "УдалениеОбъекта", а там есть нюансы
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.22.149
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.191.41
Вступайте в нашу телеграмм-группу Инфостарт