Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Использование транзакций при организации обмена
Дальше: Организация одностороннего обмена

Методика включения в сообщение обмена дополнительной информации

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

При универсальном обмене это делается довольно просто. При выгрузке данных (в любой момент: в начале сообщения, в середине, в конце) можно записать в тело сообщения специализированный элемент XML (с нужным наполнением) (листинг 3.91).

Листинг 3.91. Пример записи служебной информации

ЗаписьXML.ЗаписатьНачалоЭлемента("info");

ЗаписьXML.ЗаписатьАтрибут("содержание", "Дополнительная информация");

ЗаписьXML.ЗаписатьТекст("передаваемая информация");

ЗаписьXML.ЗаписатьКонецЭлемента();

При чтении необходимо предусмотреть возможность чтения данного специализированного узла (листинг 3.92).

Листинг 3.92. Пример чтения служебной информации

Если ЧтениеXML.Имя="info" Тогда

 

// Прочитать текст xml элемента.

ЧтениеXML.Прочитать();

 

// Прочитать конец элемента info.

ЧтениеXML.Прочитать();

 

// Спозиционироваться на начале элемента v8de:Changes

ЧтениеXML.Прочитать();

 

КонецЕсли;

При необходимости указания дополнительных данных при работе с распределенной информационной базой можно использовать следующий подход (листинг 3.93).

Листинг 3.93. Пример передачи дополнительной информации в сообщении распределенной информационной базы

// Создать объект записи XML.

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл("c:\out.xml");

ЗаписьXML.ЗаписатьОбъявлениеXML();

 

// Создать новое сообщение.

Узел = ПланыОбмена.Магазины.НайтиПоКоду("Магазин");

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Узел);

 

// Записать дополнительную информацию.

ЗаписьXML.ЗаписатьНачалоЭлемента("info");

ЗаписьXML.ЗаписатьАтрибут("содержание", "Код");

ВключитьСтроку = "

|Событие = Документы.Событие.СоздатьДокумент();

|Событие.Дата = ТекущаяДата();

|Событие.ОписаниеСобытия = ""Сформировать внутренние заказы"";

|// заполнение других реквизитов документа

|Событие.Записать(); ";

ЗаписьXML.ЗаписатьТекст(ВключитьСтроку);

ЗаписьXML.ЗаписатьКонецЭлемента();

 

// Записать изменения.

ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0);

 

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

В результате выполнения получаем следующее сообщение (приведен начальный фрагмент) – листинг 3.94.

Листинг 3.94. Фрагмент сообщения обмена

<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">

<v8msg:Header>

<v8msg:ExchangePlan>Магазины</v8msg:ExchangePlan>

<v8msg:To>Магазин</v8msg:To>

<v8msg:From>ЦентрОфис</v8msg:From>

<v8msg:MessageNo>1</v8msg:MessageNo>

<v8msg:ReceivedNo>0</v8msg:ReceivedNo>

</v8msg:Header>

<v8msg:Body

<info содержание="Код">

Событие=Документы.Событие.СоздатьДокумент();

Событие.Дата=ТекущаяДата();

Событие.ОписаниеСобытия="Сформировать внутренние заказы";

// заполнение других реквизитов документа

Событие.Записать(); ";

</info>

<v8de:Changes

xmlns:v8="http://v8.1c.ru/data"

xmlns:v8de="http://v8.1c.ru/dataexchange/2005/02"

xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<v8de:Signature>

b16e45e5-1a9b-48b3-811f-286a45f6dd50

</v8de:Signature>

Чтение сообщения обмена, содержащего дополнительную информацию, может быть выполнено так, как показано в листинге 3.95.

Листинг 3.95. Пример чтения сообщения обмена

// Создать объект чтения XML.

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл("c:\out.xml");

 

// Загрузить сообщение из найденного файла.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

 

// Прочитать текст элемента xml.

ЧтениеXML.Прочитать();

 

// Прочитать конец элемента info.

ЧтениеXML.Прочитать();

 

// Спозиционироваться на начале элемента v8de:Changes.

ЧтениеXML.Прочитать();

 

// Прочитать изменения.

ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

Обратите внимание, что после начала чтения сообщения объект ЧтениеXML уже позиционирован на начале элемента info (можно сразу производить выборку атрибутов элемента).

Следует отметить, что алгоритм как записи, так и чтения (в обоих вариантах обмена) зависит от структуры элемента, специализирующегося на «переносе» дополнительной информации.

Назад: Использование транзакций при организации обмена
Дальше: Организация одностороннего обмена