Каталог решений - Добавление своего нового объекта в синхронизацию данными через универсальный формат Enterprise Data

Добавление своего нового объекта в синхронизацию данными через универсальный формат Enterprise Data

Добавление своего нового объекта в синхронизацию данными через универсальный формат Enterprise Data

В наличии

Добавление своего нового объекта в синхронизацию данными через универсальный формат Enterprise Data, не снимая (или снимая) конфигурацию с поддержки.

Категория:

Описание

Итак, у нас есть "стандартный" обмен между 1С:Комплексная автоматизация 2 (2.5.10.74) и Комплексная автоматизация, редакция 1.1 (1.1.40.2), во второй конфигурации, понятно, обмен был допилен с помощью кода из УПП и КА2. Обмен работает, нужно добавить в него новый документ.

Видится два способа реализации:

1. Костыль: использовать существующий объект в качестве носителя, а свой объект цеплять к нему в AdditionalInfo. Про AdditionalInfo есть достаточное количество статей, тут выгрузка/загрузка не отличается от выгрузки/загрузки просто реквизита, можно документ сериализовать в строку любым способом либо выгружать отдельными реквизитами. Вопрос только в том, каким образом его цеплять к другому объекту и как на принимающей стороне это всё разбирать.

2. Добавление нового типа в пакет XDTO.

Второй вариант и будем рассматривать. Он имеет подварианты:

2.1 Просто добавить тип в существующий пакет. В КА1 на этом можно было бы остановиться, так как что такое поддержка, она уже не помнит, однако разрешать изменения пакета в КА2 конечно не хочется.

2.2 Напрашивается вариант добавить пакет в расширение, но, к сожалению, мы попали не в тот год, и такой маневр невозможен (как минимум, в платформе 8.3.19.1399).

2.3 Скопировать пакет, повысить версию и как-то заставить платформу использовать его

Тут я остановился на третьем варианте но внезапно, при ковырянии в коде, обнаружилось, что в КА2 есть поддержка добавления новых пакетов в обмен!

И вот у нас вариант 2.4: использование дополниельного XDTO-пакета в расширении (можно и в основной конфигурации, это гораздо проще!).

Порядок действий довольно прост:

1. Придумаем пространство имен. Пусть будет http://my.name/EnterpriseData/1.8.6.1 (тут не важно, как назовём)

2. В процедуре ОбменДаннымиПереопределяемый.ПриПолученииДоступныхРасширенийФормата(РасширенияФормата) добавим наше пространство имен:
РасширенияФормата.Вставить("http://my.name/EnterpriseData/1.8.6.1", "1.8")
второй аргумент — это версия формата, для которой используется расширение формата, у меня 1.8. Если делаем в расширении — то заимствуем эту процедуру в расширение.

3. Если мы в расширении — то нужно заимствовать в расширение все типы нашего базового пакета, которые мы собираемся использовать, это самый муторный момент:

 

Если же мы делаем это в основной конфигурации, то этот шаг пропускаем — именно поэтому в основной конфигурации добавлять пакет проще. Вторая справа кнопка — проверка пакета. Проверка должна проходить без ошибок.

4. Добавляем новый пакет и импортируем в него используемые пакеты. Теперь в нём можно использовать типы из этих пакетов. Встроенные типы, понятно, можно использовать и так:

 

 

Здесь почти все свойства имеют типы пакета EnterpriseData 1.8:

 

5. Теперь добавляем процедуры ДобавитьПОД_…, ДобавитьПКО_… и обработчики.

В добавлении ПКО нужно указать, что это объект из расширения формата:

Процедура ДобавитьПКО_Документ_ОрдерНаОтражениеПересортицыТоваров_Отправка(ПравилаКонвертации) Экспорт
	
	ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
	ПравилоКонвертации.ИмяПКО                       = "_ПКО_Документ_ОрдерНаОтражениеПересортицыТоваров_Отправка";
	ПравилоКонвертации.ОбъектДанных                 = Метаданные.Документы.ОрдерНаОтражениеПересортицыТоваров;
	ПравилоКонвертации.ОбъектФормата                = "_Документ.ОрдерНаОтражениеПересортицыТоваров";
	ПравилоКонвертации.ПриОтправкеДанных 			= "_ПКО_Документ_ОрдерНаОтражениеПересортицыТоваров_Отправка_ПриОтправкеДанных";
	ПравилоКонвертации.ПространствоИмен 			= "http://my.name/EnterpriseData/1.8.6.1";
	ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации, ПравилоКонвертации.ПространствоИмен);
	
	СвойстваШапки = ПравилоКонвертации.Свойства;
	ДобавитьПКС(СвойстваШапки, "Дата",               "Дата");
	ДобавитьПКС(СвойстваШапки, "Комментарий",        "Комментарий");
	ДобавитьПКС(СвойстваШапки, "Номер",              "Номер");
	ДобавитьПКС(СвойстваШапки, "Ответственный",      "Ответственный", , "Справочник_Пользователи");
	ДобавитьПКС(СвойстваШапки, "Склад",              "Склад", , "Справочник_Склады_Отправка");
	ДобавитьПКС(СвойстваШапки, "",				   "Организация", 1, "Справочник_Организации_Отправка");
	
	СвойстваТЧ = ДобавитьПКТЧ(ПравилоКонвертации, , "Товары");
    ДобавитьПКС(СвойстваТЧ, , "НомерСтроки");
	ДобавитьПКС(СвойстваТЧ, , "Номенклатура", 1, "Справочник_Номенклатура_Отправка");
	ДобавитьПКС(СвойстваТЧ, ,	"Качество", 1);
	ДобавитьПКС(СвойстваТЧ, , "КачествоНовое", 1);
	ДобавитьПКС(СвойстваТЧ, , "ЕдиницаИзмерения", 1, "Справочник_ЕдиницыИзмерения");
	ДобавитьПКС(СвойстваТЧ, , "Количество", 1);

КонецПроцедуры

 

Еще нужно подумать о регистрации объекта к обмену — то есть, его нужно добавить в план обмена, в обработчики (в моём случае это СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияДокумента)
 

Важно: чтобы объект выгрузился, нужно, чтобы узел-приёмник поддерживал получение такого типа. То есть, пока на стороне приемника не добавлены ПОД и ПКО, выгрузка самого объекта не произойдёт!

Соответственно, аналогичные манипуляции производим на стороне приемника, я в КА1 так же добавил новый пакет. Мне пришлось частично обновлять код самого механизма обмена в КА1, так как он расширения формата не поддерживал, это заняло больше всего времени. Думаю, с двумя базами на актуальной версии БСП будет проще.

В итоге объект выгружается, теперь в файле обмена два пространства имён:

    <msg:ObjectType>
        <msg:Name>_Документ.ОрдерНаОтражениеПересортицыТоваров</msg:Name>
        <msg:Sending>*</msg:Sending>
        <msg:Receiving/>
    </msg:ObjectType>
....
	<Body xmlns="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8" xmlns:ext1="http://my.name/EnterpriseData/1.8.6.1">
		<ext1:_Документ.ОрдерНаОтражениеПересортицыТоваров>
			<ext1:КлючевыеСвойства>
				<ext1:Дата>2023-01-24T15:27:04</ext1:Дата>
				<ext1:Номер>ЦБ-00000001</ext1:Номер>
				<ext1:Организация>
					<Ссылка>e273e630-5669-11e7-b7d7-005056b63591</Ссылка>
					<Наименование>ОНЛАЙН ДОЗОР ООО (с 14.06.17)</Наименование>
					<НаименованиеСокращенное>ООО "ВЕКТОР"</НаименованиеСокращенное>
					<НаименованиеПолное>Общество с ограниченной ответственностью "ВЕКТОР"</НаименованиеПолное>
					<ИНН>7205356421</ИНН>
					<КПП>720501001</КПП>
					<ЮридическоеФизическоеЛицо>ЮридическоеЛицо</ЮридическоеФизическоеЛицо>
				</ext1:Организация>
			</ext1:КлючевыеСвойства>
...

Что интересно, если не указать своё пространство имён в списке расширений формата, то у нового объекта не будет указано пространство имён, а его вложенных свойств, которые заимствованы из пакета EnterpriseData 1.8, наоборот, будет.

После доработки на стороне КА1 такой файл корректно загружается и все механизмы работают в штатном режиме.

У меня пока нет необходимости делать обмен в обратную сторону, вероятно, потребуются еще какие-то доработки в КА1.

Никакого кода не выкладываю, потому что если у вас актуальная БСП, то код в ней уже есть, а если у вас какое-то легаси, то как его обновлять — всё равно знаете только вы

Тестировалось на 1С:Комплексная автоматизация 2 (2.5.10.74) и доработанной Комплексная автоматизация, редакция 1.1 (1.1.40.2) на платформе 8.3.19.1399.

has been added to your cart:
Оформление заказа