Использование внешних веб-сервисов в 1С на примере загрузки курсов валют

в 9:19, , рубрики: 1с must die, 1с предприятие 8, web-services, конфигурирование, Программирование, разработка, метки: , , , ,

Знаю, что на хабре не очень-то жалуют многострадальную 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-ссылки, но использовать его не обязательно, к сервису можно обращаться динамически из кода. Я буду использовать первый вариант, а затем покажу, как можно использовать второй. В конфигурации создал обработку и назвал ее «ЗагрузкаКурсовВалютЦБР». Добавил форму (управляемую) и сделал ее основной. На форме я создал реквизиты и разместил элементы управления так, как показано на рисунке.

Использование внешних веб сервисов в 1С на примере загрузки курсов валют

Сейчас самое главное – создаем ссылку на описание веб-сервиса. В конфигурации добавляем новый объект типа WS-ссылка. В появившемся окне указываем ссылку на WSDL (описание данного формата выходит за рамки статьи, вы можете почитать о нем на Википедии): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL.

Использование внешних веб сервисов в 1С на примере загрузки курсов валют

1С на основании полученного описания автоматически создаст визуальную карту веб-сервиса. Можно увидеть название веб-сервиса, посмотреть какие у него доступны операции а так же используемые типы данных.

Использование внешних веб сервисов в 1С на примере загрузки курсов валют

Конфигурирование на этом почти закончено, осталось сделать пару штрихов для того, чтобы наше приложение выглядело более эстетично. Кликнем правой кнопкой мыши по корню конфигурации и вызовем меню «Открыть командный интерфейс рабочего стола». В появившемся окне необходимо снять флаг «Видимость» напротив обработки «Загрузка курсов валют ЦБР». Нажмем кнопку Ок. Далее еще правый клик по корню конфигурации и вызовем меню «Открыть рабочую область рабочего стола», там сделаем настройку как на рисунке:

Использование внешних веб сервисов в 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). Если все сделали верно, то должны увидеть окно как на рисунке ниже:

Использование внешних веб сервисов в 1С на примере загрузки курсов валют

Чтобы проверить результат, нам нужно ввести дату, на которую хотим получить курсы валют и нажать на кнопку «Загрузить валюты». В случае успешного запроса, таблица на форме заполнится значениями курсов:

Использование внешних веб сервисов в 1С на примере загрузки курсов валют

Напоследок хочу показать, как можно обратиться динамически к внешнему веб-сервису, то есть без добавления объекта WS-ссылка. Таким образом, мы можем использовать такие веб-сервисы из внешних обработок без привязки к конфигурации.

В процедуре ЗагрузитьКурсыВалют() строку

Прокси = WSСсылки.CBR_DailyInfoWebServ.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");

необходимо заменить двумя следующими строками

Определения = Новый WSОпределения("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
Прокси = Новый WSПрокси(Определения, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");

Сначала мы создаем так называемые определения для веб-сервиса из его WSDL. Затем так же создаем прокси для обращения к нему.

Как видно, использовать внешние веб-сервисы из 1С в целом довольно просто (хотя и есть некоторая сложность в понимании определения типов, у меня в том числе).

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

По ссылке можно скачать конфигурацию с примером (cf-файл).

Автор: mix2000

* - обязательные к заполнению поля