Использование SoapUi для работы с веб-сервисами. Часть 2

04.10.16

Интеграция - WEB-интеграция

Сложные примеры работы с xml в веб-сервисах 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ВебСервисы2
.zip 194,60Kb
26
26 Скачать (1 SM) Купить за 1 850 руб.

Здравствуйте!

В продолжении своей предыдущей статьи я расскажу вам о том, как выполнять более сложные запросы к веб-сервисам.

Я рассмотрю примеры:

  • Установка у массива элементов атрибута количества.
  • Передача в 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.

soapui xml веб-сервисы

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL, 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2208    2    0    

9

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С. Бесплатный период Техподдержки - 1 месяц.

60000 руб.

07.05.2019    34244    64    45    

24

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    1958    1    1    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18813    21    22    

18

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

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

24000 руб.

27.09.2024    3442    3    2    

4

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    18550    53    50    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1566 05.10.16 10:37 Сейчас в теме
2. script 128 06.10.16 00:46 Сейчас в теме
По моему все гораздо прощее
Прикрепленные файлы:
6. jif 14.05.18 20:27 Сейчас в теме
(2)как настроить команды контекстного меню? не вижу этой команды у себя. Спасибо!
Прикрепленные файлы:
3. starik-2005 3144 07.10.16 11:15 Сейчас в теме
я расскажу вам о том, как ололо трололо.


Да, наверное это кому-то нужно. Теперь мы умеем читать сохраненные XML файлы (в 1С), полученные из веб-сервиса и декодировать данные из base64.

Вопрос о том, зачем нам это, так и висит в воздухе...
4. alprk 10.10.16 10:48 Сейчас в теме
спасибо за подсказку про тип base64Binary, мы возвращали base64 текстом всегда :)
5. iolko 322 11.10.16 08:30 Сейчас в теме
За статью, спасибо, вот как раз есть вещи, которые таким образом и реализую.

А зачем такие сложности с различными web ресурсами, когда получить строку64 можно
ДД = ДвоичныеДанные(ИмяФайла);
Строка64 = Base64Строка(ДД);


и обратно
ДД = Base64Значение(Строка64)
ДД.Записать(ИмяФайла);


Следовательно при обмене файлами через web сервис достаточно передать Строку64 с данными файла и его расширение, для сохранения.
Оставьте свое сообщение