Перейти к основному содержимому

Получение сообщения без тела и отправка сообщения с двоичным содержимым в информационной базе «Магазин»

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

Откройте конфигуратор информационной базы Магазин и перейдите в модуль сервиса интеграции СервисМагазина. В момент загрузки канала ВМагазин был создан пустой обработчик СетьМагазинов_ВМагазинОбработкаПолученияСообщения().

Напишите код, который будет проверять тип полученного сообщения и, если пришел запрос остатков, формировать соответствующий отчет и отправлять его обратно:

Процедура СетьМагазинов_ВМагазинОбработкаПолученияСообщения(Сообщение, Отказ)

ТипСообщения = Сообщение.Параметры.Получить("ТипСообщения");

Если ТипСообщения = "ЗапросОстатков" Тогда
Отчет = Отчеты.ОстаткиТоваровНаСкладах.Создать();
ТабДок = Новый ТабличныйДокумент;
Отчет.СкомпоноватьРезультат(ТабДок);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("HTM");

Попытка
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.HTML);
Поток = ФайловыеПотоки.Открыть(ИмяВременногоФайла,
РежимОткрытияФайла.Открыть,
ДоступКФайлу.Чтение);

Ответ = СервисыИнтеграции.СервисМагазина.СоздатьСообщение();
Ответ.ИдентификаторСообщенияЗапроса = Сообщение.Идентификатор;
Ответ.КодПолучателя = Сообщение.КодОтправителя;

ФайлВложение = Новый Файл(ИмяВременногоФайла);
РазмерФайла = ФайлВложение.Размер();
Ответ.Параметры["РазмерСообщения"] = РазмерФайла;

Тело = Ответ.ПолучитьТелоКакПоток();
Поток.КопироватьВ(Тело);
Тело.СброситьБуферы();
Тело.Закрыть();
Поток.Закрыть();

СервисыИнтеграции.СервисМагазина
.СетьМагазинов_ИзМагазина.ОтправитьСообщение(Ответ);

Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Ошибка",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
УдалитьФайлы(ИмяВременногоФайла);
ВызватьИсключение;

КонецПопытки;

УдалитьФайлы(ИмяВременногоФайла);

КонецЕсли;

КонецПроцедуры

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

Сообщение.Параметры.Получить("ТипСообщения")

С помощью метода СоздатьСообщение() вы создаете экземпляр ответного сообщения таким же образом, как делали это ранее.

В свойстве ответа КодПолучателя вы указываете, что сообщение нужно отправить в адрес того участника обмена, от которого пришло исходное сообщение.

Кроме того, в свойстве сообщения ИдентификаторСообщенияЗапроса можно указать, что данное сообщение является ответом на то сообщение, код которого указан в этом свойстве. Сама по себе механика «1С:Шины» никак не использует это свойство, однако с его помощью можно реализовать соответствующую логику на стороне получателя сообщения.

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

Далее методом ПолучитьТелоКакПоток() вы получаете двоичный поток, в который записываете файл с результатом отчета.

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