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

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

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

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

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

Данный метод может быть применен в обоих механизмах обмена данными (универсальный механизма обмена и распределенная информационная база). Суть его заключается в том, что после записи заголовка сообщения обмена записывается требуемая информация в объект Запись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.Прочитать();
        
    КонецЕсли;
    
    // Завершаем чтение сообщения
    ЧтениеСообщения.ЗакончитьЧтение();

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