1c несоответствие количества параметров операции веб сервиса и процедуры обработчика
Передача параметров веб сервису, и разбор полученного ответа
В предыдущей статье мы проверяли орфографию с помощью веб сервиса от Яндекса. Сегодня мы создадим еще одну обработку с проверкой орфографии, но усложним задачу, если почитать документацию по яндекс спеллер API можно узнать, что проверка текста возможна на 3 языках:
- ru – русский;
- uk – украинский;
- en – английский.
Также можно управлять параметрами проверки: таблицу берм из описания API спеллера. Это кстати неправильно по WSDL мы должны получить полное описание сервиса, а тут есть параметр, который вычислить без чтения документации невозможно, но главное что документация есть.
Значение (десятичное)
Описание (пример)
Пропускать слова, написанные заглавными буквами, например, "ВПК".
Пропускать слова с цифрами, например, "авп17х4534".
Пропускать интернет-адреса, почтовые адреса и имена файлов.
Подсвечивать повторы слов, идущие подряд. Например, "я полетел на на Кипр".
Пропускать слова, написанные латиницей, например, "madrid".
Только проверять текст, не выдавая вариантов для замены.
Отмечать слова, написанные латиницей, как ошибочные.
Не использовать словарное окружение (контекст) при проверке. Опция полезна в случаях, когда на вход сервиса передается список отдельных слов.
Игнорировать неверное употребление ПРОПИСНЫХ/строчных букв, например, в слове "москва".
Для того чтобы использовать несколько параметров их значение просто надо сложить вместе. Ну и указание формата проверяемого текста : plain - текст без разметки (значение по умолчанию) или html - HTML-текст.
Для установки параметров добавим к нашей предыдущей обработке дополнительную форму с незатейливым название «Настройки» Выглядеть она будет так:
Немного изменим код обработки. Теперь нам нужно передать не просто текст в веб сервис, а структуру с несколькими параметрами, для этого нам нужно получить описание параметра веб сервиса.
Сначала смотрим, что мы должны передать веб сервису:
Операции checkTexts мы должны передать параметр с типом CheckTextRequest, который состоит из атрибутов: lang, options, format, text.
Код, который осуществляет это следующий:
Заметьте, для облегчения понимания работы с веб сервисом я использовал Wsссылку из структуры метаданных конфигурации, но работаем мы с динамической ссылкой.
который состоит уже из SpellResult – ов. Посмотрим, как выглядит ответ сервера в XML формате, воспользовавшись soapUI.
Модифицированный код разбора результата будет такой
как видите, мы просто спустились по структуре ХМЛ до уровня, на котором уже есть нужные нам данные.
Ещё один дисклеймер (спустя многие времена)
Вступление
Когда появляется новая версия какого-то программного продукта, то естественно, в первую очередь хочется понять, чего же такого в нем появилось нового. В случае с "1С:Предприятие 8.1" такой новой "фичей" для меня стали web-сервисы. Про web-сервисы написано и сказано много, поскольку существует эта технология по компьютерным меркам достаточно давно. По-этому я повторяться не буду, за справками отправляю всех к Яндексу. Скажу лишь, что с выходом новой редакции платформы "1С:Предприятие 8.1" у 1Сников появилась возможность создавать и использовать технологию web-сервисов, находясь, так сказать, в родной среде. В этой статье я хочу показать, как использовать внешние web-сервисы в своих разработках.
Для тех, кто совсем "не в теме": о web-сервисах "на пальцах"
Откуда ноги, т.е. крылья растут
Он сказал: "Поехали!"
"То взлет, то посадка. "
Для работы с web-сервисом я добавил в конфигурацию обработку "ТаблоВылетов", а в ней - одну форму, которую назначил основной. На форму я положил поле выбора "ВыборАэропорта", поле ввода "ДатаРейса", панель "ПанельТабло" с двумя страницами "Прилет" и "Вылет", при этом я снял флаг "Распределять по страницам" в свойствах панели, и табличное поле "ТаблицаТабло".
Взаимодействие с web-сервисом происходит по принципу "запрос-ответ", при этом для web-сервиса создается специальный объект-посредник. Поэтому я добавил реквизит формы "СервисАэрофлот" произвольного типа.
Если внимательно почитать описание сервиса, то можно увидеть, что web-сервис предоставляет данные о прилетах и вылетах через вызовы методов Arrival и Departure соответственно. При этом оба метода принимают в качестве параметров код аэропорта и нужную дату. Кроме того, web-сервис предоставляет возможность получить список аэропортов, по которым имеются данные в системе. Достаточно очевидным является следующий сценарий взаимодействия с web-сервисом:
1. Получить список аэропортов;
2. Выбрать нужный аэропорт и дату;
3. Получить данные о прилетах или вылетах;
Но прежде чем обращаться к web-сервису, необходимо инициализировать объект-посредник (типа WSПрокси), что я и сделал в обработчике открытия формы:
Первым параметром передается URI пространства имен web-сервиса. Узнать его можно открыв свойства web-сервиса в дереве WS-ссылки. Вторым и третьим параметром параметрами передаются соответственно имя и порт web-сервиса.
(не надо путать понятия "имя", "порт", "прокси" и т.п. в применении к web-сервисам с более привычными понятиями протокола TCP/IP. Соответствие между ними если и есть, то скорее смысловое. В общем случае нужно понимать, что, например порт web-сервиса и TCP-порт - это абсолютно разные вещи).
Таким образом я проинициализировал объект СервисАэрофлот типа WSПрокси, который по-сути своей является "оберткой" web-сервиса. Через него я смогу обращаться к методам web-сервиса как к "родным" методам платформы.
Первым делом я получил список аэропортов и заполнил список поля выбора "ВыборАэропорта":
Тут нужен небольшой комментарий по конструкции СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list");
Дело в том, что значения, возвращаемые методами web-сервисов, представляются в платформе объектами типа ОбъектXDTO. Поскольку тематика технологии XDTO выходит за рамки этой статьи, скажу лишь, что для превращения этого объекта в список (чем он и является), я вызвал его метод ПолучитьСписок(). Остальное в коде достаточно очевидно, включая названия полей структуры Аэропорт, которые я нашел на странице описания web-сервиса.
Теперь можно запустить конфигурацию и убедиться, что список поля выбора заполняется названиями аэропортов:
"День отлета, день прилета. "
Теперь у меня практически все готово для того, чтобы заставить мое табло функционировать. Осталось только его "выкрасить и выбросить" :) Чем и займусь:
Для того, чтобы проверить как это все работает, я добавил на командную панель формы кнопку "Обновить" с соответствующей картинкой, а в ее обработчике написал такое:
Сохраняю, запускаю, выбираю, нажимаю, получаю:
Цель блога описать интересные и полезные примеры программирования в системе 1С:Предприятие 8.
Риски использования веб-сервисов 1С
В платформе 1С81 появилась реализация веб-сервисов.
Но их использование чревато рисками:
Авторизация к веб-сервису 1С
Для доступа к сервису нужно пройти аутентификацию.
Обычно веб-сервис работает под одним конкретным пользователем (чаще - специально созданным). Можно пользователя 1С "прикрепить" средствами Windows-аутентификации к пользователю Windows IUSR_ (для пользователя отключить авторизацию 1С). Как вариант, можно очистить список пользователей 1С, тогда авторизация не требуется.
Если требуется несколько пользователей, то можно создать несколько логинов для веб-сервера, к каждому из них привязать пользователя Windows и соответственно, прописать в 1С доступ к пользователям Windows.
В свойствах Пользователь и Пароль объекта WSПрокси используется не логин 1С, а логин пользователя веб-сервера.
Проверка валидности WSDL-схемы
Тестирование веб-сервиса 1С
Для тестирования 1С как веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf», как описано в разделе «Тестирование работающего внешнего веб-сервиса».
Файл 1cws и является WSDL-описанием веб-сервиса 1С.
Операция «Hello»
Правилом хорошего тона является создание в сервисе операцию, которая информирует о том, что сервис доступен. Это облегчает жизнь интеграторов, им будет проще проверять, налажена ли связь с сервисом.
Например, можно использовать операцию Hello без параметров, которая просто возвращает булево значение Истина.
Сопровождение сервисов
Учитывая, что сервис – это совокупность двух систем – 1С и внешней, ошибки могут быть в обоих системах, что снижает общую надежность работы.
Для того, чтобы проще было разбираться в причинах отказов в работе сервисов, рекомендуется использовать комплекс мер.
воскресенье, 14 октября 2012 г.
XDTO в платформе 1С
XDTO-пакеты, описанные в ветке «XDTO-объекты» конфигурации, доступны для создания типов и объектов в глобальной фабрике Фабрика XDTO. Это не сразу становится очевидным.
Некоторые типы в схеме не имеют имени, чтобы их получить, надо пройтись по иерархии типов.
В примере был описан список System, содержавший структуры XDTO. Чтобы создать саму структуру, нужно было получить ее тип таки вот образом:
Публикация веб-сервиса
Задача публикации Web-сервисов сводится к размещению конфигурационных файлов *.1cws Web-сервисов в соответствующем каталоге веб-сервера с соответствующими настройками для веб сервера. Для того, чтобы выполнить публикацию Web-сервисов, следует выполнить команду меню «Администрирование | Публикация Web-сервисов».
В результате выполнения этой команды будет открыто окно публикации Web-сервисов.
Окно публикации Web-сервисов содержит путь к веб-серверу и два списка:
- «Web-сервисы» – список Web-сервисов конфигурации;
- «Публикация» – список Web-сервисов, опубликованных на указанном веб-сервере.
С помощью кнопки «Соединение…» следует указать веб-сервер, на котором требуется опубликовать Web-сервисы.
Окно выбора пути к веб-серверу позволяет указать путь двумя способами:
- на закладке «Файлы» – этот способ используется в том случае, когда публикация выполняется на том же компьютере, на котором установлен веб-сервер. В качестве пути указывается локальный каталог, соответствующий интернет-странице, с которой будет выполняться вызов публикуемого Web-сервера;
- на закладке «FTP сайт» – этот способ используется в том случае, когда требуется опубликовать Web-сервис на удаленном компьютере. Для выполнения публикации необходимо указать параметры FTP-соединения с удаленным компьютером и каталог, в котором будет опубликован Web-сервис.
Публикация выбранного Web-сервиса осуществляется с помощью кнопки «Опубликовать»
Для отмены публикации Web-сервиса используется кнопка «Удалить».
Для обновления списка опубликованных Web-сервисов используется кнопка «Обновить текущий список».
Публиковать можно в локальном каталоге или по FTP. Можно публиковать и на удаленный сервер по UNC-пути, если удаленный сервер входит в локальную сеть.
Организация служебных данных в 1С
Для хранения информации о транзакции в чеке необходимо создать дополнительную табличную часть «Сложные продажи» с реквизитами:
- Номенклатура – привязка к номенклатуре чека.
- Параметр - ссылка на справочник «Сложные продажи: Параметры».
- Значение – значение параметра, составного типа. Строковое представление должно быть довольно длинным (1024 символа), чтобы помещался текст чека.
Справочник «Сложные продажи: Параметры» содержит перечень параметров транзакции.
Табличную часть выгоднее использовать, чем набор реквизитов, т.к. у транзакции их может быть очень много, а в других чеках, не связанных с сервисом, эти реквизиты не будут использоваться, и будут занимать лишнее место. Кроме того, такое решение универсально для любого сервиса и не требует реструктуризации данных после внедрения нового сервиса.
Продавцу делается отдельная закладка (или печатная форма, чтобы не менять конфигурацию), в которой он может посмотреть табличку реквизитов транзакции для чека.
Правила разработки сервиса на базе 1С
Стандартные средства отладки сервисов
Для отладки можно использовать программу SoapUI, который может передать произвольный запрос веб-сервису и получить от него ответ.
Частые проблемы с XDTO
Использование программ, интегрируемых с 1С
Часто в веб-сервисах используется XDTO. Приведем наиболее важные советы и рецепты по использованию XDTO в 1С.
Использование сервисов в Рознице
Обычно в рознице сервисы используются для оказания различных услуг населению – прием платежей, погашение кредитов, денежные переводы, покупка программного обеспечения и т.п.
При этом по оказанной услуге в 1С формируется чек, в котором сохраняются параметры транзакции. После чего этот чек распечатывается клиенту с подробной информацией об оказанной услуге. Возможна печать предварительного чека, для того, чтобы клиент подтвердил введенные с его слов данные своей подписью.
Сервис может быть по-разному интегрирован в розничную программу, написанную на языке 1С (УТ, Розница и другие):
- Может быть написана обработка или код на языке 1С, который выполняет всю работу с сервисом.
- Может использоваться программа, которая работает с сервисом, а в 1С передает только информацию для пробития чеков.
Правила построения сервисов по продаже
Клиенту выдается документ о продаже (чек) только в том случае, если транзакция по сервису прошла успешно. Иначе возможна ситуация, когда клиент получит чек и будет пребывать в уверенности, что получил услугу, а на самом деле это не так.
Использование обработок на языке 1С
Рассмотрим на примере условной услуги Paym для конфигурации «Розница».
Отдельный вопрос – как обеспечить завершенность транзакции. Т.е. если транзакция прошла в сервисе, как сделать, чтобы она не потерялась в 1С. Наиболее оптимальный путь – сверка реестров. Но это предмет отдельного рассмотрения.
Разные форматы XSD-схем
В некоторых форматах теги называются xs:, в некоторых xsd:, но 1С благополучно понимает оба формата. Однажды была ситуация, что XSD нормально без ошибок импортировалась в 1С, но не создавала ни одного пакета. Причина была в отсутствии атрибута targetNamespace у тега , соответственно 1С не знала, в какой пакет помещать схему, но ошибок не выдавала.
Протоколирование запросов
Рекомендуется сохранять все запросы и ответы на них в каталог программы, файлы сохранять в папки вида ГГГГММДД по дням. Это очень способствует пониманию причин проблем.
Пример реализации простого web сервиса. Особенность: не используются XDTO пакеты, определяемые в дереве конфигураций; возможность передачи любых структур данных: списки значений, таблицы значений, табличные документы и т.п.
На днях столкнулся с необходимостью реализовать Web сервис. Покурив литературу по этой теме столкнулся с необходимостью предварительно определять и реализовывать XDTO пакеты в дереве конфигураций. Их реализация вызвала у меня легкое отвращение: это довольно рутинная работа.
Немного подумав, реализовал WEB сервис без реализации собственных XDTO пакетов. Получается, что для реализации веб сервисов (по крайней мере, тех что будут использоваться другими программами 1С версии 8) реализация собственных XDTO пакетов необязательна.
Таким образом, порядок работы Web сервиса будет следующим. На вызывающей стороне формируем структуру данных (например, список значений), в который "запихиваем" входные параметры. Упаковываем эту структуру в хранилище. Вызываем операцию Web сервиса, в качестве параметра передаем это хранилище. В модуле Web сервиса из этого хранилища получаем переданную структуру, анализируем, выполняем нужный код, результат работы Web сервиса преобразуем в структуру данных - например в таблицу значений. Таблицу значений опять же упаковываем в хранилище и возвращаем вызывающей стороне. На вызывающей стороне получаем таблицу значений из хранилища.
Плюсы такого подхода:
1) Передача параметров и возврат результата в привычных и удобных структурах данных - таблицах значений, списках значений и т.п.
2) Если Web сервис используется в рамках распределенной базы, то можно передавать обмениваться ссылками на объекты, это очень удобно.
3) Возможность сжатия хранилища. Таким образом экономится траффик.
1) Возможна работа только в рамках 1с 8.
Файл для скачивания содержит пример реализации такого Web сервиса для платформы 8.3. Файл представляет собой архив, в котором находятся файлы выгрузки двух баз: "Источник" и "Приемник". В источник нужно зайти под пользователем "test", без пароля. Web сервис называется "NomenklaturapoKodu", находится в базе "Источник". Обработка, которая вызывает Web сервис называется "ТестРаботыWebСервиса", находится в базе "Приемник".
Пример очень прост. В форме обработки есть список значений, в который нужно подобрать номенклатуру. По команде "Получить наименования" обработка формирует массив с кодами элементов номенклатуры, упаковывает его в хранилище значений и вызывает операцию Web сервиса, передавая в качестве параметра это хранилище значений. Web сервис в качестве входного параметра получает хранилище с упакованным в него массивом, содержащим коды номенклатуры. Web сервис достает их хранилища массив, строит запрос к справочнику номенклатуры с отобором по кодам из массива, получает наименования и коды элементов, помещает их в таблицу значений, упаковывает её в хранилище и передает хранилище запрашиваемой стороне (в обработку грубо говоря). Полученная в качестве ответа от Web сервиса таблица значений, упакованная в хранилище - распаковывается из него и обрабатывается (выводится на форму:).
Использование 1С как сервиса
Особенности загрузки WSDL в 1С
Особенность загрузки WSDL в 1С в том, что валидные схемы могут не загружаться. Никакого встроенного валидатора нет, поэтому приходится искать ошибку методом деструктивного анализа, последовательно уменьшая количество элементов в схеме. Можно, например, удалить описание веб-сервиса.
1С не любит слово «policies». Если WS-ссылка не загружается, нужно убрать все, что связано с этим словом в любом XML-редакторе.
Загрузка WSDL
Для того, чтобы использовать внешний сервис, нужно загрузить его WSDL-схему.
Обработка для тестирования работающего внешнего веб-сервиса
Для тестирования работающего внешнего веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf» из пакета к этой статье.
Таким способом можно протестировать любой сервис, который имеет простые точки входа, содержащие параметры простых типов: число, дата, строка.
В обработке можно указать также логин и пароль, которые требуются для авторизации доступа к веб-сервису.
Использование внешних SOAP-сервисов
Веб-сервисы SOAP используют WSDL схемы и объекты XDTO для представления данных.
1С:Предприятие 8. Веб-сервисы. Реализация веб-сервиса
После этих действий веб-сервисом можно будет пользоваться. Таким образом будет создан веб-сервис, который сможет оперировать только простыми типами данных.
Откройте конфигурацию и в дереве метаданных найдите ветку "Общие - Web-сервисы". Нажмите правой кнопкой и добавьте новый элемент.
Имя веб-сервиса можно задать русское. И платформа его сохранит и опубликует, но рекомендую использовать латиницу в названиях веб-сервисов, ws-операций, параметров ws-операций. Например, chrome не смог отобразить wsdl файл веб-сервиса с русским именем.
Перейдите на вкладку "Прочее" и укажите параметр "URI пространство имен".
В документации об этом параметре написано чуть больше чем ничего, примерно то, что это поле служит для идентификации вашего веб-сервиса. Когда я делал свой первый веб-сервис, мне казалось что это ссылка на сайт, на котором я публикую свой веб-сервис и все наименования буду получаться через запрос к этому сайту. На самом деле "URI пространство имен" не что иное как строка определяющая название набора ваших имен (названий веб-сервиса, операций, параметров, типов данных и т.д.). То есть если вы объявите свой тип "integer" то xml-парсер не будет ругаться, так как этот тип принадлежит вашему пространству имен. Мало того если "URI пространство имен" будет содержать русские символы и не будет соответствовать стандарту как формат URI, платформа все равно опубликует такой веб-сервис, и он будет работать. Но по стандартам рекомендуется использовать URI ссылку. Я советую того же самого.
Простое и понятное объяснение пространства имен можно прочитать тут.
Поле "Пакеты XDTO" не обязательное. Оно определяет набор пакетов XDTO в которых вы можете оказать свои типы значений. Это не обязательное поле, по умолчанию вам всегда доступны типы пространства имен "http://www.w3.org/2001/XMLSchema". О пакетах XDTO я расскажу чуть позже.
"Имя файла публикации", это имя файла, в котором хранятся настройки веб-сервиса для Apache(путь к базе и другие) после публикации. Папка, в которой находится этот файл, определяется при публикации. О публикации на веб-сервере будет рассказано позже.
Веб-сервис создан, но еще нет ни одной функции которую он мог бы исполнить. Надо добавить операцию. Для этого добавьте в созданный веб-сервис операцию. Нажмите не веб-веб-сервис правой кнопкой и выберите "Добавить-Операция". Она будет к вашему операнду прибавлять 2 и возвращать значение. Давайте назовем ее "Plus2". Можно указать и русское название, многие клиенты его обработают, но все же могут возникнуть проблемы.
"Тип возвращаемого значения" это тип описанный в указанном вами пакете XDTO или же тип из пространства имен "http://www.w3.org/2001/XMLSchema". Именно в этом типе веб сервис будет возвращать значение.
"Возможно пустое значение" признак что ws-операция может не вернуть значение( nillable webkit-html-attribute-value" style="font-family: monospace; font-size: 13px;">true " ).
"В транзакции" указывает что код веб-сервиса будет выполняться в транзакции. А "Режим управления блокировкой данных" определяет тип блокировки данных при транзакции по умолчанию.
Установим тип возвращаемого значения в int. В поле "Имя метода" укажем имя "Plus2" для нового метода, который будет выполнять обработку. При нажатии на лупу метод будет автоматом создан в модуле веб-сервиса.
Напишем простой код.
Функция Plus2(Параметр)
Возврат Параметр+2;
КонецФункции
Вы заметили что на входе функции у нас есть параметр "Параметр". Для того что бы в метод этот параметр был передан надо добавить его в дереве метаданных. Для этого щелкните правой кнопкой по веб-операции Plus2 и выберите "Добавить-Параметр".
Давайте назовем его "Param". Названия параметров тоже можно указывать русскими, мало того класс SoapClient языка PHP работает с ними корректно, ведь параметры передаются через массив. Желательно использовать кодировку UTF-8.
Укажем "Тип значения" int из пространства имен "http://www.w3.org/2001/XMLSchema".
В данной статье будет рассмотрены вопросы интеграции 1С с уже существующими веб-сервисами и использование самой 1С как веб-сервиса.
Далее для экономии веб-сервис будет именоваться просто сервис.
Читайте также: