В некоторых случаях обмен данными должен сопровождаться передачей в сообщении обмена служебной дополнительной информации. Передачу подобной информации можно осуществлять непосредственно в теле сообщения обмена. Дополнительную информацию можно размещать в теле сообщения как при реализации универсального обмена, так и в случае работы с распределенными информационными базами.
При универсальном обмене это делается довольно просто. При выгрузке данных (в любой момент: в начале сообщения, в середине, в конце) можно записать в тело сообщения специализированный элемент 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 (можно сразу производить выборку атрибутов элемента).
Следует отметить, что алгоритм как записи, так и чтения (в обоих вариантах обмена) зависит от структуры элемента, специализирующегося на «переносе» дополнительной информации.