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