Передача параметров веб сервису, и разбор полученного ответа
В предыдущей статье мы проверяли орфографию с помощью веб сервиса от Яндекса. Сегодня мы создадим еще одну обработку с проверкой орфографии, но усложним задачу, если почитать документацию по яндекс спеллер API можно узнать, что проверка текста возможна на 3 языках:
Также можно управлять параметрами проверки: таблицу берм из описания API спеллера. Это кстати неправильно по WSDL мы должны получить полное описание сервиса, а тут есть параметр, который вычислить без чтения документации невозможно, но главное что документация есть.
Значение (десятичное)
Описание (пример)
Пропускать слова, написанные заглавными буквами, например, «ВПК».
Пропускать слова с цифрами, например, «авп17х4534».
Пропускать интернет-адреса, почтовые адреса и имена файлов.
Подсвечивать повторы слов, идущие подряд. Например, «я полетел на на Кипр».
Пропускать слова, написанные латиницей, например, «madrid».
Только проверять текст, не выдавая вариантов для замены.
Отмечать слова, написанные латиницей, как ошибочные.
Не использовать словарное окружение (контекст) при проверке. Опция полезна в случаях, когда на вход сервиса передается список отдельных слов.
Игнорировать неверное употребление ПРОПИСНЫХ/строчных букв, например, в слове «москва».
Для установки параметров добавим к нашей предыдущей обработке дополнительную форму с незатейливым название «Настройки» Выглядеть она будет так:
Немного изменим код обработки. Теперь нам нужно передать не просто текст в веб сервис, а структуру с несколькими параметрами, для этого нам нужно получить описание параметра веб сервиса.
Сначала смотрим, что мы должны передать веб сервису:
Операции checkTexts мы должны передать параметр с типом CheckTextRequest, который состоит из атрибутов: lang, options, format, text.
Код, который осуществляет это следующий:
Заметьте, для облегчения понимания работы с веб сервисом я использовал Wsссылку из структуры метаданных конфигурации, но работаем мы с динамической ссылкой.
Параметры передали, теперь можно обрабатывать результат, в предыдущем примере мы это сделали без проблем, запускаем обработку и … у нас выскакивает ошибка, почему? У нас немного не тот формат результата, который возвращается у операции checkText формат результата SpellResult ( http://speller.yandex.net/services/spellservice ) а у операции checkTexts формат другой CheckTextsResponse ( http://speller.yandex.net/services/spellservice ),
который состоит уже из SpellResult – ов. Посмотрим, как выглядит ответ сервера в XML формате, воспользовавшись soapUI.
Модифицированный код разбора результата будет такой
как видите, мы просто спустились по структуре ХМЛ до уровня, на котором уже есть нужные нам данные.
Обмен данными с конфигурацией через веб-сервисы
Внимание! Данный функционал доступен в «Библиотеке стандартных подсистем», начиная с версии 2.3.1.62.
Для обмена данными через формат EnterpriseData у конфигураций, использующих «Библиотеку стандартных подсистем», есть два веб-сервиса:
Т.к. объем передаваемых через веб-сервисы данных ограничен, данные передаются в виде архивов формата ZIP. Если размер архива слишком велик для передачи через веб-сервис – его разбивают на части и передают по частям. Максимальный размер передаваемого через веб-сервис за сообщения зависит от ряда факторов (от пропускной способности сети, от настроек веб-сервера, от объема свободной памяти на передающей и приемной стороне и т.д.). Опыт показывает, что лучше не передавать через веб-сервис данные размером более нескольких мегабайт.
Собственно задача обмена данными включает в себя две подзадачи:
Особенности работы методов веб-сервисов
Большинство методов обоих веб-сервисов имеют выходной параметр – строку ErrorMessage. В случае если внутри конфигурации произошла ошибка, связанная с бизнес-логикой – в эту строку будет записана информация об этой ошибке. Если ошибок в процессе работы метода не было – в строку ErrorMessage будет помещена пустая строка. Если же в процессе работы метода возникла системная ошибка (например, на стороне конфигурации не удалось разархивировать полученный архив) – веб-метод сгенерирует исключение (exception).
Большинство методов обоих веб-сервисов возвращают строки, но в текущей версии возвращаемые строки всегда пустые (кроме EnterpriseDataUpload.PutDataActionResult – он возвращает статус обработки данных на стороне конфигурации – “Active”, “Completed” либо “Failed”).
Ниже на примерах мы рассмотрим, как использовать эти веб-сервисы для обмена данными с конфигурациями из языков C# и Java.
Что нужно для работы
На стороне конфигурации
На стороне конфигурации должны быть развернуты веб-сервисы EnterpriseDataUpload и EnterpriseDataExchange соответствующих версий (в данном случае была использована версия 1.0.1.1). При открытии этих двух URL-адресов в браузере (нужно подставить правильное для вашей инсталляции «1С:Предприятия» имя веб-сервера и публикации):
должны выводиться WSDL-описания сервисов:
В примерах использовалась Visual Studio 2012. В ней было создано консольное приложение на C#, в него импортированы веб-сервисы:
Использовалась среда разработки Eclipse 4.4.2. Для генерации кода по WSDL файлов веб-сервисов применялась утилита wsdl2java из фреймворка Apache CXF 2.7.16.
Простой обмен данными с конфигурациями с помощью формата EnterpriseData
Формат сообщения
Объекты, предназначенные к обмену, «упакованы» в сообщение (Message), структуру в формате XML. Корневой элемент сообщения называется Message и содержит два дочерних элемента:
Объект может содержать в себе ссылки на другие объекты (например, документ «Акт выполненных работ» может содержать в себе одну или несколько ссылок на номенклатуру). В этом случае, если мы импортируем данные в информационную базу, все объекты, на которые мы ссылаемся из «родительского» объекта, должны либо уже существовать в системе, либо их описание должно содержаться в том же XML файле.
Если нам необходимо удалить какой-то объект, в коллекцию Body надо добавить элемент типа «УдалениеОбъекта», и в этом элементе сослаться на удаляемый объект (см. описание типа «УдалениеОбъекта» в схеме EnterpriseData_X_Y_Z.xsd).
С помощью формата EnterpriseData нам доступны операции создания, обновления и удаления объектов. На данный момент для корректной загрузки данных в типовые решения все объекты должны содержать заполненный элемент «Ссылка» из элемента «Ключевые свойства» (GUID в форме строки). Это первичный ключ объекта. Конфигурации ведут себя следующим образом:
Пример сообщения
Веб-сервис EnterpriseDataUpload
EnterpriseDataUpload – интерфейс исключительно для импорта данных в формате EnterpriseData в конфигурацию из сторонних приложений. Условия задачи: у нас есть XML файл с данными в формате EnterpriseData, надо передать его в конфигурацию и убедиться в том, что на стороне конфигурации данные успешно получены.
Алгоритм работы следующий:
Пример на C#
Итак, у нас есть архив с данными в формате EnterpriseData (один или несколько файлов). Не будем описывать, как в программе создать архив и разбить его на несколько файлов, чтобы сэкономить время – желающие смогут легко найти примеры подобного кода, используя поисковые сервера и соответствующие запросы.
Реализуем функцию, которая принимает такие входные параметры:
Путь до архивированного файла с данными. Если архив умещается в одном файле – это имя файла с полным путем, включая расширение (например, “C:\Exchange\data.zip”). Если же архив разбит на несколько частей, то это будет имя любого из файлов без расширения и точки (например, “C:\Exchange\data”). Предполагается, что это последовательность файлов с расширениями “.001”, “.002” и т.д.
Реализация функции (в виде статического метода) в листинге ниже. Диагностическая информация выводится в консоль.
Пример на Java
Принципиально ничем не отличается от реализации на C#.
Использование внешних веб-сервисов в 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С, правда она работает не корректно):
Здесь сначала проверяется, заполнена ли дата (если не заполнена, то сообщаем об этом пользователю и больше ничего не делаем). Затем очищается таблица, расположенная на форме и вызывается процедура ЗагрузитьКурсыВалют(), в которую передается дата.
Код процедуры ЗагрузитьКурсыВалют(), пояснения данны в комментариях к коду:
Теперь можно обновлять конфигурацию БД (F7) и запускать 1С Предприятие (F5). Если все сделали верно, то должны увидеть окно как на рисунке ниже:
Чтобы проверить результат, нам нужно ввести дату, на которую хотим получить курсы валют и нажать на кнопку «Загрузить валюты». В случае успешного запроса, таблица на форме заполнится значениями курсов:
Напоследок хочу показать, как можно обратиться динамически к внешнему веб-сервису, то есть без добавления объекта WS-ссылка. Таким образом, мы можем использовать такие веб-сервисы из внешних обработок без привязки к конфигурации.
В процедуре ЗагрузитьКурсыВалют() строку
необходимо заменить двумя следующими строками
Сначала мы создаем так называемые определения для веб-сервиса из его WSDL. Затем так же создаем прокси для обращения к нему.
Как видно, использовать внешние веб-сервисы из 1С в целом довольно просто (хотя и есть некоторая сложность в понимании определения типов, у меня в том числе).
Если данная публикация найдет здесь отклик, то есть еще несколько тем, о которых можно рассказать.
По ссылке можно скачать конфигурацию с примером (cf-файл).
Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис
Сегодня мы с вами разберем вопрос о том, как передавать параметры в http сервис.
Для чего это может быть нужно. Например, нам нужно получить информацию не о всей номенклатуре, а только о той номенклатуре, у которой определенный штрих код.
Цель: научиться передавать параметр в http сервис.
-Откроем http сервис «ОперацииСНоменклатурой»
-Перейдем на закладку «Шаблоны»
-Добавим новый шаблон. Назовем его «ИзучениеПередачиПараметров»
-Придумаем шаблон, например, «get_products_barcode»
До этого момента мы с вами повторили действия предыдущего занятия.
Перейдем к передаче параметров. Параметры в http сервисе, заключены в фигурные скобки. Например, < beginDate >или < articul >или <> еще что-то.
Замечательно. Но куда этот параметр деть, куда его приложить?
А вот куда. Мы придумали имя шаблона « get _ products _ barcode », так вот после него и записывается параметр вот так, / get _ products _ barcode /< barcode >. Мы в шаблоне указали параметр.
-В общем модуле «ОбщегоНазначения» создадим новую функцию, которая будет возвращать JSON строку с данными по номенклатуре, в зависимости от параметра штрих кода.
Функция будет называться «ПолучитьНоменклатуруПоШтрихкоду»
Данная функция находится тут
-Опубликовываем http сервис «ОперацииСНоменклатурой»
-Открываем браузер и собираем строку запроса. Как мы помним из прошлого урока строка собирается так:
Ip адрес / имя_публикации / hs / корневой_каталог / шаблон/
localhost / my _ name / hs / products / get _ products / < barcode >– ТОЛЬКО ВМЕСТО ФИГУРНЫХ СКОБОК, КОНКРЕТНОЕ ЗНАЧЕНИЕ ШТРИХ КОДА, НАПРИМЕР 20000000583067
Видео инструкция по передаче параметров в http сервис.
1С. Создание web-сервиса с примером его использования
В данной статье я хотел бы поделиться опытом создания своего web-сервиса с дальнейшим его использованием в системе 1С.
Для начала работы добавим свой пакет XDTO. Для этого в ветке конфигурации, в разделе общие находим раздел «XDTO-Пакеты» и добавляем новый.
В свойствах пакета укажем URL пространства имен, например «https://programstore.ru». Добавим два типа объектов, СтрокиТаблицыПокупок и ТаблицаПокупок.
Для типа СтрокиТаблицыПокупок добавим свойства:
Для тип ТаблицаПокупок добавим только одно свойство
После создания XDTO-пакета можно приступать к созданию web-сервиса. Для этого в ветке конфигурации, в разделе общие находим раздел «Web-сервисы» и добавляем новый.
Переходим на вкладку «Операции», где добавляем новую операцию и входящие параметры, в нашем случае «ДатаНачала» и «ДатаОкончания» с типом «date (http://www.w3.org/2001/XMLSchema)»
После добавления операции, переходим на вкладку «Прочее». На ней заполняем URL пространства имен, выбираем наш пакет XDTO и имя файла публикации.
На этом создание web-сервиса окончено, осталось описать процедуру работы операции.
Для этого возвращаемся на вкладку «Операции», открываем свойства нашей операции и добавляем новую процедуру. Система автоматически создаст функцию операции с ее параметрами.
Теперь опишем работу нашей функции.
Для начала нам необходимо получить созданные нами типы в XDTO-пакете
Получаем тип пакета «ТаблицаПокупок»
Получаем тип пакета «СтрокиТаблицыПокупок»
После получения типов пакета можно переходить к их заполнению
На этом описание web-сервиса окончено. Можно переходить к примеру использования сервиса.
Получить web-сервис из другой базы 1С можно следующим образом:














