Павел чистов. Павел чистов Web сервисы 1с 8.2 пример

Веб-сервисы в 1С

В данной статье будет рассмотрены вопросы интеграции 1С с уже существующими веб-сервисами и использование самой 1С как веб-сервиса.

При этом под веб-сервисами будет пониматься системы, работающие в интернете и обеспечивающие взаимодействие с ними не только по SOAP (что является именно веб-сервисом), но и другими способами, включая обычные HTTP(S)-запросы.


Риски использования веб-сервисов 1С

В платформе 1С81 появилась реализация веб-сервисов.

Но их использование чревато рисками:

  1. 1С8 плохо работает через HTTPS, средства диагностики отсутствуют, поэтому понять, почему при наличии сертификата сервис не хочет работать через HTTPS порой невозможно. Выход - реализация веб-сервисов через CURL или поднятие HTTPS-туннеля.
  2. 1С8 придерживается своих правил валидации WSDL-схем. Порой по необъяснимым причинам WSDL-схема не хочет загружаться в WS-ссылку. Узнать причину можно только на партнерском форуме у одного специалиста. Средства диагностики WSDL-схемы отсутствуют, не указывается даже причина или строка, на которой прерывается загрузка схемы.

Правила построения сервисов по продаже

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

Использование внешних SOAP-сервисов

Веб-сервисы SOAP используют WSDL схемы и объекты XDTO для представления данных.

Загрузка WSDL

Для того, чтобы использовать внешний сервис, нужно загрузить его WSDL-схему.

Проверка валидности WSDL-схемы

Иногда WSDL-схема не загружается в 1С. Проверить валидность (правильность) схемы можно любым валидатором WSDL-схем, например http://www.validwsdl.com/ .

Нужно загрузить схему на какой-нибудь http-сайт (можно по ftp) и указать адрес файла, в который загружена схема:

Особенности загрузки WSDL в 1С

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

Обработка для тестирования работающего внешнего веб-сервиса

Для тестирования работающего внешнего веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf» из пакета к этой статье.

Тестирование можно использовать на примере сервиса Morpher , склоняющего имена (адрес сервиса http://www.morpher.ru/WebServices/Morpher.asmx?WSDL):

Таким способом можно протестировать любой сервис, который имеет простые точки входа, содержащие параметры простых типов: число, дата, строка.

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

Стандартные средства отладки сервисов

Для отладки можно использовать программу SoapUI, который может передать произвольный запрос веб-сервису и получить от него ответ.

SOAP и HTTPS

К сожалению, SOAP в 1С достаточно капризно ведет себя при работе через протокол HTTPS, практика показывает, что добиться HTTPS соединения невозможно, хотя возможность и продекларирована в платформе. Сказывается отсутствие средств диагностики и отладки для выяснения причин, из-за которых не устанавливается соединение. Поэтому удобно использовать SOAP через CURL.

Встроенный механизм использования HTTPS подразумевает, что все сертификаты должны быть опубликованы в общем файле pem в каталоге программы 1С.

Использование 1С как сервиса

Правила разработки сервиса на базе 1С

Операция «Hello»

Правилом хорошего тона является создание в сервисе операцию, которая информирует о том, что сервис доступен. Это облегчает жизнь интеграторов, им будет проще проверять, налажена ли связь с сервисом.

Например, можно использовать операцию Hello без параметров, которая просто возвращает булево значение Истина.

Публикация веб-сервиса

Процедура хорошо описана в документации: file:///C:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81.htm#_Toc176167634 :

Задача публикации Web-сервисов сводится к размещению конфигурационных файлов *.1cws Web-сервисов в соответствующем каталоге веб-сервера с соответствующими настройками для веб сервера. Для того, чтобы выполнить публикацию Web-сервисов, следует выполнить команду меню «Администрирование | Публикация Web-сервисов».

В результате выполнения этой команды будет открыто окно публикации Web-сервисов.

Окно публикации Web-сервисов содержит путь к веб-серверу и два списка:

  • «Web-сервисы» - список Web-сервисов конфигурации;
  • «Публикация» - список Web-сервисов, опубликованных на указанном веб-сервере.

С помощью кнопки «Соединение…» следует указать веб-сервер, на котором требуется опубликовать Web-сервисы.

Окно выбора пути к веб-серверу позволяет указать путь двумя способами:

  • на закладке «Файлы» - этот способ используется в том случае, когда публикация выполняется на том же компьютере, на котором установлен веб-сервер. В качестве пути указывается локальный каталог, соответствующий интернет-странице, с которой будет выполняться вызов публикуемого Web-сервера;
  • на закладке «FTP сайт» - этот способ используется в том случае, когда требуется опубликовать Web-сервис на удаленном компьютере. Для выполнения публикации необходимо указать параметры FTP-соединения с удаленным компьютером и каталог, в котором будет опубликован Web-сервис.

Публикация выбранного Web-сервиса осуществляется с помощью кнопки «Опубликовать»

Для отмены публикации Web-сервиса используется кнопка «Удалить».

Публиковать можно в локальном каталоге или по FTP. Можно публиковать и на удаленный сервер по UNC-пути, если удаленный сервер входит в локальную сеть.

После публикации веб-сервис доступен по адресу «http://localhost/test.1cws» или «http://xxx.ru/test.1cws», где xxx.ru - адрес удаленного сервера а localhost - типовой адрес локального сервера.

Авторизация к веб-сервису 1С

Для доступа к сервису нужно пройти аутентификацию.

Вопросы авторизации хорошо рассмотрены тут: http://www.forum.mista.ru/topic.php?id=341168 и в документации file:///c:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81.htm

Обычно веб-сервис работает под одним конкретным пользователем (чаще - специально созданным). Можно пользователя 1С "прикрепить" средствами Windows-аутентификации к пользователю Windows IUSR_ (для пользователя отключить авторизацию 1С). Как вариант, можно очистить список пользователей 1С, тогда авторизация не требуется.

Если требуется несколько пользователей, то можно создать несколько логинов для веб-сервера, к каждому из них привязать пользователя Windows и соответственно, прописать в 1С доступ к пользователям Windows.

В свойствах Пользователь и Пароль объекта WSПрокси используется не логин 1С, а логин пользователя веб-сервера.

Тестирование веб-сервиса 1С

Для тестирования 1С как веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf», как описано в разделе «Тестирование работающего внешнего веб-сервиса».

Файл 1cws и является WSDL-описанием веб-сервиса 1С.

Использование сервисов в Рознице

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

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

Сервис может быть по-разному интегрирован в розничную программу, написанную на языке 1С (УТ, Розница и другие):

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

Организация служебных данных в 1С

Для хранения информации о транзакции в чеке необходимо создать дополнительную табличную часть «Сложные продажи» с реквизитами:

  • Номенклатура - привязка к номенклатуре чека.
  • Параметр - ссылка на справочник «Сложные продажи: Параметры».
  • Значение - значение параметра, составного типа. Строковое представление должно быть довольно длинным (1024 символа), чтобы помещался текст чека.

Справочник «Сложные продажи: Параметры» содержит перечень параметров транзакции.

Табличную часть выгоднее использовать, чем набор реквизитов, т.к. у транзакции их может быть очень много, а в других чеках, не связанных с сервисом, эти реквизиты не будут использоваться, и будут занимать лишнее место. Кроме того, такое решение универсально для любого сервиса и не требует реструктуризации данных после внедрения нового сервиса.

Продавцу делается отдельная закладка (или печатная форма, чтобы не менять конфигурацию), в которой он может посмотреть табличку реквизитов транзакции для чека.

Использование обработок на языке 1С

Рассмотрим на примере условной услуги Paym для конфигурации «Розница».

  1. Заведем в 1С предопределенный элемент справочника номенклатуры «Paym». В режиме 1С:Предприятия после обновления конфигурации ему нужно назначить вид товара «Услуга».
  2. В процедуре «Добавить номенклатуру в таб. часть» модуля формы «Регистрация продаж» вызываем обработку работы с сервисом, написанную на языке 1С. В случае успешного осуществления платежа записываем и проводим чек:
Если (Номенклатура = Справочники.Номенклатура.Paym) И (ВидОперации Перечисления.ВидыОперацийЧекККМ.Возврат) Тогда ОбработкаПлатежа = Функции.ДатьВнешнююОбработку("Paym"); ФормаПлатежа = ОбработкаПлатежа.ПолучитьФорму(); Результат = ФормаПлатежа.ОткрытьМодально(); Если Результат = Неопределено Тогда Возврат; КонецЕсли; ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли;
  1. Обработка должна напечатать предчек (если требуется), заполнить табличную часть сложных продаж и подготовить текст печати чека в предопределенном реквизите «PaymТекстЧека».
  2. В процедуре «Провести и распечатать чек» модуля чека подменяем наименование товара на сохраненное в реквизите для чека. Текст подменяется только для продажи, для возврата печатается просто название услуги, как обычно.
ИначеЕсли ВидОперации Перечисления.ВидыОперацийЧекККМ.Возврат И Выборка.НомеклатураСсылка = Справочники.Номенклатура.Paym Тогда //Осипов PaymMaster СтрокаСложныхПродаж = СложныеПродажи.Найти(Справочники.СложныеПродажиПараметры.PaymТекстЧека, "Реквизит"); Если СтрокаСложныхПродаж Неопределено Тогда Товар.Наименование = СокрЛП(СтрокаСложныхПродаж.Значение); КонецЕсли;

Отдельный вопрос - как обеспечить завершенность транзакции. Т.е. если транзакция прошла в сервисе, как сделать, чтобы она не потерялась в 1С. Наиболее оптимальный путь - сверка реестров. Но это предмет отдельного рассмотрения.

Использование программ, интегрируемых с 1С

XDTO

Часто в веб-сервисах используется XDTO. Приведем наиболее важные советы и рецепты по использованию XDTO в 1С.

XDTO в платформе 1С

XDTO-пакеты, описанные в ветке «XDTO-объекты» конфигурации, доступны для создания типов и объектов в глобальной фабрике Фабрика XDTO. Это не сразу становится очевидным.

Некоторые типы в схеме не имеют имени, чтобы их получить, надо пройтись по иерархии типов.

В примере был описан список System, содержавший структуры XDTO. Чтобы создать саму структуру, нужно было получить ее тип таки вот образом:

Тип = Фабрика.Тип("urn:my.ru:MasterData:Business", "Business").Свойства.Получить("System").Тип;

Частые проблемы с XDTO

Разные форматы XSD-схем

В некоторых форматах теги называются xs:, в некоторых xsd:, но 1С благополучно понимает оба формата. Однажды была ситуация, что XSD нормально без ошибок импортировалась в 1С, но не создавала ни одного пакета. Причина была в отсутствии атрибута targetNamespace у тега, соответственно 1С не знала, в какой пакет помещать схему, но ошибок не выдавала.

Сопровождение сервисов

Учитывая, что сервис - это совокупность двух систем - 1С и внешней, ошибки могут быть в обоих системах, что снижает общую надежность работы.

Для того, чтобы проще было разбираться в причинах отказов в работе сервисов, рекомендуется использовать комплекс мер.

Протоколирование запросов

Ссылки

  • XDTO
    • Хорошее описание XDTO http://pro1c.org.ua/index.php?showtopic=214
  • Бесплатные интересные веб-сервисы:
    • Аэрофлот - информация о расписании самолетов
    • Морфер - склонение имен http://www.morpher.ru/WebServices/Morpher.aspx
  • Неразобранные:
    • Установка и использование Веб-сервисов
      • v8: как изменить конфигурационный файл апача?
      • v8: продолжение темы с web-сервисами - не могу подключить web-сервис
      • v8: дальше ползу по веб-сервисам - не могу создать прокси...
      • Книга знаний: v8: Использование внешних web-сервисов в 1С:Предприятие 8 ;

Обмен данными обычно организовывается с помощью выгрузки файла из одной программы и загрузки в другую. Некоторые программисты предоставляют сторонним программам доступ в SQL базу 1С (что вроде как сильно не рекомендуется).

Термин «обмен данными» не всегда подходит к задаче, иногда более корректно сказать – предоставление данных. Например, внешней программе требуется идентифицировать – существует ли такой клиент в 1С и его баланс.

Предоставление доступа к данным 1С – некорректно по причинам безопасности данных. Необходим скорее механизм проверки по имени и паролю с дальнейшим возвратом баланса.

Этот подход называют – сервисным, когда программа предоставляет не данные, а сервис, который позволяет идентифицировать клиента и узнать его баланс.

Как это работает?

Функции извне вызываются (запускаются) запросом по протоколу SOAP .

Для передачи параметров и результатов используется . Для работы с веб-сервисами Вы должны иметь базовое понимание про .

Web сервисы 1С

Web сервис 1С это способ, с помощью которого можно разрешить запускать некоторые функции 1С снаружи базы 1С, в том числе из других программ или других баз 1С.

Это лучше, чем предоставление прямого доступа к данным 1С, так как при вызове метода (функции) web сервиса 1С, доступ к данным внешняя программа не имеет. Функция на языке 1С самостоятельно определяет право внешней программы получить конкретную толику данных по переданным параметрам (например, имени и паролю).

Во многих случаях, можно не создавать свой пакет XDTO, а использовать по умолчанию – выбрав из списка пакет www.sample-package.org

Методы web сервиса 1С

После этого нужно добавить список функций (методов веб сервиса 1С) – которые будут предоставляться наружу. Называть их лучше англоязычно. Функция может иметь параметры.

Базовые типы к использованию:

  • string – строка
  • int или integer – целое число
  • real – дробное число
  • date – дата.

Для каждой добавленной функции веб сервиса 1С, в свойствах нужно создать , так же, как мы это делали в , и так далее.

Именно эта функция 1С будет выполняться при вызове метода веб сервиса 1С. Не забывайте, что выполняться она будет на сервере 1С. Файловый режим работы 1С с веб-сервисами не рекомендуется.

Функция обычно возвращает какие-либо данные. Обычно указывают тип string и возвращают строку XML.

Строку XML можно сформировать с помощью объектов языка 1С для , а можно просто составить текстовую строку, в которой хранится текст XML.

Публикация web сервиса 1С

Как мы говорили раньше, другие программы должны «знать», что веб сервис 1С существует, имеет такой вот список методов и так далее.

Описание должно лежать на веб сайте. Для этого нужно:

  • Иметь веб сайт
  • В свойствах web сервиса 1С указать имя файла с расширением 1cws, который является ссылкой на WSDL описание
  • Выложить этот файл на веб сайт в конфигураторе с помощью пункта меню Администрирование/Публикация на веб-сервере.

Браузер должен отобразить некий файл XML (пример файла WSDL здесь http://ru.wikipedia.org/wiki/WSDL), а не ошибку, не пустую страницу и не невнятный текст на любой кодировке.

После успешной публикации web сервис 1С можно использовать. Для этого в другой программе нужно использовать данный интернет адрес для ссылок на веб сервис 1С.

Например, Visual Studio позволяет для любого языка (C++, C#, Visual Basic) – включить в проект web сервис 1С по его WSDL описанию и сгенерировать класс для использования веб-сервиса 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С в целом довольно просто (хотя и есть некоторая сложность в понимании определения типов, у меня в том числе).

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

В платформе 1С для работы со сторонними с веб-сервисами существуют следующие объекты:

    WSОпределения - класс, содержащий в себе описание веб-сервиса, по сути это WSDL. Данный класс можно создать на основе WSDL. WSОпределения реализуют механизм динамического вызова веб-сервиса;

  • WSСсылкиМенеджер - менеджер статистических ссылок на веб-сервис. Предоставляет доступ к WS-ссылкам дерева метаданных. WSСсылкиМенеджер реализуют механизм статического вызова веб-сервисов;
  • WSПрокси - клиентский прокси для вызова веб-сервиса. Только с помощью данного класса можно обратиться к операциям веб-сервиса, независимо от того статическая это ссылка или динамическая.
  • XDTO - механизм XDTO позволяет создать модель представления данных (модель типов и значений), которая, с одной стороны, обеспечивает возможность просто и естественно манипулировать данными в среде 1С:Предприятия 8, а с другой стороны, данная модель хорошо приспособлена для прозрачного преобразования данных в другие форматы, главным образом XML.

Для наглядности попробую предоставить диаграмму классов приведенных выше классов. Прошу прощения если был неточен, просто ставил целью предоставление общей картины взаимосвязей классов.

Что же означают слова динамическая ссылка и статическая? Статистическая ссылка хранится в дереве метаданных (WS-ссылка) и задается на этапе конфигурирования, при ее создании подгружается определение веб-сервиса(описание WSDL) и сохраняется в конфигурации. Хранение определения веб-сервиса позволяет экономить время на его получении при обращении к веб-сервису. Минусом такого использования является изменение используемого веб-сервиса. При изменении веб-сервиса, в вашей конфигурации будет старое описание и вызов веб-сервиса просто перестанет работать. А для загрузки нового описания вам придется изменять конфигурацию.
Динамические ссылки напротив, подгружают актуальное описание при каждом создании класса WSОпределения.

Приведу пример обращения к веб-сервису по статической ссылке.
Для начало создадим WS-ссылку. Для этого откройте свою конфигурацию и найдите в окне конфигурации Общие-WSСсылка.


И нажмите Добавить. Платформа попросит ввести путь к WSDL.


Если вы публикуете веб-сервис средствами 1С то путь к WSDL будет такого вида:
http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl. Позже, когда мы будем создавать свой веб-сервис, я объясню подробнее откуда берутся эти имена.
Если на веб-сервис стоит ограничение, то введите логин и пароль. Если вы создавали веб-сервис в 1С то для авторизации используйте учетные данные пользователей БД, у которых есть право на использование операций веб-сервиса.


После ввода логина и пароля пройдет некоторое время на закачку WSDL и WS-ссылка будет создана.


Теперь можно обратиться к веб-сервису. Создадим процедуру с директивой &НаСервере:

&НаСервере
Процедура ОбращениеКВебСервисуПоСтатическойСсылкеСервер()
Прокси = WSСсылки.WSСсылка.СоздатьWSПрокси("http://xxx.xxx.xxx.xxx", "WebServices", "WebServicesSoap");
Прокси.Пользователь="admin";
Прокси.Пароль="admin";
РезультатВебОперации = Прокси.ListOfDevices();
КонецПроцедуры

В данном примере мы используем метод СоздатьWSПрокси типа WSСсылкаМенеджер.WSСсылка, который создает объект WSПрокси. В WSПрокси мы указываем логин и пароль для доступа к веб-сервису и уже после этого вызываем функцию веб-сервиса. В нашем случае это функция ListOfDevices() .

Теперь попробуем обратиться к той же самой операции веб-сервиса через динамическую ссылку. Для этого создадим процедуру с директивой &НаСервере:

&НаСервере

Процедура ОбращениеКВебСервисуПоДинамическойСсылкеСервер()


WSОпределение = Новый WSОпределения("http:// xxx.xxx.xxx.xxx /InfoBase/ws/WebServices?wsdl", "admin" , "admin" );
WSПрокси = Новый WSПрокси(WSОпределение, "http://xxx.xxx.xxx.xxx" , "WebServices", "WebServicesSoap" );
WSПрокси.Пользователь = "admin" ;
WSПрокси.Пароль = "admin" ;
РезультатВебОперации = WSПрокси .ListOfDevices();
КонецПроцедуры

В окончание статьи приведу ссылку на обработку которая позволит вам вызвать операции веб- сервиса. В обработке перед этим надо ввести путь к файлу WSDL, логин и пароль - нажать кнопку "Получить WSDL" и после этого можно просмотреть какие есть операции в веб-сервисе и вызвать их. Для вызова операции необходимо выбрать сервис, точку подключения и операцию. Перейти на вкладку "Параметры операции", ввести необходимые параметры операции и нажать кнопку "Выполнить операцию". На вкладке "Результат операции" будет ответ от операции в XML виде.

30 июля 2012 в 13:19

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

  • Программирование

Знаю, что на хабре не очень-то жалуют многострадальную 1С. Хотя, (с клиентами под 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С в целом довольно просто (хотя и есть некоторая сложность в понимании определения типов, у меня в том числе).

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