Как использовать в 1с веб сервис. Вызов Web-сервиса с помощью динамической ссылки
Web-сервис в 1С 8.3 и 8.2 — объект метаданных, позволяющий интегрировать платформу 1С с другими информационными системами при помощи сервис-ориентированной архитектуры (SOA).
Рассмотрим создание и настройку на примере веб-сервиса, позволяющего производить двухсторонний обмен между базами 1С 8 по средству SOAP.
Для начала обратим внимание на вкладку Прочее:
Получите 267 видеоуроков по 1С бесплатно:
- В поле URI пространства имен описывается расположение идентификатора ресурса.
- — описание типов, с которыми сможет работать будущий веб-сервис.
- Имя файла публикации — название файла *.1CWS, который будет размещен на веб-сервере
Структура веб-сервиса 1С
Рассмотрим структуру веб-сервиса:
DataExchange — сам web-сервис. UnloadData, LoadData — операции, по сути, описание функций, которые можно вызывать по протоколу SOAP. ExchangePlanName, NodeCode и т.д. — передаваемые веб-сервису значения.
Модуль веб-сервиса
В модуле закладывается самое интересное — описание функций будущего веб-сервиса. В нашем случае мы описываем функционал, позволяющий получать и отправлять данные, используя стандартные механизмы обмена 1С. Т.к. обмен идёт между одной платформой — 1С, то они не требуют сериализации данных.
Проверка работы http сервиса 1С на веб-сервере
Знаю, что на хабре не очень-то жалуют многострадальную 1С. Хотя, с выходом платформы 8.3 (с клиентами под Linux), ее стали любить несколько больше. Кстати, так же, совсем недавно интерфейс одной из основных разработок 1С – конфигурация Управление производственным предприятием – был полностью переведен на английский язык. Много раз я встречал вопросы о том, почему здесь не пишут об 1С. Ответ на них довольно очевиден – существует множество специализированных ресурсов, где можно оперативно обсудить все вопросы и что-то почитать.
Есть все основания полагать, что эта статья здесь не выживет, но я все же рискну, потому что в 1С есть некоторые интересные вещи, о которых стоит рассказать.
С некоторых пор в 1С 8.х появилась возможность использования веб-сервисов: 1С может выступать как поставщиком, так и потребителем. В этой статье я покажу, как использовать 1С в качестве потребителя на примере получения курсов валют с сервера ЦБР.
Веб-сервис
У Центробанка существует веб-сервис для получения ежедневных данных: курсы валют, новости, динамика курсов и т.д. Описание сервиса можно найти здесь http://www.cbr.ru/scripts/Root.asp?Prtid=DWS . Нас интересует один из методов этого сервиса: GetCursOnDate(On_date) – получение курсов валют на заданную дату. В метод передается один аргумент On_date – это дата, на которую требуется получить курсы. В результате возвращается XML, содержащий таблицу ValuteCursOnDate (сами курсы и сопутствующая информация).Конфигурирование
Для разработки я взял 1С 8.2 (8.2.15.317 в моем случае) и создал пустую конфигурацию. Для использования внешних веб-сервисов предусмотрен объект WS-ссылки, но использовать его не обязательно, к сервису можно обращаться динамически из кода. Я буду использовать первый вариант, а затем покажу, как можно использовать второй. В конфигурации создал обработку и назвал ее «ЗагрузкаКурсовВалютЦБР». Добавил форму (управляемую) и сделал ее основной. На форме я создал реквизиты и разместил элементы управления так, как показано на рисунке.Сейчас самое главное – создаем ссылку на описание веб-сервиса. В конфигурации добавляем новый объект типа WS-ссылка. В появившемся окне указываем ссылку на WSDL (описание данного формата выходит за рамки статьи, вы можете почитать о нем на Википедии): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL .
1С на основании полученного описания автоматически создаст визуальную карту веб-сервиса. Можно увидеть название веб-сервиса, посмотреть какие у него доступны операции а так же используемые типы данных.
Конфигурирование на этом почти закончено, осталось сделать пару штрихов для того, чтобы наше приложение выглядело более эстетично. Кликнем правой кнопкой мыши по корню конфигурации и вызовем меню «Открыть командный интерфейс рабочего стола». В появившемся окне необходимо снять флаг «Видимость» напротив обработки «Загрузка курсов валют ЦБР». Нажмем кнопку Ок. Далее еще правый клик по корню конфигурации и вызовем меню «Открыть рабочую область рабочего стола», там сделаем настройку как на рисунке:
Эти настройки позволят нам отобразить форму обработки прямо на рабочем столе (имеется ввиду рабочий стол программы 1С) в режиме 1С Предприятие.
Программирование
Теперь осталось наполнить смыслом нашу обработку: заставить ее получать курсы валют и отображать в таблице на форме. В режиме редактирования формы необходимо добавить новую команду формы, назовем ее ЗагрузитьВалюты. Эту команду необходимо связать с кнопкой, расположенной на форме. Действие для команды заполним следующим кодом (прим. автора: ничего себе, на хабре есть подсветка кода 1С, правда она работает не корректно): &НаКлиенте
Процедура ЗагрузитьВалюты(Команда)
Если НЕ ЗначениеЗаполнено(ДатаЗагрузки) Тогда
Сообщить("Не выбрана дата загрузки!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
ТаблицаКурсовВалют.Очистить();
ЗагрузитьКурсыВалют(ДатаЗагрузки);
КонецПроцедуры
Здесь сначала проверяется, заполнена ли дата (если не заполнена, то сообщаем об этом пользователю и больше ничего не делаем). Затем очищается таблица, расположенная на форме и вызывается процедура ЗагрузитьКурсыВалют(), в которую передается дата.
Код процедуры ЗагрузитьКурсыВалют(), пояснения данны в комментариях к коду:
Процедура ЗагрузитьКурсыВалют(фДатаЗагрузки)
//Создаем прокси для обращения к внешнему веб-сервису,
// передаем в функцию URI пространства имен, имя сервиса, имя порта.
Прокси = WSСсылки.CBR_DailyInfoWebServ.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
//Получаем тип параметра, который передается в метод GetCursOnDate.
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://web.cbr.ru/").Получить("GetCursOnDate");
//Создаем параметр на основе типа и заполняем значение параметра On_Date.
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.On_Date = фДатаЗагрузки;
//Вызываем метод веб-сервиса, записываем результат в переменную КурсыВалют.
КурсыВалют = Прокси.GetCursOnDate(WSПараметр);
//Перебираем таблицу ValuteCursOnDate, каждое значение таблицы
// добавляем в таблицу на форме (колонки заполняем соответствующими значениями).
Для Каждого Элемент Из КурсыВалют.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate Цикл
НоваяСтрокаТЗ = ТаблицаКурсовВалют.Добавить();
НоваяСтрокаТЗ.НазваниеВалюты = Элемент.Vname;
НоваяСтрокаТЗ.Номинал = Элемент.Vnom;
НоваяСтрокаТЗ.ЦифровойКодВалюты = Элемент.Vcode;
НоваяСтрокаТЗ.СимвольныйКодВалюты = Элемент.VChCode;
НоваяСтрокаТЗ.КурсВалюты = Элемент.Vcurs;
КонецЦикла;
КонецПроцедуры
Теперь можно обновлять конфигурацию БД (F7) и запускать 1С Предприятие (F5). Если все сделали верно, то должны увидеть окно как на рисунке ниже:
Чтобы проверить результат, нам нужно ввести дату, на которую хотим получить курсы валют и нажать на кнопку «Загрузить валюты». В случае успешного запроса, таблица на форме заполнится значениями курсов:
Напоследок хочу показать, как можно обратиться динамически к внешнему веб-сервису, то есть без добавления объекта WS-ссылка. Таким образом, мы можем использовать такие веб-сервисы из внешних обработок без привязки к конфигурации.
В процедуре ЗагрузитьКурсыВалют() строку
Определения = Новый WSОпределения("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
Прокси = Новый WSПрокси(Определения, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Сначала мы создаем так называемые определения для веб-сервиса из его WSDL. Затем так же создаем прокси для обращения к нему.
Как видно, использовать внешние веб-сервисы из 1С в целом довольно просто (хотя и есть некоторая сложность в понимании определения типов, у меня в том числе).
Если данная публикация найдет здесь отклик, то есть еще несколько тем, о которых можно рассказать.
Механизм Web-сервисов позволяет использовать систему, написанную на платформе 1С, как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими информационными системами с использованием сервис-ориентированной архитектуры (SOA).
Платформа 1С позволяет разработчику вызывать Web-сервисы, предоставляемые другими поставщиками, двумя способами:
- с помощью статических ссылок, создаваемых в дереве объектов конфигурации;
- с помощью динамических ссылок, создаваемых средствами встроенного языка.
При использовании динамической ссылки, описание Web-сервиса получается каждый раз при вызове Web-сервиса. Скорость работы при этом уменьшается, но зато такой подход обеспечивает актуальность описания Web-сервиса поставщика, то есть используется последняя версия WSDL-документа. В случае же использования статических ссылок для получения актуального описания Web-сервиса требуется выполнить повторный импорт WSDL-документа средствами конфигуратора и затем сохранить измененную конфигурацию.
*WSDL-документ - язык описания веб-сервисов и доступа к ним, основанный на языке XML.
Рассмотрим пример вызова Web-сервиса с помощью динамической ссылки на примере сервиса проверки правописания Яндекс.Спеллер. Для доступа к Яндекс.Спеллеру по HTTP предлагаются XML-, SOAP-, JSON- и JSONP-интерфейсы. Все интерфейсы обеспечивают одинаковую функциональность и используют одни и те же входные параметры. WSDL-документ для SOAP доступен по адресу: http://speller.yandex.net/services/spellservice?WSDL .
Функция вызова Web-сервиса:
// Функция осуществляет проверку правописания текста.
// Параметры
// ПроверяемыйТекст - Строка - текст для проверки правописания.
// Возвращаемое значение:
// Строка - слова, в которых допущены ошибки.
&НаСервере
Функция ПроверитьОрфографию(ПроверяемыйТекст)
МестоположениеWSDL = "http://speller.yandex.net/services/spellservice?WSDL";
WSОпределение = Новый WSОпределения(МестоположениеWSDL);
ПространствоИмен = "http://speller.yandex.net/services/spellservice";
SpellService = Новый WSПрокси(WSОпределение, ПространствоИмен, "SpellService", "SpellServiceSoap");
Ответ = SpellService.checkText(ПроверяемыйТекст);
Ошибки = "";
Для Каждого Ошибка Из Ответ.error Цикл
Ошибки = Ошибки + "Ошибка в слове: " + Ошибка.word + Символы.ПС;
КонецЦикла;
Возврат Ошибки;
КонецФункции // ПроверитьОрфографию()
В данной функции создается объект WSОпределения , который получает определение Web-сервиса из WSDL-документа, адрес документа приведен выше.
На основе определения Web-сервиса создается объект WSПрокси и связывается с точкой подключения Web-сервиса SpellServiceSoap .
Для инициализации объекта WSПрокси
вся необходимая информация содержится в элементе
Адрес пространства имени содержится в теге targetNamespace
корневого элемента WSDL-документа
3. Адрес пространства имени Web-сервиса |
4. Операции Web-сервиса и их типы входящих и исходящих сообщений |
К сожалению, платформа 1С во всем объеме не поддерживает работу с Web-сервисами средствами встроенного языка, например, задать значения атрибутов lang, options, format
для входящего сообщения операции checkText()
становится невозможным, так как нам дозволено только передавать параметры операции:
5. Описание входящего сообщения операции checkText() |
А так, работать можно! :)
Обработку вызова веб-сервиса Яндекс.Спеллер можно скачать по этой
Благо ограничений на работу с веб-сервисами в ней нет.
Добавление Web-сервиса в метаданные
Открываем дерево конфигурации, ветка Общие , далее Web-сервисы , добавляем новый веб-сервис (назову его my_ws) и заполняем свойства как показано на рисунке.
Необходимо сделать несколько пояснений о свойствах веб-сервисов
- Пакеты XDTO — в этом поле указывается список пакетов XDTO, типы которых могут использоваться в значении, которое возвращается в результате выполнения операций веб-сервиса.
- URI пространства имен — это строка, которая задает URI пространства имен для данного веб-сервиса. Любой веб-сервис можно однозначно идентифицировать по сочетанию его имени и пространству имен. Необходимо четко понимать, что это свойство не имеет ничего общего ни с физическим адресом веб-сервера, ни с сайтом органицации и т.д. Это просто некий виртуальный адрес. Поэтому присваивать надо внятное имя, которое сможет рассказать, например, об области расположения и применения веб сервиса. В частности может присутствовать аббревиатура типовой конфигурации к которой веб-сервис относится.
Операции веб-сервиса
Чтобы обеспечить функционирование веб-сервиса, необходимо создать для него операции, которые будут выполнять определенные действия, а при необходимости и возвращать нужные данные.
В качестве примера создадим для нашего веб-сервиса операцию, которая будет возвращать классическую фразу «Привет мир!». Назовем ее Hello :
В модуле веб-сервиса создадим функцию ПриветМир() , ссылку на которую вставим в соответствующее свойство операции.
Функция ПриветМир() Возврат "Привет мир!" ; КонецФункцииНо у этой операции есть один недостаток. В нее нельзя передавать исходные данные. Для этих целей в операциях веб-сервисов используется подчиненные им объекты — Параметры .
Добавим еще одну операцию — HelloUsr , и создадим для нее параметр Name .
Эта операция будет у нас возвращать приветствие пользователю при помощи вызова вот такой функции:
Функция ПриветПользователь(ИмяПользователя) Возврат "Привет, " + ИмяПользователя + "!" ; КонецФункцииПубликация Web-сервиса
Теперь у нас все готово для публикации веб-сервиса. Для этого необходимо зайти в конфигуратор под правами администратора. Щелкаем по ярлыку 1С правой кнопкой и выбираем соответствующий пункт меню:
В меню выбираем Администрирование —> Публикация на веб-сервере
В открывшемся окне прописываем имя публикации, отмечаем пункт Публиковать Web-сервисы и также отмечаем созданный нами веб-сервис:
WS-ссылки
Для работы с веб-сервисами используется такой объект 1С как WS-ссылка . Она представляет собой WSDL описание веб-сервиса полученное путем импорта из источника на котором расположен веб-сервис. То есть в первую очередь нам надо знать адрес по которому мы сможем получить WSDL описание веб-сервиса. Применительно к нашему примеру в соответствии с настройками, которые мы делали в процессе создания и публикации веб-сервиса этот адрес будет выглядеть следующим образом
Http://localhost/professia1c/ws/my_ws.1cws?wsdl
Рассмотрим из каких же частей состоит этот адрес.
- http://localhost/ — это адрес указывает на физическое расположение веб-сервера. Так как у меня он находится на локальной машине, то localhost, а на практике это либо IP-адрес сервера, либо его имя
- professia1c — это имя публикации. Мы его вводили в поле Имя в диалоговом окне, когда публиковали веб-сервис
- ws — признак того, что мы обращаемся к веб сервису
- my_ws.1cws — имя файла публикации, которое мы указывали в свойствах при создании веб-сервиса
- ?wsdl — параметр, который указывает, что нам нужно получить WSDL описание
После публикации веб-сервиса, для того чтобы убедиться, что он успешно опубликован, можно ввести адрес его WSDL описания в адресную строку браузера. При этом мы должны получить в окне браузера XML файл примерно вот такого содержания:
- Использование динамической ws-ссылки.
- Создание статической ws-ссылки.
Рассмотрим каждый из этих способов
Динамические WS-ссылки
&НаСервере Процедура ПодключитьсяНаСервере() ВСОпределение = Новый WSОпределения("http://localhost/professia1c/ws/my_ws.1cws?wsdl" , "Сидоров" , "" ) ; ВСПрокси = Новый WSПрокси(ВСОпределение, "http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедурыКак нетрудно догадаться, результатом выполнения этой процедуры будет текст в окне сообщения «Привет, Вася!»
Статические WS-ссылки
Вместо программного создания объекта WSОпределения мы можем непосредственно в дереве конфигурации создать объект метаданных WS-ссылка. В процессе создания будет выведено окно с предложением указать адрес WSDL определения для его импорта:
После этого мы можем в коде ссылаться непосредственно на эту WS-ссылку. И процедура по обращению к веб-сервису примет вот такой вид:
&НаСервере Процедура ПодключитьсяЧересСсылкуНаСервере() ВСПрокси = WSСсылки. WSСсылка_my_ws. СоздатьWSПрокси("http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры