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

1C Web Service

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

1C Web Service

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

1C Web Service

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

1C Web Service

Эти настройки позволят нам отобразить форму обработки прямо на рабочем столе (имеется ввиду рабочий стол программы 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). Если все сделали верно, то должны увидеть окно как на рисунке ниже:

1C Web Service

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

1C Web Service

Напоследок хочу показать, как можно обратиться динамически к внешнему веб-сервису, то есть без добавления объекта 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-файл).