Здравствуйте!
В продолжении своей предыдущей статьи я расскажу вам о том, как выполнять более сложные запросы к веб-сервисам.
Я рассмотрю примеры:
- Установка у массива элементов атрибута количества.
- Передача в 1С xml-файла, не описанного в пакете, в формате base64
- Получение из 1С документа pdf в формате base64 и его декодирование
7. Установка количества элементов в массиве.
Напомню, вот что получилось у меня с запросом в xml документа расходной накладной в прошлый раз:
А мне хотелось бы видеть вложенную структуру, где указано количество элементов в массиве, типа такой: <saleitems quantity="3'><saleitem number="1"...</saleitem></saleitems>
Для начала полезно будет включить отладку веб-сервиса. Для этого я воспользовался вот этой замечательной инструкцией.
Отладка у меня заработала при запуске запроса из SoapUi и видно, что свойство SaleItems имеет тип СписокXDTO.
Но у типа СписокXDTO нельзя задать какие-либо атрибуты. Поэтому я рассмотрю один из вариантов задания количества - это прямая запись с помощью ЗаписатьАтрибут и объекта ЗаписьXML. Кода при этом получается больше, чем при записи с помощью ФабрикаXDTO, но зато можно задать любые необходимые вам свойства и атрибуты тегов у получившегося XML файла.
Вот скриншот результата запроса:
Вот код, который я для этого написал:
//запись в хмл вручную
файл = ПолучитьИмяВременногоФайла("xml");
запись = новый ЗаписьXML;
запись.ОткрытьФайл(файл);
запись.ЗаписатьОбъявлениеXML();
//реквизиты документа
запись.ЗаписатьНачалоЭлемента("SaleDoc");
запись.ЗаписатьНачалоЭлемента("number");
запись.ЗаписатьТекст(док.Номер);
запись.ЗаписатьКонецЭлемента();
запись.ЗаписатьНачалоЭлемента("date");
запись.ЗаписатьТекст(формат(док.Дата,"ДФ=yyyy-MM-ddTHH:mm:ss"));
запись.ЗаписатьКонецЭлемента();
запись.ЗаписатьНачалоЭлемента("partnerName");
запись.ЗаписатьТекст(строка(док.Контрагент));
запись.ЗаписатьКонецЭлемента();
//табличная часть
запись.ЗаписатьНачалоЭлемента("SaleItems");
запись.ЗаписатьАтрибут("quantity",строка(ПакетДокумента.SaleItems.Количество()) );//количество
для каждого товарТЧ из ПакетДокумента.SaleItems цикл
ФабрикаXDTO.ЗаписатьXML(запись,товарТч);//saleItem
конеццикла;
запись.ЗаписатьКонецЭлемента();//SaleItems
запись.ЗаписатьКонецЭлемента();//SaleDoc
запись.Закрыть();
//конец записи вручную
Как видно, получилось гораздо больше кода, чем в примере в предыдущей статье. Буду рад, если кто-то подскажет, как его упростить. Мне пришла в голову только идея написать XSLT шаблон для преобразования xml в нужный вид, но этот способ достаточно сложный.
8. Обработка XML без описания их в пакете XDTO.
В предыдущем примере для функции getSaleDoc было известно, что входящий параметр имеет тип InDocSaleQuery, который был описан в пакете XDTO. В этом примере я рассмотрю, как можно работать с xml, если мы не описали его в пакете. Создадим новую операцию getSaleDoc2 в веб-сервисе и определим у нее входящий параметр base64data с типом base64Binary. Из типа параметра понятно, что входящий xml-файл будет закодирован в формат base64. Для этого создадим xml с полями number и date следующего вида:
и для его кодировки воспользуемся сайтом base64encode. Вот что в итоге получится в SoapUi:
Такие входящие данные можно обработать с помощью записи их во временный xml файл и дальнейшего чтения с помощью функции ФабрикаXDTO.ПрочитатьXML. Получится ОбъектXDTO с полями number и date, только дата здесь уже будет в строковом формате и ее нужно будет преобразовать в формат 1С. Дальнейшая работа функции такая же, как у предыдущей getSaleDoc.
Полностью код функции getSaleDoc2 можно посмотреть в приложенном к статье файле.
9. Получение из веб-сервиса pdf. Декодирование данных из base64 в файл.
Последняя тема, которую я хочу рассмотреть - получение из веб-сервиса pdf в формате base64. Для декодировки из base64 в xml есть сайт base64decode. Однако в нем удобно работать, например, с xml файлами и неудобно с остальными форматами. Вот, например, скриншот декодирования xml:
Для получения из веб-сервиса печатной формы в виде pdf создадим новую операцию getPdfDoc, с возвращаемым типом base64Binary. Здесь есть интересный нюанс - без дополнительных усилий тип ДвоичныеДанные преобразовывается в base64Binary, об этом можно узнать из синтакс-помошника. Код получается такой:
тд = новый ТабличныйДокумент;
Документы.Расходная.Печать(тд,ссылка);
//сохраним в пдф
времФайл = ПолучитьИмяВременногоФайла("pdf");
тд.Записать(времФайл,ТипФайлаТабличногоДокумента.PDF);
двДанные = Новый ДвоичныеДанные(времФайл);
Возврат двДанные;
При выполнении этого запроса с помощью SoapUI у нас получается достаточно большое количество данных, и преобразовать их в файл нам поможет сайт motobit. Вот как выглядят его настройки:
А вот и результат, документ в pdf:
Кстати, небольшой бонус: если для печати использовать типовые модули управления печатью, из типовых конфигураций то код для получения Табличного Документа примерно такой:
КоллекцияПечатныхФорм = Неопределено;
ОбъектыПечати = Новый СписокЗначений;
МассивПечати = Новый Массив;
МассивПечати.Добавить(Документ.Ссылка);
УправлениеПечатью.СформироватьПечатныеФормы("ИмяМенеджераПечати",
"ИмяМакета",
МассивПечати,
Неопределено,
КоллекцияПечатныхФорм,
ОбъектыПечати,
Неопределено);
Если КоллекцияПечатныхФорм.Количество()>0 Тогда
ТабличныйДокумент = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецЕсли;
Что ж, на этом всё. Я привел интересные примеры работы с веб-сервисами и буду рад ответить на ваши вопросы в комментариях.
В приложенном архиве - выгрузка базы и проекта SoapUi.