Инфраструктура сообщений в 1С

Категория: Учебники по 1С » Технологии интеграции 1С Предприятия 8.2

В качестве примера рассмотрим следующее сообщение:

<?xml version="1.0“ encoding 'UTF-e" ?>
<v8msg: Message xmlns:v8msg="http:Wv8.1c.ai/messages">
<v8msg:Header>
<v8msg;ExchangePlan>УдаленныеСклады<//8msg:ExctiangePlan>
<v8msg:T0>Оптовый<'v8msg:T0>
<v8msg:From>ЦентрОфис<'v8msg:From>
<v8msg:MessageNo>20<V8msg:MessageNo>
<v8msg:ReceivedNo> 15<Mimsg:ReceivedNo>
</v8msg Header>
<v8msg:Body>
<!— Тело сообщения ->
</v8msg:Body>
</v8msg:Message>
Все сообщение находится внутри элемента XML с именем Message, относящимся к пространству имен http://v8.1c.ru/messages. Сообщение делится на заголовок Header и тело сообщения Body. Оба относятся к пространству имен http://v8.1c.ru/messages.

 

Структура заголовка жестко задана. Информация заголовка про i ставлена в нескольких элементах XML, вложенных в элемент Header. Все элементы, вложенные в элемент Header, относятся к пространству имен http://v8.1 c.ru/messages:

•Элемент с именем ExchangePlan содержит имя плана обмена, к которому относится сообщение.

•Элемент с именем From содержит код узла-отправителя.

•Элемент с именем То содержит код узла, для которого предназначено сообщение.

•Элемент с именем MessageNo содержит номер данного сообщения. Номер сообщения является положительным целым числом и присваивается узлом-отправителем. Номер каждого последующего сообщения равен номеру предыдущего отправленного сообщения плюс 1.

•Элемент с именем ReceivedNo содержит максимальный номер сообщения, которое узел-отправитель данного сообщения принял от узлаполучателя данного сообщения. Данное значение включено в состав заголовка сообщения для подтверждения приема сообщений.

Тело сообщения содержится в элементе XML с именем Body, относящемся к пространству имен http://v8.1c.ru/messages. Данный элемент может иметь произвольное содержимое, определяемое прикладными потребностями. Инфраструктурой сообщений содержимое тела сообщения никак не регламентируется.

Пример создания сообщения для выгрузки данных:

Выгрузка данных сопровождается созданием объекта с типом ЗаписьСо- общенияОбмена (переменная ЗаписьСообщения). Сразу после создания этот объект еще «не знает» своего номера, получателя и т.п. Вся подобная информация указывается при выполнении метода НачатьЗапись () . В качестве первого параметра передается объект ЗаписьХМЬ, в качестве второго - ссылка на узел плана обмена (ссылка на получателя).

 

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

 

Завершить запись сообщения можно с помощью двух методов объекта ЗаписьСообщенияОбмена:

•ЗакончитьЗапись (),

•ПрерватьЗапись().

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

 

Метод ЗакончитьЗапись () осуществляет нормальное завершение записи сообщения. В этом случае в сообщение записывается конец элемента XML (представляющего тело сообщения). В узел плана обмена записывается номер сообщения обмена данными. С записи узла плана обмена снимается блокировка, и сообщение считается отправленным.

Для чтения записанного в файл сообщения обмена в базе узла-получателя может использоваться следующий фрагмент кода (листинг 2.15).

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

 

При начале чтения сообщения устанавливается блокировка на запись узла плана обмена. Используя второй параметр метода, можно установить вариант ожидаемого номера сообщения:

•любой (фактически контроль номеров сообщения не производится);

•очередной (строго больший на единицу, чем предыдущий);

•больший.

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

Завершить чтение сообщения можно с использованием двух методов:

•ЗакончитьЧтение ();

•ПрерватьЧтение().

 

Обращение к методу ПрерватьЧтение() вызывает немедленное прерывание чтения сообщения. Блокировка с записи узла плана обмена снимается. В соответствующий узел плана обмена не вносится никаких изменений (не изменяется номер последнего принятого сообщения). Этот же метод вызывается неявно при разрушении (окончании времени жизни переменной, связанной с данным объектом) объекта ЧтениеСообщенияОбмена или перед повторным вызовом метода НачатьЧтение ().

 

Выполнение метода ЗакончитьЧтение () вызывает попытку нормального завершения чтения сообщения. При этом проверяется нормальное завершение сообщения (текущим элементом в объекте ЧтениеХМL является конец элемента, реализующего само сообщение). Номер принятого сообщения помещается в реквизит НомерПринятого узла плана обмена. Блокировка записи узла плана обмена снимается, и сообщение считается принятым.

dle

Помоги проекту! Расскажи друзьям о сайте: