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