Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Методика включения в сообщение обмена дополнительной информации          
Batchir Подменю пользователя
сообщение 09.02.09, 13:19
Сообщение #1

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

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

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



КонецЕсли;



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

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

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 18.04.24, 6:17
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!