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

04.12.12

Интеграция - WEB-интеграция

С некоторых пор в 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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15745    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17548    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16358    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25737    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88579    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ardn 622 04.12.12 12:45 Сейчас в теме
Интересно было бы узнать, как соединить 1С с сайтами с REST API с аутентификацией
2. mix 90 04.12.12 13:00 Сейчас в теме
(1) насколько я помню, на ИТС есть заметка об использовании REST-сервисов.
3. mix 90 04.12.12 13:01 Сейчас в теме
Подскажите, как раскрасить код в статье?
4. necropunk 9 05.12.12 14:47 Сейчас в теме
Просто, понятно, новичкам сгодится. Про раскрашивание вот тут http://infostart.ru/public/66592/ в пятом пункте рекомендуют воспользоваться этим http://infostart.ru/public/19856/ или вот этим http://infostart.ru/public/62249/
5. mkostya 30 05.12.12 20:58 Сейчас в теме
таких примеров уже штук пять точно предлагаю сделать наоборот.
Веб сервис по выдаче инофрмации.
Например, сервис по проверке задолженности контрагента путем ввода ИНН используя данные БД. На сайте вводим ИНН и 1С нам отвечает, долгов по Вам нету или сумма задолженности если она есть.
9. Yashazz 4709 06.12.12 13:35 Сейчас в теме
Да уж, очередной баян.
Согласен с (5), вы лучше примерчик 1С-провайдера сделайте.
6. CagoBHuK 32 06.12.12 09:55 Сейчас в теме
А чем не нравится статься про аэропорт?
7. mix 90 06.12.12 10:02 Сейчас в теме
(6) CagoBHuK, там веб-сервис давно не рабочий.
8. CagoBHuK 32 06.12.12 10:09 Сейчас в теме
(7) Дело не в работе веб-сервиса, а в понимании основных принципов. Вообще, прежде, чем пытаться что-то сделать, нужно ознакомиться с первоисточниками. Хотя бы тут: http://www.w3.org/TR/soap/ После этого не нужен будет живой веб-сервис для написания нескольких строчек кода.
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. garikxxx 21.11.16 01:15 Сейчас в теме
(11) vgrichuk,
есть немного другая задача и никак не могу решить ее, был бы очень признателен за помощь
13. user642695_crocus.vladikina 29.04.19 15:43 Сейчас в теме
(11) а, вот в чем дело ! понятно
{Обработка.ЗагрузкаКурсовВалютЦБР.Форма.Форма.Форма(18)}: Метод объекта не обнаружен (СоздатьWSПрокси)
Прокси = метаданные.WSСсылки.WSLink.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfo");
14. user642695_crocus.vladikina 29.04.19 15:44 Сейчас в теме
ваш пример не рабочий с прокси. поэтому ?
15. ErrorEd88 53 21.03.22 15:22 Сейчас в теме
а как сделать отбор, чтобы только определенную валюту загружать и не перебирать в цикле?
user1508952; +1 Ответить
20. user832283 27.10.22 10:31 Сейчас в теме
(15) Метод GetCursDynamic http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx
Соответствие между кодами валют ОКР и кодами ЦБ РФ в методе EnumValutes
ErrorEd88; +1 Ответить
21. Xershi 1474 07.03.24 17:40 Сейчас в теме
(20) увы метод корявый. Пришлось отказаться. В моей логике курс должен быть на каждую дату. А по выходным этот метод ничего не отдает.
МестоположениеWSDL = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL";

WSОпределение = Новый WSОпределения(МестоположениеWSDL);

ПространствоИмен = "http://web.cbr.ru/";

//Создаем прокси для обращения к внешнему веб-сервису,
// передаем в функцию URI пространства имен, имя сервиса, имя порта.
Прокси = Новый WSПрокси(WSОпределение, ПространствоИмен, "DailyInfo", "DailyInfoSoap");

//Получаем тип параметра, который передается в метод GetCursOnDate.
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить(ПространствоИмен).Получить("GetCursOnDate");
//ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить(ПространствоИмен).Получить("GetCursDynamic");

//Создаем параметр на основе типа и заполняем значение параметра On_Date.
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);

// Параметры GetCursOnDate
WSПараметр.On_Date = ДатаКурса;

// Параметры GetCursDynamic
//WSПараметр.FromDate		= ДатаКурса;
//WSПараметр.ToDate		= ДатаКурса;
//WSПараметр.ValutaCode	= Строка.СимвольныйКод;

//Вызываем метод веб-сервиса, записываем результат в переменную КурсыВалют.
КурсыВалютЦБРФ = Прокси.GetCursOnDate(WSПараметр);
//КурсыВалютЦБРФ = Прокси.GetCursDynamic(WSПараметр);

ТаблицаКурсыВалютЦБРФ = КурсыВалютЦБРФ.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate;
// Падает, т.к. нету данныех на выходные!
//КурсВалютЦБРФ = КурсыВалютЦБРФ.GetCursDynamicResult.diffgram.ValuteData.ValuteCursDynamic;

НайденаВалютаЦБРФ = Ложь;

КурсВалютыЦБРФ = 0;
КратностьВалютыЦБРФ = 0;

Для Каждого СтрокаКурсовЦБРФ Из ТаблицаКурсыВалютЦБРФ Цикл
	
	Если СтрокаКурсовЦБРФ.VchCode = КодВалютыЦБРФ Тогда
		
		НайденаВалютаЦБРФ	= Истина;
		КурсВалютыЦБРФ		= СтрокаКурсовЦБРФ.Vcurs;
		КратностьВалютыЦБРФ	= СтрокаКурсовЦБРФ.Vnom;
		Прервать;
		
	КонецЕсли;
	
КонецЦикла;

//Если ТипЗнч(КурсВалютЦБРФ) = Тип("ОбъектXDTO") Тогда
//	
//	НайденаВалютаЦБРФ	= Истина;
//	КурсВалютыЦБРФ		= КурсВалютЦБРФ.Vcurs;
//	КратностьВалютыЦБРФ	= КурсВалютЦБРФ.Vnom;
//	
//КонецЕсли;

Если НайденаВалютаЦБРФ Тогда
	
	КурсВалютыНаДату.Cur_Name			= Строка.Представление;
	КурсВалютыНаДату.Cur_OfficialRate	= КурсВалютыНаДату.Cur_Scale / (Число(СокрЛП(КурсВалютыЦБРФ)) * Число(СокрЛП(КратностьВалютыЦБРФ)));
	
	ЗагрузитьКурсыВалютВРегистр(КурсВалютыНаДату, ТекстСообщения, Ложь);
	
Иначе
	
	ТекстСообщения = "Не удалось получить курс ЦБРФ по отношению к " + Строка.Представление + " на " + Формат(ДатаКурса, "ДЛФ=DD") + "!";
	
КонецЕсли;
Показать

Плюс для него еще нужно хранить в 1С ИД валюты, который к классификатору и человекочитаемым значениям никакого отношения не имеет.
16. пользователь 13.06.22 23:07
Сообщение было скрыто модератором.
...
17. пользователь 13.06.22 23:35
Сообщение было скрыто модератором.
...
18. пользователь 13.06.22 23:45
Сообщение было скрыто модератором.
...
19. пользователь 15.06.22 07:17
Сообщение было скрыто модератором.
...
Оставьте свое сообщение