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