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

Откройте конфигуратор информационной базы Офис и напишите алгоритм получения сообщения с отчетом.

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

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

   РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения");
   Если РазмерСообщения <> Неопределено Тогда
      РазмерБуфера = Число(РазмерСообщения); 
		
   Иначе
      РазмерБуфера = 1024;    
		
   КонецЕсли;
	
   Тело  = Новый БуферДвоичныхДанных(0);
   Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);
	
   Поток = Сообщение.ПолучитьТелоКакПоток();
	
   Пока Истина Цикл
      Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера);
		
      Если Прочитано > 0 Тогда
         Тело = Тело.Соединить(Буфер);  
			
      КонецЕсли;   
		
      Если Прочитано < РазмерБуфера Тогда
         Прервать; 
			
      КонецЕсли; 
		
   КонецЦикла;
	
   Отчет = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело);
	
   ПисьмоОбъект = Справочники.ВходящиеПисьма.СоздатьОбъект();
   ПисьмоОбъект.Наименование   = "Отчет";
   ПисьмоОбъект.Дата           = ТекущаяДата();
   ПисьмоОбъект.ПочтовыйЯщик   = "POP3";
   ПисьмоОбъект.ВидСодержимого = Перечисления.ВидСодержимогоВходящегоПисьма.HTML;
	
   ПисьмоОбъект.УстановитьСсылкуНового(Справочники.ВходящиеПисьма.ПолучитьСсылку());
	
   ПисьмоОбъект.Текст = Отчет;
	
   НЗ = РегистрыСведений.СостояниеВходящихПисем.СоздатьНаборЗаписей();
   НЗ.Отбор.Письмо.Установить(ПисьмоОбъект.ПолучитьСсылкуНового());
	
   Запись = НЗ.Добавить();
   Запись.Письмо    = ПисьмоОбъект.ПолучитьСсылкуНового();
   Запись.Прочитано = Ложь; 
	
   НЗ.Записать();
	
   ПисьмоОбъект.Записать();
	
КонецПроцедуры

Полученное сообщение передается в обработчик в параметре Сообщение.

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

Зачем же нужно это свойство? Дело в том, что наиболее эффективным способом работы с двоичными данными является потоковая обработка. Однако применение этого подхода не всегда возможно — например, если требуется получить исходный экземпляр целиком для десериализации двоичных данных в строку, как в вашем случае. При этом нужно учитывать, что многократное выделение памяти для экземпляра БуферДвоичныхДанных может приводить к существенным проблемам с производительностью, если такие операции выполняются параллельно в нескольких потоках. Поэтому в таких случаях рекомендуется выделять буфер в памяти сразу нужного размера. Именно это вы и сделали с помощью значения, полученного из свойства РазмерСообщения.

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