Что такое веб-сервис. Павел чистов Как работают веб сервисы 1с

Здравствуйте.

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

И так начнем.

В первую очередь для PHP надо подключить модуль для работы по протоколу SOAP . Для windows надо в файле php.ini либо раскомментировать либо дописать строки
extension=php_soap.dll

Под windows замечена следующая особенность — файл php.ini надо обязательно положить в папку C:\Windows. Также необходимо перезапустить веб-сервер, если PHP установлен как модуль.

Рассмотрим 2 случая:

  1. Когда в параметр метода веб-сервиса необходимо передать строку
  2. Когда в параметр метода веб-сервиса необходимо передать объект пакета XDTO, который описан в 1С

Примем одно условие, что ответ веб-сервис 1С присылает в формате JSON . К сожалению поддержка формата JSON на уровне методов платформы появилось только в версии «1С Предприятие 8.3.6». Чтобы использовать формат JSON в более ранних версиях платформы есть хорошая обработка , которой можно воспользоваться, а можно и написать что-то свое, т.к. данный формат передачи данных не сложный.
Ответ веб-сервиса 1С будет в формате JSON с параметрами «Status» и «Message» (в данном примере я не использовал обработку , а описал ответ сам):

НашеСообщение = "Какое-то сообщение" ТекстОтветаВебСервисов = "{" + Символы.ПС + """Status""" + ":" + """Ok""" + "," + Символы.ПС + """Message""" + ":" + """" + НашеСообщение + """" + Символы.ПС + "}";

1 случай. Передача параметра в виде строки.

// Необходимо отключить кэширование для SOAP. Если этого не сделать, // функции веб-сервисов будут работать некорректно. ini_set("soap.wsdl_cache_enabled", 0); ini_set("soap.wsdl_cache_ttl", 0); $client = new SoapClient("//localhost:8080/ExampleBase/ws/ExampleWebService.1cws?wsdl", array("login" => "1C", //логин пользователя к базе 1С "password" => "54321", //пароль пользователя к базе 1С "soap_version" => SOAP_1_2, //версия SOAP "cache_wsdl" => WSDL_CACHE_NONE, "trace" => true, "features" => SOAP_USE_XSI_ARRAY_TYPE)); //Заполним массив передаваемых параметров $ParametrStroka = "TestStroka"; $params["ParametrStroka"] = $ParametrStroka; //Выполняем операцию $result = $client->ExampleMethod($params); //ExampleMethod - это метод веб-сервиса 1С, который описан в конфигурации. //Обработаем возвращаемый результат $jsResult = $result->return; $dataResult = json_decode($jsResult); $StatusResult = $dataResult->Status; //получим значение параметра Status, который был сформирован при ответе веб-сервиса 1С $MessageResult = $dataResult->

2 случай. Передача параметра в виде пакета XDTO 1C.
Допустим параметр XDTO — это документ «заказ клиента», который имеет реквизиты: номер документа, ФИО покупателя, табличная часть «Товары» (реквизиты — штрихкод товара, наименование товара, цена, количество, сумма). Для нашего примера пакет XDTO примет вид

// Необходимо отключить кэширование для SOAP. Если этого не сделать, // функции веб-сервисов будут работать некорректно. ini_set("soap.wsdl_cache_enabled", 0); ini_set("soap.wsdl_cache_ttl", 0); $client = new SoapClient("//localhost:8080/ExampleBase/ws/ExampleWebService.1cws?wsdl", array("login" => "1C", //логин пользователя к базе 1С "password" => "54321", //пароль пользователя к базе 1С "soap_version" => SOAP_1_2, //версия SOAP "cache_wsdl" => WSDL_CACHE_NONE, "trace" => true, "features" => SOAP_USE_XSI_ARRAY_TYPE)); //Заполним массив передаваемых параметров $ParametrXDTO= Array("DocumentNumber" => "0000001", "NameCustomer" => "Андрей Петрович", "Goods" => Array("Product" => array("ProductBarCod" => "8718863003152", "ProductName" => "Телевизор PHILIPS 40PFT4100/60", "Count" => 1, "Price" => 25000, "Summa" => 25000); $params["ParametrXDTO"] = $ParametrXDTO; //Выполняем операцию $result = $client->ExampleMethod($params); //ExampleMethod - это метод веб-сервиса 1С, который описан в конфигурации. //Обработаем возвращаемый результат $jsResult = $result->return; $dataResult = json_decode($jsResult); $StatusResult = $dataResult->Status; //получим значение параметра Status, который был сформирован при ответе веб-сервиса 1С $MessageResult = $dataResult->Message; //получим значение параметра Message, который был сформирован при ответе веб-сервиса 1С

На этом все. Как видите ничего сложно нет. Будут вопросы — спрашивайте.

Благо ограничений на работу с веб-сервисами в ней нет.

Добавление Web-сервиса в метаданные

Открываем дерево конфигурации, ветка Общие , далее Web-сервисы , добавляем новый веб-сервис (назову его my_ws) и заполняем свойства как показано на рисунке.

Необходимо сделать несколько пояснений о свойствах веб-сервисов

  • Пакеты XDTO — в этом поле указывается список пакетов XDTO, типы которых могут использоваться в значении, которое возвращается в результате выполнения операций веб-сервиса.
  • URI пространства имен — это строка, которая задает URI пространства имен для данного веб-сервиса. Любой веб-сервис можно однозначно идентифицировать по сочетанию его имени и пространству имен. Необходимо четко понимать, что это свойство не имеет ничего общего ни с физическим адресом веб-сервера, ни с сайтом органицации и т.д. Это просто некий виртуальный адрес. Поэтому присваивать надо внятное имя, которое сможет рассказать, например, об области расположения и применения веб сервиса. В частности может присутствовать аббревиатура типовой конфигурации к которой веб-сервис относится.

Операции веб-сервиса

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

В качестве примера создадим для нашего веб-сервиса операцию, которая будет возвращать классическую фразу «Привет мир!». Назовем ее Hello :

В модуле веб-сервиса создадим функцию ПриветМир() , ссылку на которую вставим в соответствующее свойство операции.

Функция ПриветМир() Возврат "Привет мир!" ; КонецФункции

Но у этой операции есть один недостаток. В нее нельзя передавать исходные данные. Для этих целей в операциях веб-сервисов используется подчиненные им объекты — Параметры .

Добавим еще одну операцию — HelloUsr , и создадим для нее параметр Name .

Эта операция будет у нас возвращать приветствие пользователю при помощи вызова вот такой функции:

Функция ПриветПользователь(ИмяПользователя) Возврат "Привет, " + ИмяПользователя + "!" ; КонецФункции

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

Теперь у нас все готово для публикации веб-сервиса. Для этого необходимо зайти в конфигуратор под правами администратора. Щелкаем по ярлыку 1С правой кнопкой и выбираем соответствующий пункт меню:

В меню выбираем Администрирование —> Публикация на веб-сервере

В открывшемся окне прописываем имя публикации, отмечаем пункт Публиковать Web-сервисы и также отмечаем созданный нами веб-сервис:

WS-ссылки

Для работы с веб-сервисами используется такой объект 1С как WS-ссылка . Она представляет собой WSDL описание веб-сервиса полученное путем импорта из источника на котором расположен веб-сервис. То есть в первую очередь нам надо знать адрес по которому мы сможем получить WSDL описание веб-сервиса. Применительно к нашему примеру в соответствии с настройками, которые мы делали в процессе создания и публикации веб-сервиса этот адрес будет выглядеть следующим образом

Http://localhost/professia1c/ws/my_ws.1cws?wsdl

Рассмотрим из каких же частей состоит этот адрес.

  • http://localhost/ — это адрес указывает на физическое расположение веб-сервера. Так как у меня он находится на локальной машине, то localhost, а на практике это либо IP-адрес сервера, либо его имя
  • professia1c — это имя публикации. Мы его вводили в поле Имя в диалоговом окне, когда публиковали веб-сервис
  • ws — признак того, что мы обращаемся к веб сервису
  • my_ws.1cws — имя файла публикации, которое мы указывали в свойствах при создании веб-сервиса
  • ?wsdl — параметр, который указывает, что нам нужно получить WSDL описание

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

  1. Использование динамической ws-ссылки.
  2. Создание статической ws-ссылки.

Рассмотрим каждый из этих способов

Динамические WS-ссылки

&НаСервере Процедура ПодключитьсяНаСервере() ВСОпределение = Новый WSОпределения("http://localhost/professia1c/ws/my_ws.1cws?wsdl" , "Сидоров" , "" ) ; ВСПрокси = Новый WSПрокси(ВСОпределение, "http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры

Как нетрудно догадаться, результатом выполнения этой процедуры будет текст в окне сообщения «Привет, Вася!»

Статические WS-ссылки

Вместо программного создания объекта WSОпределения мы можем непосредственно в дереве конфигурации создать объект метаданных WS-ссылка. В процессе создания будет выведено окно с предложением указать адрес WSDL определения для его импорта:

После этого мы можем в коде ссылаться непосредственно на эту WS-ссылку. И процедура по обращению к веб-сервису примет вот такой вид:

&НаСервере Процедура ПодключитьсяЧересСсылкуНаСервере() ВСПрокси = WSСсылки. WSСсылка_my_ws. СоздатьWSПрокси("http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры

Компания «» активно развивает платформу "1С:Предприятие" и с каждым релизом добавляет новые возможности. После старта развития ветки 8.3 новинок стало появляться особенно много и из-за постоянной занятости не успеваешь их все опробовать в деле. Не так давно я и как разработать полноценное мобильное приложение (да-да, на "1С:Предприятие"), а сегодня мне хотелось бы поговорить о создании HTTP-сервисов средствами платформы.

Возможность разработки HTTP-сервисов в составе конфигурации появилась еще в версии 8.3.5 . За это время компонента несколько раз обновлялась, и сегодня ей вполне можно пользоваться, не опасаясь за наличие «детских» ошибок. Мне еще не доводилось применять функционал платформы «1С:Предприятие» для создания http-сервисов в реальных условиях, поэтому пока опыт ограничивается учебными проектами. Однако, я вижу перспективы применения механизма http-сервисов в одном из текущих рабочих проектов. В этом цикле небольших заметок попробую показать типовые примеры использования http-сервисов в конфигурациях для платформы «1С:Предприятие ».

Создание простейшего http-сервиса в 1С:Предприятие 8.3

Сегодня мы рассмотрим пример самого простейшего http-сервиса, а затем будем его улучшать и усложнять. Цель урока – понять и прочувствовать простоту создания http-сервисов на базе платформы «1С:Предприятие 8.3».

Начнем, с формулировки задачи. Создаваемый в рамках заметки сервис должен уметь всего лишь две вещи: принимать GET запрос и отдавать ответ в формате JSON. Задача банальная и сделать что-то подобное на PHP/ASP .NET дело нескольких строчек кода. Забегая вперед, скажу, что в «1С:Предприятие» нам потребуется примерно столько же (ладно вам, не надо смеяться над странностями платформы 1С).

Про кейсы применения http-сервисов мы поговорим в отдельной заметке, а пока просто создадим новый http-сервис. Для удобства создадим новую информационную базу с пустой конфигурацией. Добавим в нее одну подсистему, которую назовем «ТестированиеHTTPСервисов ». Теперь откроем в дереве конфигурации раздел «Общие», найдем в нем группу «HTTP-сервисы » и добавим первый веб сервис. В окне создания нового сервиса заполним поля:

  • Имя - ПервыйВебСервис;
  • Синоним - Первый веб сервис;
  • Корневой URL - our-services;

Обратите внимание на поле «Корневой URL ». Указанное здесь наименование будет использоваться при обращении к сервису. Здесь не должно быть пробелов и желательно не использовать кириллицу. С этим разобрались, дальше переходим на закладку «Подсистемы » и добавляем http-сервис в единственную доступную подсистему.

Следующим шагом будет описание шаблона URL. Перейдем на соответствующую закладку и добавим шаблон с именем «ВывестиСписокУслуг ». В инспекторе свойств найдем свойство «Шаблон » и напишем в нем «/list ». Этим самым мы зададим путь, по которому будет происходить взаимодействие с http-сервисом. Шаблон может содержать специальные символы, позволяющие определить передаваемые параметры (как обязательные, так и нет), но для первого примера мы ограничимся простым «/list ». При переходе по этому пути будет срабатывать наш единственный метод, и отдавать клиенту набор данных.

Отлично, шаблон есть, теперь дело за методом. Добавим для нашего шаблона, который назовем getServicesList . В инспекторе свойств нам необходимо указать HTTP-метод. Указанное значение определяет, на какие типы запросов будет реагировать наш метод. Текущая задача вполне позволяет обойтись методом “GET ”.

Наш сервис почти готов, остается только прописать обработчик события для сконструированного метода getServicesList . Создать обработчик события можно через инспектор свойств. В теле обработчика пишем:

Функция ВывестиИндексgetServicesList(Запрос) МассивУслуг = Новый Массив; МассивУслуг.Добавить(Новый Структура("title, description", "Услуга №1", "Описание услуги №1")); МассивУслуг.Добавить(Новый Структура("title, description", "Услуга №2", "Описание услуги №2")); МассивУслуг.Добавить(Новый Структура("title, description", "Услуга №3", "Описание услуги №3")); МассивУслуг.Добавить(Новый Структура("title, description", "Услуга №4", "Описание услуги №4")); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, МассивУслуг); СтрокаДляОтвета = ЗаписьJSON.Закрыть(); Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить("Content-type", "application/json; charset=utf-8"); Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Возврат Ответ; КонецФункции

Разберем приведенный код чуть подробней. В самом начале я описываю массив, состоящий из структур. Этот массив нам нужен сугубо для демонстрации. Все его содержимое мы переведем в JSON и отдадим клиенту. Инициализируем объект типа ЗаписьJSON . Обязательно вызываем метод УстановитьСтроку (), т.к. нам необходимо получить текст JSON в строковую переменную. Далее вызываем глобальный метод ЗаписатьJSON (), которому передаем объект типа ЗаписьJSON и массив, который необходимо конвертнуть. Дальше получаем результат в переменную «СтрокаДляОтвета » и готовим HTTP-ответ.

В ответ мы добавляем (см. метод «УстановитьТелоИзСтроки ») получившийся JSON. Все, код демонстрационного примера готов и можно переходить к тестам.

Публикация HTTP-сервиса в 1С:Предприятие 8.3

Опубликуем созданный HTTP-сервис для тестирования результатов проделанной работы. Для простейшего теста в вашей систем должен быть установлен веб-сервер. У меня роль веб-сервиса выполняет Apache . Шаги, необходимые для установки/настройки веб-сервера мы пропустим, а перейдем к вопросу публикации HTTP-сервиса.

Для публикации необходимо перейти в меню «Администрирование» и выбрать пункт «Публикация на веб-сервере ». В появившемся окне заполняем:

  • Имя – имя нашего решения. Оно будет использоваться в URL при доступе к опубликованной ИБ. Например, если указать здесь test, то ваша ИБ будет доступна по адресу http://localhost/test. Меня устраивает вариант test.
  • Веб-сервер - Заполняется автоматически. У меня в качестве веб-сервера используется Apache 2.2;
  • Каталог – путь к директории, в которую будет помещен конфигурационный файл публикуемой ИБ;
  • Снимаем флажки «Публиковать тонкий клиент и веб-клиент », «Публиковать стандартный интерфейс OData », «Публиковать WEB-сервисы по умолчанию »;
  • На вкладке HTTP-сервисы отмечаем флаг «Публиковать HTTP-сервисы по умолчанию » и в табличной части отмечаем созданный сервис.

Тестируем HTTP-сервис

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

Http://localhost:9090/services/hs/our-services/list

Стоит обратить внимание на порт 9090 , который указан через двоеточие после имени хоста. Если вы ставили Apache с настройками по умолчанию, то у вас он будет слушать 80-й порт, следовательно, ничего указывать не нужно. В итоге URL будет таким:

Http://localhost/services/hs/our-services/list

Попробуйте перейти по нему, и если все работает корректно, вы получите страницу с данными в JSON формате:

[ { title: "Услуга №1", description: "Описание услуги №1" }, { title: "Услуга №2", description: "Описание услуги №2" }, { title: "Услуга №3", description: "Описание услуги №3" }, { title: "Услуга №4", description: "Описание услуги №4" } ]

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

Итак, первая часть должна быть понятна – localhost. Это имя хоста, на котором установлен веб-сервер. Дальше указывается ссылка (services) на опубликованную ИБ. Следом идет hs, этот элемент пути указывает, что нас интересует взаимодействие с http-сервисом. Последние два элемента – корневой URL нашего сервиса и шаблон URL.

Вместо заключения

«1С:Предприятие 8.3 » позволяет создавать простые HTTP-сервисы с минимум трудозатрат в чем вы и должны были убедиться после прочтения этой небольшой заметки. Функциональная возможность существенно расширяет варианты применения платформы. В следующих заметках мы поговорим о практических кейсах применения технологии и рассмотрим реализацию различных решений на практике.

Обмен данными обычно организовывается с помощью выгрузки файла из одной программы и загрузки в другую. Некоторые программисты предоставляют сторонним программам доступ в 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С.

Печать (Ctrl+P)

Механизм Web-сервисов в системе «1С:Предприятие» является средством поддержки сервисно-ориентированной архитектуры (Service-Oriented Architecture, SOA).
Сервисно-ориентированная архитектура представляет собой прикладную архитектуру, в которой все функции определены как независимые сервисы с вызываемыми интерфейсами. Обращение к этим сервисам в определенной последовательности позволяет реализовать тот или иной бизнес-процесс.
Сервисно-ориентированная архитектура предлагает новый подход к созданию распределенных информационных систем, в которых программные ресурсы рассматриваются как сервисы, предоставляемые по сети. Такой подход позволяет обеспечить быструю консолидацию распределенных компонентов (сервисов) в единое решение для поддержки определенных бизнес-процессов.
Механизм Web-сервисов позволяет использовать систему «1С:Предприятие» как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими промышленными системами с использованием сервисно-ориентированной архитектуры.
Конфигурация системы «1С:Предприятие» может экспортировать свою функциональность через Web-сервисы. Определения Web-сервисов задаются в дереве конфигурации и становятся доступны произвольным информационным системам благодаря публикации их на веб-сервере.
Кроме этого, система «1С:Предприятие» может обращаться к Web-сервисам сторонних производителей как через статические ссылки, определенные в дереве конфигурации, так и с помощью динамических ссылок, создаваемых средствами встроенного языка. Рис. 1. Web-сервисы

В основе сервисной архитектуры системы «1C:Предприятие 8» находится менеджер сервисов. Менеджер сервисов выполняет следующие функции:
● управление пулом соединений с информационными базами;
● поддержка WSDL описания сервиса;
● реализация протокола SOAP, сериализация сообщений, вызов соответствующего сервиса.
Менеджер сервисов выполняется в процессе сервисного хоста, который выполняет функцию приема/передачи сообщений из/в менеджер сервисов. В качестве сервисного хоста может использоваться веб-сервер IIS или Apache.
Менеджер сервисов содержит в себе пул соединений, через которые идет взаимодействие с базами данных системы «1С:Предприятие».
Механизм Web-сервисов, реализованный в системе «1С:Предприятие», поддерживает следующие стандарты:
● SOAP 1.1,
● SOAP 1.2,
● WSDL 1.1,
● WS-I Basic Profile 1.1,
● HTTP 1.1,
● TLS 1.x (TLS 1.1 и 1.2 поддерживаются, если не требуется передача клиентского сертификата на сервер), включая криптографические алгоритмы,
соответствующие ГОСТ Р 34.10-2001, Р 34.10-94, Р 34.11-94 и 28147-89;
● MTOM;
● Аутентификация: Basic, NTLM/Negotiate.

Для получения доступа к Web-сервису необходимо использовать адрес, который формируется следующим образом:

http://host/base/ws/ИмяWebСервиса

Http://host/base/ws/АдресWebСервиса .

Более подробно рассмотрим составные части адреса:

http://host/base – обычный URL, по которому выполняется доступ, например, к информационной базе с помощью веб-клиента. При наличии разделителей, не поддерживается указание значений разделителей с помощью параметра Z командной строки запуска клиентского приложения.

ws – признак того, что выполняется обращение к Web-сервису (в отличие от hs, который определяет доступ к HTTP-сервису, см. здесь).

ИмяWebСервиса – имя Web-сервиса. Задается в свойстве объекта Web-сервис.

АдресWebСервиса – описывает альтернативное имя для доступа к Web-сервису. Задается в свойстве Имя файла публикации объекта Web-сервис.Может быть изменено при публикации Web-сервиса.

Обращения по имени ИмяWebСервиса и адресу АдресWebСервиса Web-сервиса являются равносильными.

Предоставление функциональности через Web-сервисы

Для того чтобы функциональность системы «1С:Предприятие» стала доступна внешним потребителям Web-сервисов, нужно выполнить следующие действия:
● создать в конфигурации необходимое количество Web-сервисов,
● опубликовать Web-сервисы с помощью специального инструмента конфигуратора.
Описание процедуры публикации Web-сервисов и описание использования Reverse Proxy для доступа к «1С:Предприятию» написано главе 7 “Руководство администратора” на диске ИТС.
Создание Web-сервиса заключается:
● в добавлении в дерево метаданных объекта конфигурации Web-сервис,
● описании операций, которые может выполнять создаваемый Web-сервис,
● описании параметров операций Web-сервиса.
Объект конфигурации Web-сервис содержит модуль, в котором создаются процедуры на встроенном языке, выполняемые при вызове тех или иных операций Web-сервиса. Типы параметров операций Web-сервиса описываются с помощью типов XDTO и могут представлять собой либо значения XDTO, либо объекты XDTO.
Вызов Web-сервиса происходит следующим образом:
● из пула соединений выбирается подходящее соединение с информационной базой; при отсутствии необходимого соединения соединение создается;
● создается новый сеанс и для созданного сеанса вызывается событие УстановкаПараметровСеанса (в модуле сеанса);
● выполняется вызов затребованного метода Web-сервиса, при этом происходит вызов обработчика УстановкаПараметровСеанса() (в модуле сеанса) каждый раз, когда происходит обращение к не инициализированному параметру сеанса.
СОВЕТ. Не рекомендуется выполнять ресурсоемкие операции в обработчике события УстановкаПараметровСеанса .
Событие УстановкаПараметровСеанса модуля сеанса вызывается на сервере в привилегированном режиме. Модуль вызванного сервиса исполняется на
сервере в обычном режиме.
Модуль сеанса служит для инициализации параметров сеанса и выполнения некоторого набора команд при вызове любого Web-сервиса системы «1С:Предприятие».

Пример реализации Web-сервиса

Например, требуется создать Web-сервис системы «1С:Предприятие», который должен по переданному номеру расходной накладной возвращать состав ее табличной части. Аналогичный пример с помощью HTTP-сервисов будет рассмотрено в другой статьи.
Для описания возвращаемого значения создадим пакет XDTO ДанныеРасходнойНакладной с пространством имен http://www.MyCompany.ru/shipment, содержащий три типа объектов XDTO:
● Номенклатура – для передачи данных элемента справочника Номенклатура. Этот тип объекта XDTO будет содержать следующие свойства:
● Наименование – тип string из пространства имен
ПолноеНаименование – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
● ШтрихКод – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
● ЗакупочнаяЦена – тип int из пространства имен http://www.w3.org/2001/XMLSchema.
СтрокаРасходнойНакладной – для передачи данных одной строки расходной накладной. Этот тип объекта XDTO будет содержать следующие свойства:
● Номенклатура – тип Номенклатура из пространства имен ; представляет собой ссылку на объект XDTO,
который мы определили выше;
● Количество – тип int из пространства имен http://www.w3.org/2001/XMLSchema;
● Цена – тип int из пространства имен http://www.w3.org/2001/XMLSchema;
● Сумма – тип int из пространства имен http://www.w3.org/2001/XMLSchema.
РасходнаяНакладная – для передачи данных всех строк расходной накладной. Этот тип объекта XDTO будет содержать единственное свойство:
● Состав – тип СтрокаРасходнойНакладной из пространства имен http://www.MyCompany.ru/shipment . Представляет собой ссылку на объект XDTO,
который мы определили выше. Для того чтобы это свойство могло содержать неограниченное множество значений, необходимо установить его
свойство Верхняя граница в значение -1.
После того как необходимые типы XDTO созданы, следует добавить в конфигурацию новый Web-сервис ДанныеРасходнойНакладной со следующими значениями свойств:

URI Пространства имен – http://www.MyCompany.ru/shipment ;
● Пакеты XDTO – ДанныеРасходнойНакладной ;
Имя файла публикации – shipment.1cws .
У созданного Web-сервиса следует определить операцию Получить со следующими значениями свойств:
Тип возвращаемого значения РасходнаяНакладная из пространства имен http://www.MyCompany.ru/shipment ;
Возможно пустое значение – установлен;
● Имя процедуры – Получить .
У операции Получить следует определить параметр НомерДокумента со следующими значениями свойств:
● Тип значения – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
Направление передачи – Входной .
После этого следует открыть модуль созданного Web-сервиса и разместить в этом модуле функцию Получить() , которая будет выполняться при вызове данного Web-сервиса.

Функция Получить (НомерДокумента) Экспорт // Получить объект расходной накладной по переданному номеру ДокументСсылка = Документы.РасходнаяНакладная. НайтиПоНомеру(НомерДокумента, ТекущаяДата()); Если ДокументСсылка.Пустая() Тогда Возврат Неопределено; КонецЕсли; Документ = ДокументСсылка.ПолучитьОбъект() ; // Получить типы объектов XDTO НоменклатураТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "Номенклатура"); РасходнаяНакладнаяТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "РасходнаяНакладная"); СтрокаРасходнойНакладнойТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "СтрокаРасходнойНакладной"); // Создать объект XDTO расходной накладной РасходнаяНакладная = ФабрикаXDTO.Создать (РасходнаяНакладнаяТип); Для Каждого СтрокаДокумента Из Документ.Состав Цикл // Создать объекты XDTO строки расходной накладной // и номенклатуры СтрокаРасходнойНакладной = ФабрикаXDTO .Создать(СтрокаРасходнойНакладнойТип); Номенклатура = ФабрикаXDTO.Создать (НоменклатураТип); // Заполнить свойства номенклатуры Номенклатура.Наименование = СтрокаДокумента.Номенклатура.Наименование; Номенклатура.ПолноеНаименование = СтрокаДокумента.Номенклатура.ПолноеНаименование; Номенклатура.ШтрихКод = СтрокаДокумента.Номенклатура.ШтрихКод; Номенклатура.ЗакупочнаяЦена = СтрокаДокумента.Номенклатура.ЗакупочнаяЦена; // Заполнить свойства строки расходной накладно й СтрокаРасходнойНакладной.Номенклатура = Номенклатура; СтрокаРасходнойНакладной.Количество = СтрокаДокумента.Количество; СтрокаРасходнойНакладной.Цена = СтрокаДокумента.Цена; СтрокаРасходнойНакладной.Сумма = СтрокаДокумента.Сумма; // Добавить строку расходной накладной РасходнаяНакладная.Состав.Добавить (СтрокаРасходнойНакладной); КонецЦикла; // Вернуть расходную накладную Возврат РасходнаяНакладная ; КонецФункции

Работа с веб-сервисами сторонних поставщиков

Система «1С:Предприятие» может использовать веб-сервисы, предоставляемые другими поставщиками, несколькими способами:
● с помощью статических ссылок, создаваемых в дереве конфигурации;
● с помощью динамических ссылок, создаваемых средствами встроенного языка;
● комбинацией предыдущих способов.
Преимущество использования статических ссылок заключается в большей скорости работы, т. к. описание веб-сервиса поставщика получается один раз, при создании ссылки. В дальнейшем при обращении к данному веб-сервису используется существующее описание веб-сервиса.
При использовании динамических ссылок описание веб-сервиса поставщика будет получаться системой «1С:Предприятие» каждый раз при вызове веб-сервиса, что, естественно, будет замедлять работу с данным веб-сервисом. Однако преимуществом такого подхода является возможность получения актуального описания веб-сервиса поставщика. При использовании же статических ссылок для получения актуального описания веб-сервиса следует выполнить повторный импорт WSDL-описания средствами конфигуратора и сохранение измененной конфигурации.
При эксплуатации прикладных решений может возникать ситуация, когда один и тот же веб-сервис предоставляется по разным адресам (URL), однако имеет абсолютно одинаковое описание (WSDL). В этом случае возникает потребность загрузить описание веб-сервиса в конфигурацию (создать объект в дереве объектов конфигурации), но во время использования указать конкретный адрес, по которому расположен веб-сервис. Комбинированный способ позволяет работать таким образом. В качестве примера можно рассмотреть следующую ситуацию: есть тиражируемый веб-сервис, выполняющий
некоторую функцию. Прикладное решение, написанное на «1С:Предприятии», пользуется услугами данного сервиса, при этом адрес сервиса может быть различным (сервис тиражируемый), а описание – фиксированное. Тогда в прикладное решение может загрузить описание веб-сервиса, а в настройках прикладного решения предусмотреть ввод адреса конкретного экземпляра сервиса, который (адрес) и будет использоваться при работе.
Также доступно и другой способ: используется динамическая ссылка, но адрес расположения веб-сервиса получается не из файла описания (WSDL), а непосредственно указывается при создании объекта.
При попытке загрузить описание Web-сервиса в конфигураторе (создание статической ссылки) или при использовании динамической ссылки (при помощи объекта WSОпределения), система выполняет проверку загружаемого описания Web-сервиса (WSDL). Если в описании Web-сервиса присутствует ошибка (с «точки зрения» системы «1С:Предприятия»), то описание не будет загружено и будет сгенерировано исключение. В тексте исключения будет находиться подробная диагностика причин отказа в загрузке. Ошибки WSDL располагаются в порядке их обнаружения. Каждая ошибка WSDL содержит запись с детальным описанием следующего вида:

<Тип элемента с ошибкой>.<Имя>
[<Тип элемента с ошибкой>.<Имя>[…]]
<Описание ошибки>
<Тип элемента с ошибкой>
<Имя>
В этом описании:
● Тип элемента с ошибкой – тип элемента WSDL. Чаще всего соответствует имени тега в xml-файле, описывающем Web-сервис.
● Описание ошибки – описание конкретной ошибки.
● Имя – имя объекта WSDL, в котором произошла ошибка.

Пример использования статической WS-ссылки

В качестве примера использования веб-сервисов стороннего поставщика рассмотрим обращение к Web-сервису, который ранее был создан в примере выше

Прежде всего, следует добавить в дерево конфигурации новый объект конфигурации WS-ссылка с именем ДанныеРасходнойНакладной, ссылающийся на опубликованный сервис. Для этого следует выполнить импорт WSDL-описания опубликованного сервиса и в качестве URL указать http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl . Описание импорта WSDL-описания написано в другой статьи.
После этого, например, в модуле приходной накладной, можно создать процедуру, приведенную ниже. Она заполняет табличную часть документа данными расходной накладной поставщика, полученными с помощью веб-сервиса поставщика.

Процедура ПолучитьДанныеРасходнойНакладной (НомерНакладнойПоставщика) Прокси = WSСсылки.ДанныеРасходнойНакладной. СоздатьWSПрокси("http://www.MyCompany.ru/shipment", "ДанныеРасходнойНакладной", "ДанныеРасходнойНакладной"); ДанныеНакладной = Прокси.Получить() ; Если ДанныеНакладной = Неопределено Тогда Возврат; КонецЕсли; // Заполнить приходную накладную полученными данными Для Каждого СтрокаНакл Из ДанныеНакладной.Состав Цикл НоваяСтрока = ДокументОбъект.Состав.Добавить(); НоваяСтрока.Количество = СтрокаНакл.Количество; НоваяСтрока.Цена = СтрокаНакл.Цена; НоваяСтрока.Сумма = СтрокаНакл.Сумма; // Найти элемент номенклатуры по переданным данным // (например, по штрихкоду) НоваяСтрока.Номенклатура = Справочники.Номенклатура. НайтиПоРеквизиту ("ШтрихКод", СтрокаНакл.Номенклатура.ШтрихКод ); КонецЦикла; КонецПроцедуры

Если адрес реального расположения сервиса отличается от адреса, который использовался во время загрузки описания веб-сервиса в конфигурацию,
то новый адрес необходимо явно указать при создании объекта WSПрокси:

Пример использования динамической WS-ссылки

Использование динамической ссылки отличается от использования статической ссылки только способом создания WS-прокси и отсутствием необходимости создавать WS-ссылку в дереве конфигурации.
Если провести сравнение с примером, представленным в предыдущем разделе, то, в отличие от создания прокси на основе статической ссылки, при использовании динамической ссылки WS-прокси создается с помощью конструктора следующим образом:

// Создать WS-прокси на основании WS-определения
Определение = Новый WSОпределения (“http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl”);
Прокси = Новый WSПрокси (Определение , “http://www.MyCompany.ru/shipment”, “ДанныеРасходнойНакладной”, “ДанныеРасходнойНакладнойSoap”);
В то время как создание WS-прокси на основе статической ссылки выглядит следующим образом:

// Создать WS-прокси на основании ссылки
Прокси = WSСсылки.ДанныеРасходнойНакладной. СоздатьWSПрокси (“http://www.MyCompany.ru/shipment”, “ДанныеРасходнойНакладной”, “ДанныеРасходнойНакладной”);
Если адрес реального расположения сервиса отличается от адреса, который указан в WSDL-файле, используемом при создании определения веб-сервисов, новый адрес необходимо явно указать при создании объекта WSПрокси на основании определения веб-сервисов:

// Создать WS-прокси на основании WS-определения Определение = Новый SОпределения ("http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl"); Прокси = Новый WSПрокси (Определение , "http://www.MyCompany.ru/shipment", "ДанныеРасходнойНакладной", "ДанныеРасходнойНакладнойSoap",);

Редактирование свойств Web-сервиса

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

Свойства «Операции»

Помимо общих свойств объектов конфигурации операция Web-сервиса содержит следующие свойства:

● Тип возвращаемого значения – тип значения, которое возвращает операция Web-сервиса. Может являться типом значения XDTO или типом объекта
XDTO.
● Возможно пустое значение – показывает, может ли возвращаемое значение принимать неопределенное значение.
● В транзакции – показывает, будет ли выполняться код модуля Web-сервиса в транзакции или нет. Если свойство установлено, то при вызове Web-сервиса автоматически будет начата транзакция, а при завершении работы Web-сервиса транзакция будет либо зафиксирована, либо произойдет откат транзакции (в зависимости от результатов выполнения). Если свойство не установлено, при начале исполнения модуля Web-сервиса
транзакция не будет начата.
● Имя метода – имя экспортируемой процедуры модуля Web-сервиса, которая будет выполнена при вызове данного свойства.
На закладке Подсистемы указывается, к каким подсистемам относятся объекты данного типа.
На закладке Прочее определяются следующие свойства:
● URI пространства имен – содержит URI пространства имен Web-сервиса. Каждый Web-сервис может быть однозначно идентифицирован по своему
имени и URI пространству имен, которому он принадлежит. Пространство имен сервиса не должна совпадать с известными пространствами имен, которые уже используются или зарезервированы другими организациями. Рекомендуется в пространство имен сервиса включать фрагмент, уникальный для организации, которая ведет разработку Web-сервиса. Например, для организации с названием Промресурс имеет смысл начинать все пространства имен с префикса, например, http://promresurs.com. Тогда URI пространства имен Web-сервиса будет иметь вид http://promresurs.com/public/services/OurService.
● Пакеты XDTO – перечень пакетов XDTO, типы которых могут использоваться в качестве типов возвращаемого значения операций и типов параметров операций Web-сервиса.
● Имя файла публикации – имя файла описания Web-сервиса, который расположен на веб-сервере.
По кнопке Модуль открывается редактор модуля Web-сервиса.

Свойства «Параметр»
Помимо общих свойств объектов конфигурации параметр операции Web-сервиса содержит следующие свойства:
● Тип значения – тип значения параметра операции Web-сервиса. Может являться типом значения XDTO или типом объекта XDTO.
● Возможно пустое значение – показывает, может ли значение параметра операции принимать неопределенное значение.
● Направление передачи – определяет направление передачи данных с помощью данного параметра. Возможные значения:
● Входной – означает, что параметр используется для передачи данных Web-сервису;
● Выходной – означает, что параметр используется для получения данных от Web-сервиса;
● Входной-Выходной – означает, что параметр может использоваться как для передачи данных, так и для их получения от Web-сервиса.