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

  • до выгрузки изменений данных; 
  • после выгрузки изменений данных;
  • дополнительная информация размещается между изменениями данных;
  • изменения данных оборачиваются элементами XML, содержащими требуемую дополнительную информацию;
  • применение комбинации вышеперечисленных методов.

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

Рассмотрим каждый вариант размещения дополнительной информации более подробно.

Размещение дополнительной информации до изменений данных

Данный метод может быть применен в обоих механизмах обмена данными (универсальный механизма обмена и распределенная информационная база). Суть его заключается в том, что после записи заголовка сообщения обмена записывается требуемая информация в объект ЗаписьXML, полученный из объекта ЗаписьСообщенияОбмена.
Например:




// Создаем объект записи XML
  ЗаписьXML = Новый ЗаписьXML;
  ЗаписьXML.ОткрытьФайл(ИмяФайла);
  ЗаписьXML.ЗаписатьОбъявлениеXML();

  // Создаем новое сообщение
  ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
  ЗаписьСообщения.НачатьЗапись(ЗаписьXML, СсылкаНаУзелПланаОбмена);

  // Запись дополнительной информации
  ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("info");
  ЗаписьСообщения.ЗаписьXML.ЗаписатьТекст("дополнительная информация");
  ЗаписьСообщения.ЗаписьXML.ЗаписатьКонецЭлемента();
   
  // выполняем запись изменений данных
  ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);

  // Завершаем запись сообщения
  ЗаписьСообщения.ЗакончитьЗапись();
  ЗаписьXML.Закрыть();





Результирующее сообщение будет выглядеть следующим образом:


<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
  <v8msg:Header>
  <v8msg:ExchangePlan>ПланОбмена</v8msg:ExchangePlan>
  <v8msg:To>root</v8msg:To>
  <v8msg:From>node</v8msg:From>
  <v8msg:MessageNo>1</v8msg:MessageNo>
  <v8msg:ReceivedNo>1</v8msg:ReceivedNo>
  </v8msg:Header>
  <v8msg:Body>
  <info>дополнительная информация</info>
  ... изменения данных ...
  </v8msg:Body>
</v8msg:Message>




При этом процедура чтения подобного сообщения обмена может выглядеть следующим образом:

 


// Создаем объект записи XML
  ЧтениеXML = Новый ЧтениеXML;
  ЧтениеXML.ОткрытьФайл(ИмяФайла);

  // Создаем новый объект чтения сообщения обмена
  ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
  ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  // Чтение дополнительной информации
  Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "info" Тогда
   
  // читаем дополнительную информацию
  ЧтениеXML.Прочитать();
  // значением свойства ЧтениеXML.ТипУзла должно быть значение ТипУзлаXML.Текст
  // ЧтениеXML.Значение должна быть строка "дополнительная информация"
  ДопИнформация = ЧтениеXML.Значение;
   
  // читаем завершение дополнительной информации
  ЧтениеXML.Прочитать();
   
  // переходим к следующему элементу
  ЧтениеXML.Прочитать();
   
  КонецЕсли;
   
  // выполняем чтение изменений данных
  ... изменения данных ... 

  // Завершаем чтение сообщения
  ЧтениеСообщения.ЗакончитьЧтение();


Размещение дополнительной информации после изменений данных

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

Например:

 


// Создаем объект записи XML
  ЗаписьXML = Новый ЗаписьXML;
  ЗаписьXML.ОткрытьФайл(ИмяФайла);
  ЗаписьXML.ЗаписатьОбъявлениеXML();

  // Создаем новое сообщение
  ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
  ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);

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

  // Запись дополнительной информации
  ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("info");
  ЗаписьСообщения.ЗаписьXML.ЗаписатьТекст("дополнительная информация");
  ЗаписьСообщения.ЗаписьXML.ЗаписатьКонецЭлемента();
   
  // Завершаем запись сообщения
  ЗаписьСообщения.ЗакончитьЗапись();
  ЗаписьXML.Закрыть();


Результирующее сообщение будет выглядеть следующим образом:
<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
  <v8msg:Header>
  <v8msg:ExchangePlan>ПланОбмена</v8msg:ExchangePlan>
  <v8msg:To>root</v8msg:To>
  <v8msg:From>node</v8msg:From>
  <v8msg:MessageNo>1</v8msg:MessageNo>
  <v8msg:ReceivedNo>1</v8msg:ReceivedNo>
  </v8msg:Header>
  <v8msg:Body>
  ... изменения данных ...
  <info>дополнительная информация</info>
  </v8msg:Body>
</v8msg:Message>


При этом процедура чтения подобного сообщения обмена может выглядеть следующим образом:

 


// Создаем объект записи XML
  ЧтениеXML = Новый ЧтениеXML;
  ЧтениеXML.ОткрытьФайл(ИмяФайла);

  // Создаем новый объект чтения сообщения обмена
  ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
  ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  // выполняем чтение изменений данных
  ... изменения данных ... 

  // Чтение дополнительной информации
  Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "info" Тогда
   
  // читаем дополнительную информацию
  ЧтениеXML.Прочитать();
  // значением свойства ЧтениеXML.ТипУзла должно быть значение ТипУзлаXML.Текст
  // ЧтениеXML.Значение должна быть строка "дополнительная информация"
  ДопИнформация = ЧтениеXML.Значение;
   
  // читаем завершение дополнительной информации
  ЧтениеXML.Прочитать();
   
  // переходим к следующему элементу
  ЧтениеXML.Прочитать();
   
  КонецЕсли;
   
  // Завершаем чтение сообщения
  ЧтениеСообщения.ЗакончитьЧтение();




Размещение дополнительной информации между изменениями данных

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

Например:



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

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

ЗаписьXML.ОткрытьФайл(ИмяФайла);

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



// Создаем новое сообщение

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

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



// выполняем запись изменений данных

ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);

Пока ВыборкаИзменений.Следующий() Цикл



Данные = ВыборкаИзменений.Получить();



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

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

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

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



// Запись изменений данных

ЗаписатьXML(ЗаписьСообщения.ЗаписьXML, Данные);



КонецЦикла;



// Завершаем запись сообщения

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

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

Результирующее сообщение будет выглядеть следующим образом:
<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
  <v8msg:Header>
  <v8msg:ExchangePlan>ПланОбмена</v8msg:ExchangePlan>
  <v8msg:To>root</v8msg:To>
  <v8msg:From>node</v8msg:From>
  <v8msg:MessageNo>1</v8msg:MessageNo>
  <v8msg:ReceivedNo>1</v8msg:ReceivedNo>
  </v8msg:Header>
  <v8msg:Body>
  <info>дополнительная информация</info>
  ... изменения данных ...
  <info>дополнительная информация</info>
  ... изменения данных ...
  <info>дополнительная информация</info>
  ... изменения данных ...
  ...
  </v8msg:Body>
</v8msg:Message>


При этом процедура чтения подобного сообщения обмена может выглядеть следующим образом:



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

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

ЧтениеXML.ОткрытьФайл(ИмяФайла);



// Создаем новый объект чтения сообщения обмена

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

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



// выполняем чтение изменений данных и дополнительной информации

Пока ВозможностьЧтенияXML(ЧтениеXML)

ИЛИ (ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "info") Цикл



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

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

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

// значением свойства ЧтениеXML.ТипУзла должно быть значение ТипУзлаXML.Текст

// ЧтениеXML.Значение должна быть строка "дополнительная информация"

ДопИнформация = ЧтениеXML.Значение;



// читаем завершение дополнительной информации

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



// переходим к следующему элементу

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



Иначе



// Читаем элемент данных стандартным способом

ЭлементДанных = ПрочитатьXML(ЧтениеXML);

ЭлементДанных.Записать();



КонецЕсли;



КонецЦикла;



// Завершаем чтение сообщения

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




Создание дополнительного элемента, содержащего изменения данных

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

Например:



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

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

ЗаписьXML.ОткрытьФайл(ИмяФайла);

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



// Создаем новое сообщение

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

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



// Запись конверта

ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("envelope");

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

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



// выполняем запись изменений данных

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

// завершение записи конверта

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



// Завершаем запись сообщения

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

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

Результирующее сообщение будет выглядеть следующим образом:
<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
  <v8msg:Header>
  <v8msg:ExchangePlan>ПланОбмена</v8msg:ExchangePlan>
  <v8msg:To>root</v8msg:To>
  <v8msg:From>node</v8msg:From>
  <v8msg:MessageNo>1</v8msg:MessageNo>
  <v8msg:ReceivedNo>1</v8msg:ReceivedNo>
  </v8msg:Header>
  <v8msg:Body>
  <envelope info="дополнительная информация">
  ... изменения данных ...
  </envelope>
  </v8msg:Body>
</v8msg:Message>


При этом процедура чтения подобного сообщения обмена может выглядеть следующим образом:



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

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

ЧтениеXML.ОткрытьФайл(ИмяФайла);



// Создаем новый объект чтения сообщения обмена

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

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



// Чтение дополнительной информации

Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "envelope" Тогда



// дополнительная информация содержится в атрибуте "info"

ДопИнформация = ЧтениеXML.ПолучитьАтрибут("info");



// продвигаемся вперед для чтения изменений данных

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



// выполняем чтение изменений данных

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



Если ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента

ИЛИ ЧтениеXML.Имя <> "envelope" Тогда



ВызватьИсключение "Ошибка чтения сообщения обмена";



КонецЕсли;



// завершаем чтение элемента "envelope"

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



КонецЕсли;



// Завершаем чтение сообщения

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

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