Итак, у нас есть "стандартный" обмен между 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.
Обновление от 22.04.2023: Совсем забыл написать: почему-то при выгрузке файла обмена процесс построен таким образом, что настройки обмена переинициализируются и информация о расширении теряется, и новый объект не появляется в списке получаемых (Receiving). Чтобы появился, нужно добавить расширение в обработчике ПриПолученииНастроек в модуле менеджера плана обмена:
Настройки.РасширенияФорматаОбмена.Вставить("моё пространство имен/1.11.7.1", "1.11");