Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 июл 2022, 22:38

Как сформировать сообщение для обмена

Автор antkamidiv, 20 ноя 2017, 15:41

0 Пользователей и 1 гость просматривают эту тему.

antkamidiv

Добрый день, коллеги!

Впервые столкнулся с необходимостью реализовать обмен своей конфигурации со сторонним прикладным решением на 1С. Создаю ФабрикуXDTO через перечисление необходимых схем. Одна из них ExchangeMessage, в которой есть описание Header для обмена. Откуда брать Message и Body понять не могу! Может есть еще шаблон с описанием формата сообщения обмена? В документации написано, что сообщение имеет корневой элемент Message, а в нем Body и Header. В EnterpriseData я не увидел Message и Body.

ilyay

Имеется ввиду, что пакет будет вида <message><header></header><body></body></message>.

antkamidiv

Да. Именно это и спрашиваю. Это схемой реализовано, чтобы фабрике скормить?

ilyay

http://v8.1c.ru/edi/edi_app/enterprisedata/

header и confirmation описаны в схеме ExchangeMessage. Body конструируете из объектов xdto.
То есть, теги, которые отсутствуют в схеме, выводите программно, остальное можно вывести через сериализацию объектов.

antkamidiv

Благодарю за ответ.
Под программным созданием элементов Message и Body что подразумевается?

Это из документации:
<Message xmlns:msg="http://www.1c.ru/SSL/Exchange/Message" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <msg:Header>
     <msg:Format>http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.0</msg:Format>
   <msg:CreationDate>2015-04-09T11:57:48</msg:CreationDate>
   <msg:AvailableVersion>1.0</msg:AvailableVersion>
    </msg:Header>
    <Body xmlns="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.0">...
    </Body>
</Message>

У меня при создании недостающих элементов через методы объекта ЗаписьXML получается:
<?xml version="1.0" encoding="UTF-8"?>
<Message>
    <Header xmlns="http://www.1c.ru/SSL/Exchange/Message" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Format>http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.0</Format>
   <AvailableVersion>1.0</AvailableVersion>
   <CreationDate>2017-11-21T16:20:09</CreationDate>
    </Header>
    <Body>...
    </Body>
</Message>

Не руками же все перебирать и добавлять и удалять атрибуты с пространствами имен. Все удобство ФабрикаXDTO пропадает при таком подходе.

ilyay

В том и есть вся фишка корневого элемента, что на него навешиваете определения пространств.

Вот фрагмент моего кода:

ИмяПространства = "msg";
КорневойЭлемент = "Message";
URIПространстваОбъекта = "..."; // uri схемы для префикса msg
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяПространства + ":" + КорневойЭлемент);
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(ИмяПространства, URIПространстваОбъекта);
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("typ", "urn://typ/1.0"); // объект будет записываться с типом по умолчанию (tns)
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
МояФабрика.ЗаписатьXML(ЗаписьXML, Объект, ИмяОбъекта); // 3-й параметр нужен для корректного именования верхнего тега
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаМО.Xml = ЗаписьXML.Закрыть();


Под программным созданием имею ввиду применение методов ЗаписатьНачалоЭлемента/ЗаписатьКонецЭлемента для тега body

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск