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

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

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

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

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

   Если ТипСообщения = "ЗапросОстатков" Тогда
      Отчет  = Отчеты.ОстаткиТоваровНаСкладах.Создать();
      ТабДок = Новый ТабличныйДокумент;
      Отчет.СкомпоноватьРезультат(ТабДок);
      ИмяВременногоФайла = ПолучитьИмяВременногоФайла("HTM");
		
      Попытка
         ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.HTML);
         Поток = ФайловыеПотоки.Открыть(ИмяВременногоФайла, 
                                        РежимОткрытияФайла.Открыть, 
                                        ДоступКФайлу.Чтение);
			
         Ответ = СервисыИнтеграции.СервисМагазина.СоздатьСообщение();
         Ответ.ИдентификаторСообщенияЗапроса = Сообщение.Идентификатор;
         Ответ.КодПолучателя                 = Сообщение.КодОтправителя;
			
         ФайлВложение = Новый Файл(ИмяВременногоФайла);
         РазмерФайла = ФайлВложение.Размер();
         Ответ.Параметры["РазмерСообщения"] = РазмерФайла;
			
         Тело = Ответ.ПолучитьТелоКакПоток();
         Поток.КопироватьВ(Тело);
         Тело.СброситьБуферы();
         Тело.Закрыть();
         Поток.Закрыть();
			
         СервисыИнтеграции.СервисМагазина
            .СетьМагазинов_ИзМагазина.ОтправитьСообщение(Ответ);
			
      Исключение
         ИнформацияОбОшибке = ИнформацияОбОшибке();
         ЗаписьЖурналаРегистрации("Ошибка", 
                                  УровеньЖурналаРегистрации.Ошибка,,, 
                                  ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
         УдалитьФайлы(ИмяВременногоФайла);
         ВызватьИсключение;
			
      КонецПопытки;

      УдалитьФайлы(ИмяВременногоФайла);
		
   КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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