Краткое описание
Web-сервисы – это объект метаданных, в модуле которого можно описать методы доступные для использования сторонними программами (после публикации на веб-сервере). Для доступа к web сервису используется протокол SOAP. Для описания структуры передаваемых данных используются XDTO-пакеты. Более подробно про XDTO можно почитать в статье – Работа с XML через механизм XDTO с примерами.
В данной статье рассмотрен пример создания веб-сервиса “Данные сотрудника”, который по табельному номеру возвращает ФИО сотрудника и таблицу с данными по рабочему времени состоящую из дата и отработанных часов.
Файлы материала
Расширения с примерами доступны для скачивания по ссылке.
В коде расширения необходимо изменить логин ,пароль и адрес публикации (http://192.168.21.0/zup31) на подходящие для подключения к вашей базе с web сервисом.
Подготовка
Для работы необходимо установить любой веб-сервер (Apache, IIS) для дальнейшей публикации на нем web-сервиса. Если веб-сервис находится в расширении, то необходимо в публикации установить флаг “Публиковать Web-сервисы расширений по умолчанию”.
Для отладки в файл публикации default.vrd необходимо добавить строчку со следующим содержанием
XHTML
<debug enable="true" protocol="tcp" url="tcp://localhost"/>
И перезапустить веб-сервер, после этого будет срабатывать точка остановы.
Пример реализации Web-сервиса в базе 1С ЗУП
Создадим XDTO-пакет с именем “АВ_ДанныеСотрудника”, что бы описать структуру передаваемых данных (аналогичный XDTO-пакет был создан в статье Работа с XML через механизм XDTO с примерами).
В данном пакете создадим “тип объекта” ДанныеПоРабочемуВремени со свойствами:
Дата - тип string из пространства имен http://www.w3.org/2001/XMLSchema
РабочееВремя - тип int из пространства имен http://www.w3.org/2001/XMLSchema
И “тип объекта” Сотрудник со свойствами:
ФИО - тип string из пространства имен http://www.w3.org/2001/XMLSchema
ТабельныйНомер - тип string из пространства имен http://www.w3.org/2001/XMLSchema
ДанныеПо РабочемуВремени - тип ДанныеПоРабочемуВремени из пространства имен https://www.myblog-1c.ru
- После этого создадим одноименный веб-сервис “АВ_ДанныеПоСотруднику“. Установим пакет XDTO, пространство имен и имя для публикации.
2. В нем создадим единственный метод “Получить” и свяжем с одноименной функцией.
3. Добавим один входной параметр “НомерДокумента“, который не может быть пустым.
4. Опишем функцию к которая будет формировать данные по сотруднику и возвращать их в стороннюю программу.
Функция Получить(НомерДокумента)
СотрудникСсылка = Справочники.Сотрудники.НайтиПоКоду(НомерДокумента);
Если НЕ ЗначениеЗаполнено(СотрудникСсылка) Тогда
Возврат Неопределено;
КонецЕсли;
// получить тип объектов XDTO
ДанныеПоРабочемуВремениТип = ФабрикаXDTO.Тип("https://www.myblog-1c.ru", "ДанныеПоРабочемуВремени");
СотрудникТип = ФабрикаXDTO.Тип("https://www.myblog-1c.ru", "Сотрудник");
// созадть объект XDTO "сотрудник" и заполнить свойства
Сотрудник = ФабрикаXDTO.Создать(СотрудникТип);
Сотрудник.ФИО = СотрудникСсылка.Наименование;
Сотрудник.ТабельныйНомер = СотрудникСсылка.Код;
// созадть объект XDTO "данных по времени 1" и заполнить свойства
ДанныеПоРабочемуВремени = ФабрикаXDTO.Создать(ДанныеПоРабочемуВремениТип);
ДанныеПоРабочемуВремени.Дата = Дата(2023,3,1);
ДанныеПоРабочемуВремени.ВремяПоТабелю = 5;
// добавить строку к сотруднику
Сотрудник.ДанныеПоРабочемуВремени.Добавить(ДанныеПоРабочемуВремени);
// созадть объект XDTO "данных по времени 2" и заполнить свойства
ДанныеПоРабочемуВремени = ФабрикаXDTO.Создать(ДанныеПоРабочемуВремениТип);
ДанныеПоРабочемуВремени.Дата = Дата(2023,3,2);
ДанныеПоРабочемуВремени.ВремяПоТабелю = 8;
// добавить строку к сотруднику
Сотрудник.ДанныеПоРабочемуВремени.Добавить(ДанныеПоРабочемуВремени);
Возврат Сотрудник;
КонецФункции
После публикации веб сервис будет доступен для клиентских приложений.
Пример обращения к Web-сервису на стороне клиента
Перед обращения к веб сервису необходимо создать Прокси подключение, данную операцию можно сделать двумя способами:
1. С использованием статической WS ссылки (Более быстрое подключение к источнику, но необходимо создать объект в дереве метаданных)
В момент создания WS-ссылки будут прочитаны данные по структуре XDTO и протоколу SOAP из Web-сервиса в базе источнике.
2. С использованием динамической WS ссылки (Более медленный, учитывает изменения веб-сервиса и XDTO-пакета в источнике “на лету”)
Пример кода получения данных из другой конфигурации, адрес публикации (http://192.168.21.0/zup31) и Логин / Пароль для входа в базу необходимо заменить на свои.
Процедура ПолучитьДанныеСотрудникаНаСервере(Знач ТабельныйНомер)
Логин = "Администратор";
Пароль = "";
//ТабельныйНомер = "0000-00001";
//// Пример создания "Прокси" с использованием статической WS ссылки
//Прокси = WSСсылки.АВ_ДанныеСотрудника.СоздатьWSПрокси("https://www.myblog-1c.ru", "АВ_ДанныеСотрудника", "АВ_ДанныеСотрудникаSoap");
//Прокси.Пользователь = Логин;
//Прокси.Пароль = Пароль;
// Создание "Прокси" с использованием динамической WS ссылки
Определение = Новый WSОпределения("http://192.168.21.0/zup31/ws/worker.1cws?wsdl", Логин, Пароль);
Прокси = Новый WSПрокси(Определение, "https://www.myblog-1c.ru", "АВ_ДанныеСотрудника", "АВ_ДанныеСотрудникаSoap");
Прокси.Пользователь = Логин;
Прокси.Пароль = Пароль;
// вызов метода web-сервиса
ДанныеПоСотруднику = Прокси.Получить(ТабельныйНомер);
// обработка результата
Если ДанныеПоСотруднику = Неопределено Тогда
Возврат;
КонецЕсли;
Сообщить("По сотруднику "+ДанныеПоСотруднику.ФИО+" получено рабочее время");
Для Каждого СтрокаВремя Из ДанныеПоСотруднику.ДанныеПоРабочемуВремени Цикл
Сообщить(" - "+Формат(СтрокаВремя.Дата, "ДФ=dd.MM.yyyy")+" - "+Строка(СтрокаВремя.ВремяПоТабелю)+" ч.");
КонецЦикла;
КонецПроцедуры