1. Простий веб-сервіс
Для початку візьмемо каркасну конфігурацію без веб-сервісів і пройдемо по кроках процес їх створення.
Додамо новий веб-сервіс з ім'ям test1 і створимо в ньому операцію hello з повертається типом string. Імена веб-сервісів і операцій краще завжди ставити на латиниці.
При натисканні на лупу в поле "Ім'я процедури" буде відкритий модуль веб-сервісу і можна буде реалізувати функцію hello.
2. Публікація веб-сервісу.
3. Тестування за допомогою SoapUI
Для тестування створимо окремого користувача WsUser, з простим паролем і дамо йому повні права.
Після цього встановлюємо і запускаємо SoapUI. Ця програма дуже зручна для тестування веб-сервісів, вона може отримувати їх опис і робити post-запити до сервісів.
Заходимо в меню File - New SOAP project, задаємо ім'я проекту hellotest а в поле Initial WSDL пропишемо ось таке посилання:
Soap12Binding відрізняється тим, що працює за новою версією стандарту SOAP 1.2. Відкриємо в test1Soap12Binding елемент Request1 і побачимо ось що:
Тепер можна нарешті виконати запит до функції hello і подивитися відповідь:
Відмінно, все запрацювало!
4. Передача простих параметрів в функцію.
Тепер зробимо нову функцію з параметрами, наприклад перевіримо роботу з датами, зробимо функцію getSaleDocNumbersByDate, яка буде приймати дату документа (видаткової накладної) і повертати номера документів за цю дату рядком. Додамо до операції параметр date з типом dateTime:
Тепер в SoapUI правою кнопкою миші потрібно клікнути на елемент testSoap12Binding і вибрати пункт Update Definition. Після цього в проекті з'явиться функція getSaleDocNumbersByDate і готовий Request до неї. Для заповнення дати потрібно використовувати формат "YYYY-MM-DDThh: mm: ss" (можна подивитися на w3schools і ДУЖЕ рекомендую користуватися цим сайтом для розуміння роботи з xml)
Тоді вийдуть ось такі запит і відповідь:
5. Пакети XDTO
Якщо необхідно передавати у функції більш складні параметри (наприклад, xml з декількома полями), або отримувати у відповідь складні за структурою xml, то нам не обійтися без пакетів XDTO.
Дуже детально робота з XDTO розглянута в циклі статей XDTO це просто. По суті, пакет визначає структуру і тип полів використовуваних xml-файлів.
Я розгляну приклад передачі і отримання xml-файлу, тип якого визначений в пакеті
- передача в 1с xml-файлу, що не описаного в пакеті, в форматі base64
- отримання з 1с документа pdf у форматі base64 і його декодування
- отримання з 1с xml-файлу з вкладеної структурою елементів і визначення їх кількості
6. Передача в 1с в параметрі xml-файлу, тип якого визначений в пакеті.
Завдання буде така: знайти документ видаткової накладної за заданими у вхідному xml номеру і дати і повернути знайдений документ. Повертати потрібно також у вигляді xml з номером, датою, контрагентом і його кодом і табличній частиною товарів.
Створимо пакет packet1 з простором імен packet1_ns. Для вхідного xml-файлу визначимо тип об'єкта InDocSaleQuery з полем number типу string і полем date типу dateTime. Для вихідного файлу визначимо спочатку тип для одного рядка табличної частини товарів: SaleItem з полями name типу string, price sum, quantity типу decimal. А сам документ SaleDoc буде у нас складеного типу: поля number, date, partnerName і поле SaleItems у якого буде тип SaleItem і максимальну кількість -1. Саме таке поле позначає, що в ньому може бути присутнім масив з декількох елементів. Ось так все це виглядає в конфігураторі:
Далі у властивостях веб-сервісу потрібно задати використання пакета XDTO packet1_ns. getSaleDoc з типом значення, що повертається SaleDoc і вхідним параметром incomingXML типу InDocSaleQuery.
Спочатку продемонструю код функції, а вже потім поясню що відбувається
Тут два основних аспекти. Перший: так як було поставлено тип вхідного параметра incomingXML і він був описаний цей тип в пакеті, то відразу можливо звертатися до полів цього входить xml. Другий: робота з фабрикою XDTO. З неї було отримано тип для результуючих вихідних параметрів і створено ЗначеніеXDTO цього типу, у якого були заповнені необхідні поля. Також варто зауважити, що в типі SaleDoc слід ввести окреме поле для помилки, але для тестових цілей помилки будуть записані в поле number.
Ось як виглядає результат цього запиту в SoapUI:
Як видно, все працює, але ще є що поліпшити - наприклад, хотілося б знати скільки елементів SaleItems у нас в документі.
Про це та про більш складних прикладах я розповім вже в наступній статті.
У доданому архіві - вивантаження інформаційної бази і проект SoapUI.