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

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

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

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

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

РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения");
Если РазмерСообщения <> Неопределено Тогда
РазмерБуфера = Число(РазмерСообщения);

Иначе
РазмерБуфера = 1024;

КонецЕсли;

Тело = Новый БуферДвоичныхДанных(0);
Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);

Поток = Сообщение.ПолучитьТелоКакПоток();

Пока Истина Цикл
Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера);

Если Прочитано > 0 Тогда
Тело = Тело.Соединить(Буфер);

КонецЕсли;

Если Прочитано < РазмерБуфера Тогда
Прервать;

КонецЕсли;

КонецЦикла;

Отчет = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело);

ПисьмоОбъект = Справочники.ВходящиеПисьма.СоздатьОбъект();
ПисьмоОбъект.Наименование = "Отчет";
ПисьмоОбъект.Дата = ТекущаяДата();
ПисьмоОбъект.ПочтовыйЯщик = "POP3";
ПисьмоОбъект.ВидСодержимого = Перечисления.ВидСодержимогоВходящегоПисьма.HTML;

ПисьмоОбъект.УстановитьСсылкуНового(Справочники.ВходящиеПисьма.ПолучитьСсылку());

ПисьмоОбъект.Текст = Отчет;

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

Запись = НЗ.Добавить();
Запись.Письмо = ПисьмоОбъект.ПолучитьСсылкуНового();
Запись.Прочитано = Ложь;

НЗ.Записать();

ПисьмоОбъект.Записать();

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

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

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

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

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