Передача двоичных данных с помощью веб-сервиса

Объект метаданных "Веб-сервис" предназначен для обмена данными посредством веб-технологий, а если быть точнее - по протоколу HTTP. Как же осуществляется передача двоичных данных в мире веб-разработки? Для этого используется кодирование двоичных данных под названием base64 (64 — это число символов в алфавите кодирования, из которого формируется конечный буквенно-цифровой текст на основе латинского алфавита).

Закодированные двоичные данные выглядят примерно так:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0

Платформа 1С в своем арсенале имеет имеет парочку функций, которые умеют кодировать двоичные данные в base64:
  • Base64Строка - имеет один входящий параметр типа ДвоичныеДанные, возвращает строку, закодированную по алгоритму base64.
  • XMLСтрока - так же имеет один входящий параметр, который может принимать значение типа ДвоичныеДанные и возвращать строку в формате base64, следует использовать для создания XML.
Допустим, имеется веб-сервис, который содержит метод GetFacsimile. Этот метод принимает номер заказа и возвращает счет факсимиле в виде PDF-файла.
Рисунок 1. Метод веб-сервиса GetFacsimile

Если метод возвращает значение (в нашем случае это файл), то нужно указать тип возвращаемого значения, выберем тип String пространства имен http://www.w3.org/2001/XMLSchema, ведь base64 это строка.
Рисунок 2. Тип возвращаемого значения метода
Напишем программный код для метода:

Функция GetFacsimile(Number)

ФайлКакBase64 = "";

НомерЗаказаКлиента = СокрЛП(Number);

ЗаказКлиента = Документы.ЗаказКлиента.НайтиПоНомеру(НомерЗаказаКлиента);
Если Не ЗаказКлиента.Пустая() Тогда

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

ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
ПараметрыПечати.Вставить("ОтображатьФаксимиле", Истина);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");

ТабличныйДокумент = Обработки.ПечатьСчетовНаОплату.СформироватьПечатнуюФормуСчетНаОплату(
СтруктураТипов,
Новый СписокЗначений,
ПараметрыПечати);
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);

ДвоичныеДанныефайла = Новый ДвоичныеДанные(ИмяВременногоФайла);

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

ФайлКакBase64 = Base64Строка(ДвоичныеДанныефайла);

Иначе
ЗаписьЖурналаРегистрации(
"Документы.ЗаказКлиента.НайтиПоНомеру",
УровеньЖурналаРегистрации.Предупреждение,
Метаданные.Документы.ЗаказКлиента,
,
"Не найден счет факсимиле по номеру заказа клиента: " + НомерЗаказаКлиента + ".");
КонецЕсли;

Возврат ФайлКакBase64;

КонецФункции


Но можно и по другому, для этого находим информацию в синтакс-помощнике о типе ДвоичныеДанные и смотрим, может ли данный тип сериализоваться в объект XDTO, если да, то какому типу соответствует.
Рисунок 3. Дополнительно описание типа ДвоичныеДанные
Из рисунка 3 видно, что тип ДвоичныеДанные сопоставим с типами base64Binary и hexBinary, которые относятся к пространству имен http://www.w3.org/2001/XMLSchema. Далее указываем для метода тип возвращаемого значения (см. рисунок 2) из списка сопоставимых. Теперь в методе можно возвращать двоичные данные без явного кодирования в base64, система это сделает за вас.

Функция GetFacsimile(Number)

// Создание файла . . .

ДвоичныеДанныефайла = Новый ДвоичныеДанные(ИмяВременногоФайла);

Возврат ДвоичныеДанныефайла ;

КонецФункции


Принимающей стороне остается декодировать строку формата base64 в двоичные данные.

Комментарии