1с подключение к soap
При разработке приложений с глобальным взаимодействием уже давно известна архитектура SOA (Service Oriented Architecture).
Такая архитектура подразумевает, что приложения на разных платформах, в разных средах взаимодействуют между собой, при этом разработчик может не беспокоиться о том, что находится внутри приложений на той стороне (т.е. об их реализации), а также о том, что находится снаружи (т.е. об их среде окружения).
Существует достаточно большое количество реализации этой архитектуры. Одним из видов такой реализации является технология, основанная на связке специфицированных консорциумом w3c таких технологий, как веб-сервисы и протокол SOAP, которые в свою очередь основаны на XML. Уже достаточно длительное время эта технология интегрирована в платформу «1С:Предприятие». Благодаря этому «1С:Предприятие» может служить:
- «сервером приложений»
- поставщиком сервисов
- можно организовать взаимодействие между 1С и приложениями, написанными на других платформах
- можно организовать взаимодействие между различными системами на базе 1С и так далее.
Часть 1. Здравствуй, Name! Пример создания web-сервиса
Есть достаточное количество противников WS+SOAP и сторонников других технологий, как и тех, кто недолюбливает 1С. Однако существующая технология разработки на платформе 1С позволяет приступить к разработке и получить готовый результат довольно быстро при весьма поверхностном знакомстве с подробностями спецификаций SOAP, WSDL и веб-сервисов, по сравнению со многими другими известными продуктами как от гигантов софтверной индустрии, так и с бесплатными open-source решениями, что само по себе не является ни плюсом ни минусом, но заставляет задуматься.
Чтобы окончательно в этом убедиться, я твердо решил в качестве опыта реализовать при помощи web-сервисов хрестоматийный пример, на котором большинство студентов, изучавших вычислительную технику и программирование, практиковались ещё во время учебы в ВУЗ-ах, а именно игру «Жизнь» - клеточный автомат, придуманный английским математиком Джоном Конвеем в 1970 г.
Как установить веб-сервер
предоставляет только исходники своего продукта, воспользуемся скомпилированной версией
от Apache House. (это обязательно должна быть 32-разрядная версия, веб-расширение 1С не работает с 64-разрядной).
Загрузив архив, распакуем его куда-нибудь, например, в корневой каталог. Далее установим веб-сервер в качестве сервиса, запустив сервер из командной строки с параметром -k install, вот так:
Теперь нам нужно:
- создать в каталоге веб-документов каталог для публикации наших сервисов;
- установить web-расширение «1С:Предприятие»;
Как создать в каталоге веб-документов каталог для публикации наших сервисов
Каталог для публикации должен быть расположен в каталоге c:\Apache24\htdocs .
Как установить web-расширение «1С:Предприятие»
Теперь откроем панель управления: Панель управления\Программы\Программы и компоненты, выберем нужную версию программы «1С:Предприятие», нужно будет нажать правую кнопку и выбрать пункт «Изменить», затем «Изменить-Далее» и выбрать в списке
«Модули расширения Веб-сервера» (Web server extention modules) – рисунок 1.
Теперь создадим пустую файловую базу 1С, в ней роль «Полная» с полными правами на все группы объектов и пользователя Admin, назначив ему эту единственную роль.
На вопрос, будет ли это работать в файловом варианте, ответ положительный (во всяком случае этот простой пример работает как файловая база).
Как создать и опубликовать веб-сервис в 1С
В группе web-сервисы создадим новый объект с простым именем WebServiceTest, операцией с именем GetHelloString, которую будет обрабатывать функция Привет(Name). Тип значения параметра Name - string (берется из пространства имен
Осталось только опубликовать сервис.
Заходим в меню администрирование -> публикация на web-сервере. Откроется форма, в которую мы введем параметры публикации. Имя публикации должно совпадать с именем каталога на web-сервере.
В поле «Каталог» вводим путь к нашему каталогу на web-сервере, который мы создали ранее, то есть C:\Apache24\htdocs\WebServices\
Как протестировать веб-службу
Клиентская часть будет содержать чуть больше кода. Можно обращаться к сторонним сервисам двумя способами:
- использовать ws-ссылку (объект метаданных)
- создать ws-определение программно
Первый способ означает, что нам нужна ещё одна конфигурация, поэтому сейчас используем второй способ. Разница лишь в том, что мы создадим объект программно.
А именно в элементе
где ИмяСервиса — это атрибут Name этого элемента, то есть
ИмяТочкиПодключения — это атрибуты Name вложенных элементов
Обычно мы имеем две точки для разных версий SOAP, в нашем случае они называются
WebServiceTestSoap и WebServiceTestSoap12 — можно использовать любой из них.
разработчик компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Disclaimer: Статей на эту тему написано очень много и, как вы, конечно, догадались, это очередная. Возможно, вы узнаете из неё что-то новое, но ничего сверхсекретного, что нельзя было бы нагуглить самостоятельно, здесь не описано. Только заметки из личного опыта.
Вступление
Рассматривать будем только ситуацию, когда есть сторонний web-сервис и стоит задача наладить обмен данными.
Строение сервиса описывается в файле WSDL (англ. Web Services Description Language)
Файл чаще всего доступен по ссылке, где находится точка входа в сам web-сервис. Я написал «чаще всего», так как бывают исключения. Например, Web-сервис на базе SAP не публикует wsdl и его можно получить только выгрузив из самого приложения.
И так, у нас есть описание web-сервиса, логин, пароль. Давайте подключимся.
Отлично! Мы подключились к web-сервису! По идее это основа любого варианта обмена, так как позволяет создавать объект структуры данных на основании wsdl, а работать с таким объектом одно удовольствие.
Рассмотрим XML который нам выдает SoapUI
Теперь опишем его программно
В этот самый момент и возникает множество нюансов. Попробуем рассмотреть каждый.
Рецепт 1. Отправляем XDTO-объект целиком
Остается лишь обработать результат, который нам вернул сервис и на этом всё. Согласитесь, что это очень удобно!
Но на практике не всегда бывает так. Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних. В таких случаях приходится собирать soap вручную. Так же приходилось сталкиваться с web-сервисами, которые в качестве параметра ждут xml в чистом виде. Маразм, но все же делается это не слишком сложно.
Рецепт 2. Отправляем чистый xml в качестве параметра
Если не удалять пространство имен, которое 1с добавляет по умолчанию, то стало больше всего на 5 строк кода. Чаще всего я заворачиваю преобразование xml в функцию, так как обычно вызываем более одного метода.
В этом варианте нам придется собрать soap вручную. По сути мы просто оборачиваем xml из рецепта 2 в оболочку soap, где в зависимости от требований web-сервиса мы можем менять наш soap как душе угодно.
Далее описываем заголовки согласно документации. Некоторые сервисы спокойно прожуют наш запрос и без заголовков, тут надо смотреть конкретный случай. Если вы не знаете какие заголовки прописывать, то самый простой способ это подглядеть запрос в SoapUI переключившись во вкладку RAW.
Функция получения Base64 строки выглядит так (подсмотрел здесь):
Здесь по сути тоже самое, что и в предыдущем варианте, но работаем с COMОбъектом. Строку соединения указываем полностью, вместе с протоколом. Особое внимание следует уделить только флагам игнорирования ошибок SSL-сертификатов. Они нужны, если мы работаем по SSL, но без определенного сертификата, так как создать новое защищенное соединение в таком варианте не предоставляется возможным (или я не умею как). В остальном механизм схож с предыдущим.
На данный момент это все рецепты, что у меня есть. Если столкнусь с новыми, то обязательно дополню статью.
Обработка результата
В рецепте 1 мы чаще всего получаем готовый XDTO-объект и работаем с ним как со структурой. Во всех остальных случаях можно преобразовывать xml-ответ в XDTO
Вместо заключения
1. Начинайте работу с web-сервисами с программы SoapUI. Она предназначена для таких работ и позволит быстрее понять как работает тот или иной сервис. Для освоения есть статья про SoapUI.
4. Если вас пугает XDTO, то рекомендую ознакомится с циклом статей злого бобра Андрея XDTO - это просто.
5. Если аутентификация предполагает использование Cookie, то нашлась следующая статья.
P.S. Если у вас появились вопросы, предложения по улучшению кода, есть собственные рецепты, отличные от описанных, вы нашли ошибки или считаете, что автор "ниправ" и ему "не место в 1с", то пишите комментарии, и мы все обсудим.
UPD:
1. Добавил по просьбе join2us XML, который выдавал SoapUI
2. Исправил ошибки найденные пользователем VasilVtoroy
Описанный метод позволяет обратиться к веб-сервисам 1С из html-страницы через JavaScript. В качестве примера выводится список справочников. При нажатии на любой справочник выводятся первые буквы наименований. При нажатии на букву выводятся данные с наименованиями, начинающимися на эту букву.
Способ применим для случаев, когда веб-сервис и html-страница опубликованы на одном сервере. В этом случае не возникает кросс-доменных проблем. Например, если домены будут отличаться, то Chrome выдаст ошибку:
Failed to load resource: Origin localhost:3299 is not allowed by Access-Control-Allow-Origin
Не вдаваясь в подробности публикации веб-сервисов, предположим, что на стороне 1С создан и опубликован веб-сервис catalogs с операцией Execute. На входе — параметр script типа string, на выходе тип string. Операция запускает на стороне произвольный код script из параметра и возвращает JSON-сериализацию от переменной result.
С JSON-сериализацией удобно работать средствами JavaScript и преобразовать строку в объект/массив одной командой eval(resultText). В Интернете можно найти несколько JSON-сериализаторов для 1С.
Удостоверимся, что веб-сервис отвечает, введя его адрес:
На форме сверху разместим элементы настройки веб-сервера: wsUrl — адрес веб-сервиса, wsUser — логин, wsPassword — пароль. На стороне веб-сервиса 1С включена basic autherization. Логин и пароль соответствуют пользователю, прописанному в 1С.
Левая панель отвечает за отображение доступных справочников catalogsList, правая — за отображение букв (letters) и данных (catalogRecords).
JavaScript
Функция обращения к SOAP веб-сервису определена следующим образом:
Получение списка наименований каталогов.
Получение первых букв наименований справочника
Получение данных для каталога , где первая буква входит в условие .
При нажатии на кнопку Обновить происходит вызов функции
и при успешном выполнении вызывается обработчик processSuccess
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Аналогично обрабатываются нажатия на все управляющие элементы. Нажатие на справочник очищает буквы и данные, перезаполняет буквы. Нажатие на букву перезаполняет данные из справочника. За обработку кода на 1С отвечают куски кода в script-блоках с типом «text/1c».
Приложение выглядит так:
Нерешенная проблема авторизации на браузере IE
Существует проблема авторизации на IE. На IE 8/9 не удалось решить проблему basic authorization аналогичным для остальных браузеров методом.
На IE Ajax не работает с использованием user/password — свойств $.ajax. На FF и Chrome все работает нормально. По какой-то причине на сервер в случае с IE не передается заголовок
Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==
Если кто-нибудь знает причину и как обойти, пожалуйста, напишите в комментариях.
Выводы
Предложенный подход на основе SOAP имеет право на существование для несложных задач, так как сопровождается достаточно большим числом JavaScript кода. Возможно, в будущем удастся создать JavaScript фреймворк для упрощения процесса создания приложений.
Разработчики в этом способе самостоятельно отвечают за безопасность. Необходимо проверять входные параметры при записи, не позволять запуск произвольных скриптов, переданных с клиента. В статье выполнение произвольного кода показано только для примера. Унифицировать можно выполнение произвольного запроса, но это связано с опасностью SQL-инъекций.
Внешние компоненты Native API от 1С не будут работать в данной среде. Это значит, что нужно дополнительно решать проблему с написанием драйверов для оборудования.
Описанный метод позволяет обратиться к веб-сервисам 1С из html-страницы через JavaScript. В качестве примера выводится список справочников. При нажатии на любой справочник выводятся первые буквы наименований. При нажатии на букву выводятся данные с наименованиями, начинающимися на эту букву.
Способ применим для случаев, когда веб-сервис и html-страница опубликованы на одном сервере. В этом случае не возникает кросс-доменных проблем. Например, если домены будут отличаться, то Chrome выдаст ошибку:
Failed to load resource: Origin localhost:3299 is not allowed by Access-Control-Allow-Origin
Не вдаваясь в подробности публикации веб-сервисов, предположим, что на стороне 1С создан и опубликован веб-сервис catalogs с операцией Execute. На входе — параметр script типа string, на выходе тип string. Операция запускает на стороне произвольный код script из параметра и возвращает JSON-сериализацию от переменной result.
С JSON-сериализацией удобно работать средствами JavaScript и преобразовать строку в объект/массив одной командой eval(resultText). В Интернете можно найти несколько JSON-сериализаторов для 1С.
Удостоверимся, что веб-сервис отвечает, введя его адрес:
На форме сверху разместим элементы настройки веб-сервера: wsUrl — адрес веб-сервиса, wsUser — логин, wsPassword — пароль. На стороне веб-сервиса 1С включена basic autherization. Логин и пароль соответствуют пользователю, прописанному в 1С.
Левая панель отвечает за отображение доступных справочников catalogsList, правая — за отображение букв (letters) и данных (catalogRecords).
JavaScript
Функция обращения к SOAP веб-сервису определена следующим образом:
Получение списка наименований каталогов.
Получение первых букв наименований справочника
Получение данных для каталога , где первая буква входит в условие .
При нажатии на кнопку Обновить происходит вызов функции
и при успешном выполнении вызывается обработчик processSuccess
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Аналогично обрабатываются нажатия на все управляющие элементы. Нажатие на справочник очищает буквы и данные, перезаполняет буквы. Нажатие на букву перезаполняет данные из справочника. За обработку кода на 1С отвечают куски кода в script-блоках с типом «text/1c».
Приложение выглядит так:
Нерешенная проблема авторизации на браузере IE
Существует проблема авторизации на IE. На IE 8/9 не удалось решить проблему basic authorization аналогичным для остальных браузеров методом.
На IE Ajax не работает с использованием user/password — свойств $.ajax. На FF и Chrome все работает нормально. По какой-то причине на сервер в случае с IE не передается заголовок
Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==
Если кто-нибудь знает причину и как обойти, пожалуйста, напишите в комментариях.
Выводы
Предложенный подход на основе SOAP имеет право на существование для несложных задач, так как сопровождается достаточно большим числом JavaScript кода. Возможно, в будущем удастся создать JavaScript фреймворк для упрощения процесса создания приложений.
Разработчики в этом способе самостоятельно отвечают за безопасность. Необходимо проверять входные параметры при записи, не позволять запуск произвольных скриптов, переданных с клиента. В статье выполнение произвольного кода показано только для примера. Унифицировать можно выполнение произвольного запроса, но это связано с опасностью SQL-инъекций.
Внешние компоненты Native API от 1С не будут работать в данной среде. Это значит, что нужно дополнительно решать проблему с написанием драйверов для оборудования.
Коллеги, в данной статье будет рассмотрено взаимодействие и обмен между 1С и Soap. Мы подробно пройдемся по главным вопросам касательно данного протокола: что такое Soap, как с ним взаимодействовать, в том числе при работе с CMS 1С-Битрикс. Также предоставим практический пример настройки обмена 1С с протоколом Soap.
Далее будет рассмотрен обмен между 1С и Soap. Способ базируется на механизме файлов, то есть главном механизме любой ОС. Стоит отметить, что преимущество этого способа состоит в том, что источник внутри системы не владеет информацией о потребительских системах. Таким образом файл формируется и вкладывается в каталог с файлами, внутри которого остальные действующие участники могут брать данные из нашего файла. Но у данного способа есть недостатки: устаревшая информация, медленное обновление и невозможность точно отследить путь данных.
2. Работа с CMS 1С-Битрикс
В CMS 1С-Битрикс:Управление сайтом обычно совершается обмен информацией с 1С по стандарту, который является файловым обменом, но не имеет отношения к режиму реального времени, что неудобно.
Работа веб-сервисов – это воплощение точного интерфейса по обмену данными среди приложений (а они могут распределяться в разных углах внутри сети). Именно эта идея и стала отправным пунктом для развития SOA, архитектуры внутри приложения, ориентировка у которой идёт на сервис. Определим достоинства работы с веб-сервисами:
1. организация обменов в режиме «онлайн»;
2. у двух баз (отправляющей и принимающей) есть возможность работать на разных версиях платформы;
3. быстрая передача информации;
На сегодняшний день Протокол Soap является одним из наиболее востребованных. Чтобы провести реализацию веб-сервиса по протоколу Soap, нужно воспользоваться пакетом PHP, который является встроенным.
3. Практическая работа с веб-сервисом
Рассмотрим реальный пример: есть клиент, который просит разработать портал для сервиса бытовой техники и интегрировать его с 1С. Также пусть будет условие, что пользователи могут уточнять требования по сервису, и оно должно сразу «перенестись» в 1С. Пользователи могут узнавать все требования и документацию по сервису, основная база данных – это 1С. Также пусть ещё можно будет фильтровать записи, согласно названию, дате, серии и так далее.
В данной ситуации самый качественный обмен будет совершён по протоколу Soap. Настройки веб-сервиса проходят как обычно. Задача темы – подключиться к сервису в виде пользователя, и всё это реализуется при помощи пакета PHP SoapClient, для чего используем документ WSDL.
Чтобы всё работало корректно, нужно внутри файла php.ini задать специальные параметры, как на примере кода на скриншоте ниже. При помощи данных параметров происходит подключение пользователя для работы с Soap внутри файла init.php
Рис. 1 Параметры для подключения пользователя для работы с Soap
Далее в 1С нужно написать методы, которые будут использованы для отображения и получения данных онлайн.
На изображении далее приведена форма, в которой производится ввод данных, а далее кликом по кнопке «Зайти» будет запрошен результат.
Рис. 2 Форма ввода данных для работы с Soap
Так как в 1С был создан метод get_search_nomenclature_for_name($param), то на сервере можно увидеть всю нужную документацию для продукции в настоящем времени, которая хранится внутри базы 1С. На скриншоте ниже можно увидеть данный код, позволяющий получать все данные:
Рис. 3 Код для получения данных о продукции в 1С с Soap
После этого на сайте пользователь сможет видеть все необходимые данные по его запросу.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Читайте также: