IE2017

Использование внешних веб­сервисов в 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Ссылки.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-файл).


Впервые опубликовано на habrahabr.ru

См. также

Комментарии
1. Юрий Былинкин (ardn) 75 04.12.12 12:45 Сейчас в теме
Интересно было бы узнать, как соединить 1С с сайтами с REST API с аутентификацией
2. Michael (mix) 67 04.12.12 13:00 Сейчас в теме
(1) ardn, насколько я помню, на ИТС есть заметка об использовании REST-сервисов.
3. Michael (mix) 67 04.12.12 13:01 Сейчас в теме
Подскажите, как раскрасить код в статье?
4. Сергей necropunk (necropunk) 5 05.12.12 14:47 Сейчас в теме
Просто, понятно, новичкам сгодится. Про раскрашивание вот тут http://infostart.ru/public/66592/ в пятом пункте рекомендуют воспользоваться этим http://infostart.ru/public/19856/ или вот этим http://infostart.ru/public/62249/
5. Максим Костиков (mkostya) 23 05.12.12 20:58 Сейчас в теме
таких примеров уже штук пять точно предлагаю сделать наоборот.
Веб сервис по выдаче инофрмации.
Например, сервис по проверке задолженности контрагента путем ввода ИНН используя данные БД. На сайте вводим ИНН и 1С нам отвечает, долгов по Вам нету или сумма задолженности если она есть.
6. Данила Елистратов (CagoBHuK) 27 06.12.12 09:55 Сейчас в теме
А чем не нравится статься про аэропорт?
7. Michael (mix) 67 06.12.12 10:02 Сейчас в теме
(6) CagoBHuK, там веб-сервис давно не рабочий.
8. Данила Елистратов (CagoBHuK) 27 06.12.12 10:09 Сейчас в теме
(7) Дело не в работе веб-сервиса, а в понимании основных принципов. Вообще, прежде, чем пытаться что-то сделать, нужно ознакомиться с первоисточниками. Хотя бы тут: http://www.w3.org/TR/soap/ После этого не нужен будет живой веб-сервис для написания нескольких строчек кода.
9. Яков Коган (Yashazz) 2103 06.12.12 13:35 Сейчас в теме
Да уж, очередной баян.
Согласен с (5), вы лучше примерчик 1С-провайдера сделайте.
10. Вячеслав (SlavaK) 27.11.15 17:15 Сейчас в теме
Спасибо за простой пример!
11. Владимир Гричук (vgrichuk) 10.11.16 17:26 Сейчас в теме
ЦБ перестал отдавать этот вебсервис по http, только по https. Для исправления надо сделать в коде небольшие изменения:
ssl1 = Новый ЗащищенноеСоединениеOpenSSL();
Определения = Новый WSОпределения("https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL",,,,,ssl1);
Прокси = Новый WSПрокси(Определения,"http://web.cbr.ru/","DailyInfo","DailyInfoSoap",,,ssl1);

далее всё по-старому
12. Alex Alex (garikxxx) 21.11.16 01:15 Сейчас в теме
(11) vgrichuk,
есть немного другая задача и никак не могу решить ее, был бы очень признателен за помощь
Оставьте свое сообщение