Web-сервисы. Работа с Web-сервисами Terrasoft из внешних приложений Принимаем файл web сервисом 1с
Цель этой статьи
– помочь разобраться «как устроены» WEB-сервисы в «1С», понять «как механизмы работают» и «для каких задач» рационально использовать эти механизмы.
Особенностью статьи является то, что:
- Рассматриваются (и сравниваются между собой) разные способы и приемы, которые можно применять при интеграции «1С», WEB (php) и мобильных (Ios, Android) приложений;
- Одновременно приведены примеры решения как на стороне «1С», так и на стороне WEB-серверов (PHP);
- Собрана вместе вся необходимая информация (пошаговые инструкции), чтобы осуществить «быстрый старт», начать разработку. Т.е, что бы «не убить много времени» на изучение и настройку WEB-серверов, windows, «борьбу» с системными ошибками и пр.
- 1C: Программистам и WEB-специалистам, изучающим интеграцию с использованием технологии web-сервисов;
- Проектировщикам, IT-аналитикам - понять «суть» и сделать рациональный выбор технологий при создании проектов.
1.1 Возможности технологий, поддержка платформой 1С
1.2 Применимость технологий по задачам клиент-серверного взаимодействия.
2. Быстрый старт. С чего начать?
Пункт №0.
Прежде всего, необходимо выбрать (определиться) с технологией интеграции и понять "суть" - т.е как это будет работать.
Иначе говоря, нужно ответить на два вопроса:
- Какая база 1С (или другая программа) будет выступать в роли клиента, и какая в роли сервера;
- Какая технология взаимодействия клиента и сервера более подходит вам и будет использоваться.
Пункт №1.
Итак, "суть" клиент-серверного взаимодействия - осознана. Технология взаимодействия - определена. Теперь следует создать "полигон", на котором и будет осуществляться разработка.
В данной статье, на примерах будут рассмотрены две технологии:
Работа с механизмом WEB -сервисов.
Будут рассмотрены примеры работы со стороны 1С 8 и PHP;
Работа с механизмом http-запросов (REST Web-сервисы).
Так же будут рассмотрены примеры работы со стороны 1С 8 и PHP;
В задачах, связанных с WEB-разработкой, традиционно принято:
- Создавать "полигон" для разработки и отладки на локальном WEB-сервере программиста (localhost);
- После того, как разработка завершена, результаты необходимо перенести на "боевой" WEB-сервер.
На практике (особенно когда начинаешь "знакомство" с технологией WEB-сервисов) при создании "полигона", а так же при переносе проекта на "боевой" сервер, возникает много "грабель".
Так вот, что бы «не убить» много времени на "борьбу" c настройками IIS (Internet Information Server) / освоение сервера apache , и настройку прав доступа Windows, я рекомендую следующее:
- (1) "Полигон" создавать на вашей локальной рабочей машине. Операционная система - Windows 7 (проф или максимальная). Все работу - выполнять под учетной записью администратора.
- (2) Базу 1С 8 развернуть в клиент-серверном режиме (MS SQL сервер, рекомендую 2008 R2). Использование 1С 8 в режиме клиент-сервера снимет необходимость выполнять доп. настройки по правам доступа к базе 1С со стороны WEB-сервера.
- (3) Установить IIS , если он отсутствует. В windows его можно штатно "доустановить"
"Галочки" для опций установки компонентов IIS можно ставить "по умолчанию".
Существенным, на что требуется обратить внимание, это следующие опции (расширения ISAPI - это нужно для работы soap-соединений в WEB-сервисах, и CGI - это потребуется для работы PHP)
После завершения установки IIS убедимся, что он заработал. Для этого, в адресной строке WEB-браузера введем:
(4) Публикация (подключение) базы 1С на WEB-сервере.
И так, WEB-сервер IIS установлен и работает. Опубликуем нашу базу 1С и проверим, что теперь доступ к ней возможен и через WEB-клиента тоже.
Публиковать на WEB-сервере целесообразно ту базу 1С, в которой предусмотрена работа в режиме управляемого приложения (тонкого клиента).
Публикация базы 1С выполняется так:
В режиме конфигуратора, нужно вызвать пункт "Публикация на веб-сервере"
б) Указать параметры публикации:
Т.е в каталоге (папке) wwwroot вашего IIS нужно создать отдельную папку (каталог) для публикации вашей базы 1С.
каталог wwwroot будет создан автоматически, при установке IIS
Cоздадим и выберем такую папку (wsBase10), укажем имя для публикации (тоже назовем ee wsBase10).
Если, вдруг, в ответ вы получите сообщение,
то не пугайтесь.
Механизм публикации 1С весьма капризный. Попробуйте нажать на "Опубликовать" еще раз.
И если в результате вы получите сообщение,
то значит все заработало.
Очень важно понимать, что при публикаации базы 1С и ее WEB-сервисов на "боевом" сервере (на пример, Windows 2008 R2) часто возникают ошибки, если вы решите использовать web-cервер IIS .
Cовет: не ставьте на "боевой" сервер IIS ! Установите apache .
Это оградит вам от многих системеных ошибок. И публикация (перепубликация - при изменениях в конфигурации) будет проходить для apache гладко, без необходимости "ковыряться" в vrd - файликах и настройках IIS .
В данной статьe я не будут рассматривать процесс установки и настройки apache. На эту тему существует другие источники.
Однако, для совместной работы apache c базой 1С (и web-сервисами) есть несколько очень важных требований, которые нужно знать (донесите это до вашего системного администратора).
1. При установке apache обязательно включите поддержку расширений ISAPI.
2. Включите поддержку cgi-bin, если вам предстоит работать с PHP;
3. В базу 1С потребуется ввести специального «пользователя»…
У этого пользователя должна быть аутентификация операционной системы. И нужно указать того пользователя, от имени которого и запускается apache .
... С apache закончили и снова вернемся на наш "Полигон".
Вот видим – 1С запускается. WEB-сервер совместно с 1С - заработал.
4.
Установить службу PHP для WINDOWS.
Она понадобиться, если в рамках вашей задачи необходимо разрабатывать клиентские (web-страницы доступа к 1С) или серверные (сценарии обработки http-запросов со стороны 1С) на PHP.
5 Добавим в IIS каталог wsClient10, в котором будут работать наши PHP-скрипты.
PHP скрипты мы будем использовать:
- Для создания клиентской части, при разработке WEB-сервисов 1С;
- Для разработки серверной части, при разработке REST web сервисов (http-запросы).
6. Установим программу Notepap++. Эту компактую и удобную программу советую использоваться для редактирования PHP-скриптов.
После установки Notepad++ сразу же проверим, что PHP у нас работает. Создадим для этого простейший скрипт hello.php. Разместим его в каталоге wsClient и запустим скрипт из браузера:
Все ОК. PHP заработал. Тестовый "Полигон" полностью готов.
3. Создание WEB-сервиса, soap запросы, XDTO и JSON. Примеры 1С и PHP.
На данном этапе "Полигон" должен быть у вас готов и можно приступать к разработке WEB-сервисов.- С чего же начать изучение этой технологии? Конечно же, с классической задачки типа "Hello word"!
1. Задача создания простейшего WEB -сервиса. Рассмотрим примеры на 1С и PHP .
1.1. Добавим в базу (wsBase10) web-сервис "_РасчетыПоТарифам"
Имя файла публикации зададим "calcOrder10.1cws". URI-пространство имен так же необходимо указать. В принципе, можно указать любое имя.
1.2. Добавим в рамках web-сервиса "_РасчетыПоТарифам" операцию "getHello".
Суть выполнения операции будет простейшая - принять на входе (с клиента) три параметра (строки, числа) и вернуть ему назад (в виде результата) объединяющую строку. Тип возвращаемого значения будет примитивный - string.
Галочку "В транакции" ставить не будем, так как операция не будет изменять данные в самой базе 1С.
Если бы наша операция изменяла данные в базе 1С, то установка данной галочки имела бы смысл.
Имя метода (функции), которая будет обрабатывать входящие данные (и возвращать результат) зададим - "getHello".
1.3. Добавим для операции "getHello" входящие параметры.
Направление передачи - "входной". Т.е передаются с клиента на сервер.
1.4.
В модуле web-сервиса напишем обработчик операции "getHello"
///////////////////
Функция getHello(strParametr, floatParametr, integerParametr)
возврат strParametr+строка(floatParametr+integerParametr)
КонецФункции
////////
1.5. На этом, работа по созданию простейшего WEB-сервиса завершена. И теперь, необходимо опубликовать WEB-сервис "_РасчетыПоТарифам".
Перед тем как публиковать на "полигоне" web-сервис, удалим всех пользователей из списка пользователей нашей информационной базы. Т.е список пользователей сделаем "пустым".
- Зачем это делать?
На "полигоне" подключаться к WEB-сервисам будет только разработчик, а по этому обеспечивать аутентификацию пользователя при подключения к WEB-сервису – нет смысла.
Т.е мы осознано упростим себе работу с WEB-сервисами на тестовом "полигоне".
Нам не нужно будет указывать логин и пароль при устновке соединения.
А вот на "боевом" сервере обеспечивать аутентификацию, разумеется, придется.
Для этого (как уже было сказана ранее) в "боевой" базе нужно будет отдельно создать пользователя, от имени которого запускается сам WEB-сервер. И тогда, при установлении соединения с WEB-сервисом (soap соединение) нужно будет еще указывать логин и пароль данного пользователя.
1.6. И так, опубликуем WEB-сервис:
Замечу, что устанавливать флажок "Использовать аутентификацию операционной системы на веб-сервере" нам не придется. Это потому, что данный режим предусмотрен только для WEB-сервера IIS , а на "боевом" сервере будет работать Apache .
1.7. Создадим клиенскую часть и протестируем работу WEB-сервера.
а) Сначала, осуществим клиентский вызов из 1С.
Поступим просто. В любой другой базе 1с, которая у вас есть, создадим внешнюю обработку. В этот обработке подключимся к WEB-сервису, воспользуется операцией "getHello", передадим туда параметры и получим ответ от сервера.
Код на "1С" будет примерно таким:
/////
&НаКлиенте
Процедура ВыполнитьЗапрос10(Команда)
// Вставить содержимое обработчика.
СтрокаРезультат = СЕРВЕР_ВыполнитьWSЗапрос10();
Предупреждение(СтрокаРезультат);
КонецПроцедуры
&НаСервереБезКонтекста
Функция СЕРВЕР_ВыполнитьWSЗапрос10()
// Аутентификацию на тестовом полигоне осуществлять не будем!
ИмяПользователя = неопределено;
Пароль = неопределено;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",ИмяПользователя,Пароль);
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = Неопределено;
strРезультат = Прокси.getHello("Иванов",100.35,20);
возврат strРезультат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////
Протестируем работу функции СЕРВЕР_ВыполнитьWSЗапрос10().
Ок. Работает!
б)
Теперь осуществим клиентский вызов web-сервиса из PHP.
Код скрипта PHP будет примерно таким:
/
//////////////////////////////////////////////////////////////////////////////////
error_reporting(E_ERROR); // 1. Отключаем лишние сообщения
// 2. Отключаем кэширование для SOAP. Если этого не сделать,
// 3. Устанавливаем soap-соединение
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
array(
"login" => null, //логин, аутентификацию выполнять не будем
"password" => null, //пароль
"trace" => true,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"compression" =>
);
// 4. Заполнием массив передаваемых параметров
$params["strParametr"] = "test_Soap10:";
$params["floatParametr"] = 10.34;
$params["integerParametr"] = 12;
// 5. Выполняем операцию getHello
$result = $client->getHello($params);
// 6. Выводим результат на экран
var_dump($result);
?>
////
///
Вызовем скрипт из браузера и проверим его работу:
Все отлично, вызов 1С из WEB-страницы - работает!
Подведем некоторые итоги:
Задача по простейшему WEB-сервису решена. И теперь, можно браться за создание более сложных WEB-сервисов.
А усложнение будет в том, что (пока) мы оперировали только с примитивными типами данных. Разумеется, нам необходимо будет передавать/принимать и объектные (агрегированные) типы данных.
2. Задача создания WEB -сервиса, использующего XDTO -пакеты.
Как и ранее, рассмотрим примеры на 1С и PHP.
Поставим себе такую задачу: WEB-сервис должен возвращать нам не строку, а объектные данные - "таблицу значений" (а точнее говоря, это будет массив объектов!).
Для того, что бы описывать разнообразные структуры данных (которые потребуются при приеме/передаче на WEB-сервер) в платформе 1С:8 предусмотрен механизм XDTO-пакетов.
Т.е. сначала описываем все необходимые нам типы данных, а затем уже укажем:
- C какими пакетами XDTO может работать наш WEB-сервис (можно указать как один, так и перечень пакетов);
- Для каждого параметра операции и возвращаемого ею результата можно указать: какого типа данных (из пакета XDTO) он будет.
Создадим операцию GetTzTariffs_0, которая будет возвращать данные типа tzTariffs.
На рисунке показано, что tzTariffs включает в себя неограниченное количество объектов el. Фактически, tzTariffs - это таблица объектов типа el.
- Как это увидеть?
Продвигаясь по иерархии вниз, можно увидеть, что тип tariff является структурой (максимальное и минимально количество = 1), в один из реквизитов которой входит тип kindOfTariff.
Итого: пакет XDTO позволяет наглядно описать иерархию типов данных, которые будут использоваться далее при взаимодействии в WEB-сервисом.
Cовет: Лучше использовать для web -сервиса один пакет XDTO , что бы не усложнять и избежать ошибок проектирования.
Идем далее... После того, как:
- Пакет XTDO cоздан;
- Все типы данных описаны;
- Для WEB-сервиса указано использование данного пакета;
- Для параметров и результатов операций выбраны соответствующие типы (из пакета XDTO)
В нашем примере операция GetTzTariffs_0 должна возвращать массив строк, cодержащих объекты Tariffs.
////////////////
Функция GetTzTariffs_0()
// Вставить содержимое обработчика.
Возврат ПолучитьТЗТарифов_0();
КонецФункции
Функция ПолучитьТЗТарифов_0()
// Заполнение ТЗ
// 1-я строка
kindOfTariff.active = ложь;
tariff.kind = kindOfTariff;
elementTZ.eTariff = tariff;
elementTZ.cPrice = 100;
//
// 2-я строка
kindOfTariff = ФабрикаXDTO.Создать(kindOfTariffТип);
tariff = ФабрикаXDTO.Создать(tariffТип);
tariff.begdate = ТекущаяДата();
tariff.kind = kindOfTariff;
elementTZ = ФабрикаXDTO.Создать(elementTZТип);
elementTZ.eTariff = tariff;
elementTZ.cPrice = 200;
// Добавляем 2-ю строку в таблицу
tzTariffs.el.Добавить(elementTZ);
Возврат tzTariffs;
КонецФункции
//////////
Далее, приведем пример вызова операции "GetTzTariffs_0" с клиентской части, из 1С.
&НаКлиенте
Процедура ВыполнитьЗапрос20(Команда)
// Вставить содержимое обработчика.
Предупреждение(СЕРВЕР_ВыполнитьWSЗапрос20());
КонецПроцедуры
&НаСервереБезКонтекста
Функция СЕРВЕР_ВыполнитьWSЗапрос20()
Определения = новый WSОпределения("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Прокси = новый WSПрокси(Определения,"www.URI.com","_РасчетыПоТарифам","_РасчетыПоТарифамSoap");
XDTOРезультат = Прокси.GetTzTariffs_0();
// Обратимся к строке по индексу ноль, далее к рекизиту eTariff, далее к вложенному реквизиту kind, далее к вложенному реквизиту name.
КонецФункции
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Аналогичный вызов из PHP и обработка результатов XDTO будет такой:
////////////////////////////////////////////////////////////////////////////////////
// функции веб-сервисов будут работать некорректно.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
$result = $client->GetTzTariffs_0();
$mResult = $result->return->el;
// mResult - массив объектов. Обойдем элементы массива и выведем результаты на экран
for ($i=0; $i
echo "
";
$eTariff = iconv("utf-8","cp1251",$mResult[$i]->eTariff->fullName);
var_dump($eTariff);
$cPrice = $mResult[$i]->cPrice;
var_dump($cPrice);
$cComment = $mResult[$i]->cComment;
var_dump($cComment);
echo "";
}
?>
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
Теперь еще усложним задачу
. Передадим с клиента на WEB-сервис (в качестве параметра) то же объектный тип данных. Пусть это будет tzKind.
Для этого сначала опишем этот тип в пакете dataTariffs, а затем добавим операцию GetTzTariffs_1.
Укажем тип параметра tzKind.
Пример работы WEB-сервиса с входящим параметром XDTO:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ПолучитьТЗТарифов_1(tzKind)
tzTariffsТип = ФабрикаXDTO.Тип(" ", "tzTariffs");
tzTariffs = ФабрикаXDTO.Создать(tzTariffsТип);
elementTZТип = ФабрикаXDTO.Тип(" ", "elementTZ");
tariffТип = ФабрикаXDTO.Тип(" ", "tariff");
kindOfTariffТип = ФабрикаXDTO.Тип(" ", "kindOfTariff");
// Заполнение ТЗ
// 1-я строка
kindOfTariff = ФабрикаXDTO.Создать(kindOfTariffТип);
kindOfTariff.name = "Перевозка";
kindOfTariff.active = ложь;
tariff = ФабрикаXDTO.Создать(tariffТип);
tariff.fullName = "Тариф 1";
tariff.begdate = ТекущаяДата();
tariff.kind = kindOfTariff;
elementTZ = ФабрикаXDTO.Создать(elementTZТип);
elementTZ.eTariff = tariff;
elementTZ.cPrice = 100;
elementTZ.comment = "Описание тарифа 1";
// Добавляем 1-ю строку в таблицу
tzTariffs.el.Добавить(elementTZ);
// 2-я строка
kindOfTariff = ФабрикаXDTO.Создать(kindOfTariffТип);
kindOfTariff.name = "Доставка";
kindOfTariff.active = истина;
tariff = ФабрикаXDTO.Создать(tariffТип);
tariff.fullName = "Тариф 2";
tariff.begdate = ТекущаяДата();
tariff.kind = kindOfTariff;
elementTZ = ФабрикаXDTO.Создать(elementTZТип);
elementTZ.eTariff = tariff;
elementTZ.cPrice = 200;
elementTZ.comment = "Описание тарифа 2";
// Добавляем 3-ю строку в таблицу (заполним ее по входящим данным)
tzTariffs.el.Добавить(elementTZ);
// 3-я строка
kindOfTariff = ФабрикаXDTO.Создать(kindOfTariffТип);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
tariff = ФабрикаXDTO.Создать(tariffТип);
tariff.fullName = "Тариф 3";
tariff.begdate = ТекущаяДата();
tariff.kind = kindOfTariff;
elementTZ = ФабрикаXDTO.Создать(elementTZТип);
elementTZ.eTariff = tariff;
elementTZ.cPrice = 300;
elementTZ.comment = "Описание тарифа 3";
// Добавляем 3-ю строку в таблицу
tzTariffs.el.Добавить(elementTZ);
Возврат tzTariffs;
КонецФункции
//////////////////////////////////////////////////////////////////////////////////
Cо стороны клиента "1С" нам потребуется подготовить данные типа tzKind и передать их на WEB-cервис.
Приведу пример такого вызова:
/////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ВыполнитьЗапрос30(Команда)
// Вставить содержимое обработчика.
Предупреждение(СЕРВЕР_ВыполнитьWSЗапрос30());
КонецПроцедуры
&НаСервереБезКонтекста
Функция СЕРВЕР_ВыполнитьWSЗапрос30()
Определения = новый WSОпределения("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Прокси = новый WSПрокси(Определения,"www.URI.com","_РасчетыПоТарифам","_РасчетыПоТарифамSoap");
// Сформируем таблицу параметров, передаваемых в WS
tzKindТип = Прокси.ФабрикаXDTO.Тип(" ", "tzKind");
tzKind = Прокси.ФабрикаXDTO.Создать(tzKindТип);
kindOfTariffТип = Прокси.ФабрикаXDTO.Тип(" ", "kindOfTariff");
kindOfTariff = Прокси.ФабрикаXDTO.Создать(kindOfTariffТип);
kindOfTariff.name = "Тестовый вид тарифа";
kindOfTariff.active = ложь;
elementKindТип = Прокси.ФабрикаXDTO.Тип(" ", "elementKind");
elementKind = Прокси.ФабрикаXDTO.Создать(elementKindТип);
elementKind.eKind = kindOfTariff;
elementKind.qty = 10;
// Добавляем строку в таблицу
tzKind.el.Добавить(elementKind);
XDTOРезультат = Прокси.GetTzTzriffs_1(tzKind);
ПримерРезультат_НаименованиеВидаТарифа = XDTOРезультат.el.eTariff.kind.name;
Возврат ПримерРезультат_НаименованиеВидаТарифа;
КонецФункции
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Обращу ваше внимание на конструкцию: Прокси.ФабрикаXDTO.Тип("...
Т.е создавая на клиенте объект пакета XDTO мы должны обращаться не к собственной фабрике XDTO!, а через Прокси. Т.е к фабрике XDTO сервера.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
А теперь настала пора задаться вопросом:
нет ли альтернативы объектам XDTO
?
Можно ли вообще "не связываться" с фабрикой XDTO , передавать/принимать с WEB -сервиса как-то иначе.. (тем более, если клиент не 1С, а например WEB -страница, приложение на Android , iOS и пр) .
Ответ такой
– да, можно!
Например, можно в качестве типов параметров использовать строку. А в нее "упаковывать" (сериализовывать) структуры данных.
Такая технология в WEB-программировании давно разработана и называется JSON .
Большим подспорьем является и то, что в PHP упаковка/извлечение любой структуры/массива строку выполняется в одно действие!
Пример в PHP упаковки объектов в JSON/извлечения, передачи/приемки на WEB-сервис:
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// сериализация массив mDelivery в строку и поместим в параметр delivery
// * Сначала опишем структуру delivery
class delivery {
var $id;
var $checked;
var $value;
}
// Заполним структуру некоторыми данными
$sDelivery = new delivery;
$sDelivery->id = "000000005";
$sDelivery->checked = TRUE;
$sDelivery->value = 0;
// Добавим ее в массив объектов mDelivery
$mDelivery = $sDelivery;
// Преобразуем массив mDelivery в JSON строку и поместим результат в параметр delivery
$params["delivery"] = json_encode($mDelivery);
// Вызовем операцию ExitCalcOrder на WEB-сервисе и передадим в нее параметр (строку - delivery);
$result = $client->ExitCalcOrder($params);
// Получим в переменную jsCalcResult (строку) результат выполнения операции ExitCalcOrder
$jsCalcResult = $result->return;
// Выполним обратное преобразование: из строки jsCalcResult в объект (массив объектов, типа соответствие) arrCalcResult
$arrCalcResult = json_decode($jsCalcResult);
// Выведем информацию на экран, об объекте arrCalcResult
var_dump($arrCalcResult);
////////////////////////////////////////////////////////////////////////////////
А как же выполнять JSON преобразования в 1С?
Платформа 1С 8 не поддерживает стандарт JSON, но это - не беда.
Существует, доступна и прекрасно работет обработка преобразования/извлечения из JSON от
// Copyright © 2010-2012 Александр Переверзев
// 1С:JSON . JavaScript Object Notation парсер и сериализатор.
Таким образом, достаточно поместить эту обработку вашу конфигурацию и вы сможете с лекгостью выполнять прямые и обратные JSON-преобразования:
Пример сериализации объекта 1С в JSON строку
:
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
ДанныеПоГрузу = новый Структура;
ДанныеПоГрузу.Вставить("code",КодГруза);
ДанныеПоГрузу.Вставить("number",НомерГруза);
ДанныеПоГрузу.Вставить("plan",КолвоПлан);
ДанныеПоГрузу.Вставить("character",ХарактерГруза);
ДанныеПоГрузу.Вставить("packing",Упаковка);
ДанныеПоГрузу.Вставить("damage",ПовреждениеУпаковки);
ДанныеПоГрузу.Вставить("volume",Объем);
ДанныеПоГрузу.Вставить("weight",Вес);
ДанныеПоГрузу.Вставить("status",Статус);
jsResult = JSON.ЗаписатьJSON(ДанныеПоГрузу); //Преобразуем результат в JSON
Возврат jsResult;
Пример извлечения объекта в 1С из JSON строки
:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1. Восстановим объекты из JSON
JSON = Обработки.JSON.Создать();
мdelivery = JSON.ПрочитатьJSON(delivery);
// в результате, мdelivery - это массив. Элемент массива - соответствие.
// Т.е, например, мdelivery.["id"] будет содержать "000000005"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
В завершении, приведу пример вызова web-сервиса 1с из PHP, c получением возвращаемой JSON структуры ее обратного преобразования в объекты PHP.
Обратим внимание на преобразования
iconv("cp1251","utf-8
","
и iconv("utf-8","cp1251
", которые потребуются (при взаимодействии PHP - 1 C) для преобразования строк кириллицы из кодировки cp 1251 в utf -8 и обратно.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
error_reporting(E_ERROR); // Отключаем сообщения
// Отключаем кэширование для SOAP. Если этого не сделать,
// функции веб-сервисов будут работать некорректно.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/wsQuery.1cws?wsdl ");
$params["fname"] = iconv("cp1251","utf-8","dataFreight");
$params["param1"] = iconv("cp1251","utf-8",$_GET["code"]);
$params["param2"] = iconv("cp1251","utf-8",$_GET["number"]);
$result = $client->executeQuery($params);
$jsResult = $result->return;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
Вероятный сценарий такой: удаленный пользователь из некой своей программы (например, с WEB-сайта, мобильного приложения и др.) вызывает ваш WEB-сервис и… не получает результатов.. Либо получает, но что-то не то.
Вопрос: - Как узнать о таких ошибках и отлаживать работу WEB-сервиса?
Рекомендую вам использовать для мониторинга ошибок (и сбора входящих параметров «что привело web-сервис к ошибке) журнал регистрации.
Т.е. в месте возможного возникновения логических ошибок програмно сохранять информацию о входящих параметрах в журнале регистрации (ЗаписьЖурналаРегистрации)
Если вы «боретесь» с «ошибками времени исполнения», то их можно перехватывать (попытка – исключение) и «точечно» протоколировать всю ситуацию.
В итоге, по журналу регистрации вы сможете увидеть информацию об ошибках, воспроизвести параметры возникновения и уже в интерактивном режиме, в отладчике, «победить» ее.
Подведем итоги: Примеры работы с WEB-сервисами из 1С и PHP рассмотрены. Для передачи объектных структур данных между клиентом и сервером мы воспользовались двумя технологиями:
- (1) Пакеты XDTO
- (2) JSON объекты.
4. Альтернатива - REST Web-сервисы (http-запросы). Примеры реализации в 1С и PHP.
В предыдущем разделе мы подробно рассматривали технологию WEB-сервисов. В этом же разделе рассмотрим альтернативную технологию, т.н. REST Web-сервисы.
Возникает справедливый вопрос: - Зачем?
WEB-сервисы вполне функциональны и позволяют решать задачи любой сложности.
Что бы понять "зачем", сформулируем базовые различия между этими технологиями.
В основе технологии WEB-сервисов - 2 момента:
- (1) Используется SOAP-соединение . Другими словами, выполняется SOAP-запрос.
/////////////////////////////////////////////////////////////////////////////////////////
Определения = новый WSОпределения("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",ИмяПользователя,Пароль);
Прокси = новый WSПрокси(Определения,"www.URI.com","_РасчетыПоТарифам","_РасчетыПоТарифамSoap");
/////////////////////////////////////////////////////////////////////////////////////////
В PHP так:
/////////////////////////////////////////////////////////////////////////////////////////
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
array(
"login" => login, //логин,
"password" => pass, //пароль
"trace" => true,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"compression" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);
/////////////////////////////////////////////////////////////////////////////////////////
- (2) Для отработки soap-соединения в режиме сервера, в платформе 1С 8 предусмотрен специальный объект метаданных WEB-cервисы.
Более того, если в вашей задаче «1С» должна выступать в роли сервера, то альтернативы технологии WEB-серсивов 1С - нет.
- А когда же возможна альтернатива?
- Во-первых, когда «1С» выступает только в роли клиента;
- Во-вторых, когда сервере с которым нужно работать (например сайт или какое-то WEB-приложение), не планируется поддержка SOAP-соединения.
Очень "ходовой" вариант - http соединение .
В web-ориентированных системах (PHP, Android, iOS) работать с http-запросами проще, чем в SOAP-запросами. И для не очень сложных проектов технология http-запрос вполне подходит.
Классическим вариантом решения (методом http-запроса) является задача интеграции базы «1С» и WEB-сайта. Например, на сайт передается информацию по номенклатуре и ценам, обратно с сайта - информация о принятых заказах.
Характерно, что в типовых конфигурациях "1С" интеграция с сайтами как раз реализовывается средствами http -запросов.
И так, рассмотрим технологию http -запросов
на примере взаимодействия 1С (клиент, 1 C 8) и WEB - cайта (PHP , сервер).
1. Установка соединения и методы передачи параметров в http -запросе
Пример установки соединения с сервером со стороны 1С:
/////////////////////////////////////////////////////////////////////////////
Защищенное = Ложь;
HTTPConnect = новый HTTPСоединение("localhost/wsClient10/json/testHTTPQuery11.php",Защищенное);
////////////////////////////////////////////////////////////////////////////
Как известно, для передачи параметров от клиента на сервер, по http-протоколу, существуют два метода:
(1) Метод " get ";
Параметры (например, name и password) указываются непосредственно в URL-адресе вызова сервера.
Т.е интерактивный вызов скрипта (непосредственно из WEB-браузера) выглядел бы так:
В 1С:8 для программного вызова сервера (и передачи ему параметров методов Get) предусмотрен метод "Получить".
Пример:
Защищенное = Ложь;
HTTPConnect = новый HTTPСоединение("localhost",Защищенное);
HTTPConnect.Получить("wsClient10/json/testHTTPQuery11.php?nameVasya&password=123",ИмяВыходногоФайла);
где ИмяВыходногоФайла: Имя файла, в который помещаются данные возвращаемые с сервера.
Т.е в результате отработки запроса сервер возвращает в «1С» результат и далее (автоматически) формируется файл, в котором и содержится результат.
Соответственно, после этого в «1С» необходимо (программно) прочитать данный файл и извлечь из него полученный результат. Вот и все.
(2) Метод "post";
В этом варианте параметры не помещаются в URL-адрес, а передаются отдельно, в теле http соединения.
Понятно, что ключевым ограничение метода get является объем и содержание передаваемых данных. Т.е с помощью get можно передавать только символы, и длина URL-строки ограничена.
Методом post
можно передавать данные различного содержания, в т.ч. и произвольные файлы.
Таким образом, post
для задач интеграции более функционален и далее, будем работать с ним.
Для приема/передачи данных между «1С» и «WEB-сайтом» мы будет использовать текстовые файлы.
А "упаковывать/извлекать" данные из файлов будет с использование уже знакомой нам технологии JSON! Это практически избавит нас от необходимости "парсить" файл на стороне «1С» и на стороне PHP.
Для вызова сервера и передачи ему параметров методом "post" в 1С:8 предусмотрен метод: ОтправитьДляОбработки
И так, приведем пример, в котором на стороне 1С выполняются все действия по отработке http -запроса :
Сначала, распишем план действий (укрупнено):
А теперь, его программная реализация в «1С:8»
////////////////////
// 1. Заполним структуру передаваемых данных
postDataToPHP = новый Структура;
postDataToPHP.Вставить("param1","ivanon");
postDataToPHP.Вставить("param2","ivan");
postDataToPHP.Вставить("param3","ivanovich");
// 2. Конвертируем данные в JSON строку
JSON = Обработки.JSON.Создать();
jsPostDataToPHP = JSON.ЗаписатьJSON(postDataToPHP);
// 3. Создадим временный исходящий (передаваемый на сервер методом POST)
// файл, поместим в него JSON строку.
тФайл = новый ТекстовыйДокумент;
строкаДанные = jsPostDataToPHP;
тФайл.ДобавитьСтроку(строкаДанные);
// 4. Получим имя для временного иcходящего файла. В нем будут содержаться исходящие данные в виде JSON-строки
ИмяИсходящегоФайла = ПолучитьИмяВременногоФайла(".txt");
тФайл.Записать(ИмяИсходящегоФайла,КодировкаТекста.UTF);
// 5. Получим имя для временного входящего файла. В нем будет получена JSON-строка: ответ сервера PHP
ИмяВходящегоФайла = ПолучитьИмяВременногоФайла(".txt");
// 6. Установим HTTP соединение с сервером
Защищенное = Ложь;
HTTPConnect = новый HTTPСоединение("localhost/wsClient10/json/testHTTPQuery10.php",Защищенное);
// 7. Выполним HTTP - запрос. Передадим на сервер исходящий файл (файл содержит JSON-объект, т.е исходящие параметры)
HTTPConnect.ОтправитьДляОбработки(ИмяИсходящегоФайла,"/json/",ИмяВходящегоФайла);
// И получим ответ от сервера (входящий файл). Файл содержит //JSON-объект (т.в возвращаемые с сервера данные)
// 8. Извелечем полученные от сервера данные из входящего файл
ФайлОтвета = новый ТекстовыйДокумент;
ФайлОтвета.Прочитать(ИмяВходящегоФайла,КодировкаТекста.UTF);
json_Data = ФайлОтвета.ПолучитьСтроку(1);
mData = JSON.ПрочитатьJSON(json_Data);
// 9. Выведем полученные данные для пользователя
Сообщить(mData["v1"]);
Сообщить(mData["v2"]);
// 10. Удалим использованные (не нужные более) временные файлы.
УдалитьФайлы(ИмяИсходящегоФайла);
УдалитьФайлы(ИмяВходящегоФайла);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ну и наконец, пример на PHP по отработки запроса на стороне сервера :
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1. Получим строковые данные из входящего файла
$json_filedata = file_get_contents("php://input");
// 2. Отрежем все лишнее (добавляются 2 служебных символа), что // мешает преобразованию из JSON
$jsData = trim(ltrim($json_filedata));
$dlinaStr = strlen($jsData);
$_jsData = "";
$i=1;
while ($i<$dlinaStr) {
if ($i>2) {
$_jsData = $_jsData.substr($jsData, $i, 1);
}
$i++;
}
// 3. Преобразуем данные из JSON в объект (структуру)
$mData = json_decode($_jsData);
// 4. Сформируем другую структуру, которую заполним данными и // вернем в 1С
class returnData {
var $v1;
var $v2;
}
$sReturnData = new returnData;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. Преобразуем данные структуры в JSON строку
$json_returnData = json_encode($sReturnData);
// 6. Вернем данные в 1С (выводимые данные будут перенаправлены в файл, который и вернется в 1С)
echo $json_returnData;
?>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вот и все. Компактно и функционально!
5. Востребованные задачи (кейсы проектов)
В заключении, приведу , которые де-факто сейчас наиболее востребованы заказчиками, и которые решаются с использование WEB-сервисов и http-запросов.
Сегодня WEB сервисы используются практически повсеместно – именно они предоставляют нам информацию о рейсах самолетов и поездов, курсах валют и погоде. Неудивительно, что и 1С обладает возможностью создания собственных WEB сервисов, позволяющих выступать как в роли поставщика, так и потребителя. Данный механизм встроен в платформу «1С:Предприятие 8.3» и разработчики могут добавлять даже в типовую конфигурацию собственные объекты типа «WEB-сервисы». Их архитектура построена на наборе сервисов, позволяющих обмениваться информацией с другим программным обеспечением.
Создание веб-сервиса 1С
Одним из главных преимуществ WEB-сервисов 1С является отсутствие необходимости давать прямой доступ к данным ИБ. Правильно настроенный веб-сервис 1С позволяет другим приложениям пользоваться функциями извне. В таких случаях определять право пользования данными по заданным параметрам должна сама функция по прописанным разработчиком правилам.
Как создавать веб-сервис в 1С?
Чтобы определенная функция системы 1С стала доступна внешнему ПО, необходимо выполнить следующий алгоритм действий:
- Зайти в конфигурацию и в определенной ветке дерева добавить объект WEB-сервис;
- Описать все операции, которые сможет выполнять наш функционал. Описание функций производиться в модуле на встроенном в 1С языке;
- Добавить описание параметров функций веб-сервиса. Учтите, что типы данных описываются с учетом существующих типов механизма XDTO, появившегося в платформе версии 8.1;
- Опубликовать созданный WEB-сервис на сервере. Механизм, встроенный в платформу 1С, поддерживает следующие стандарты:
- SSL/TLS
- WS-I BP
Пример создания простого WEB-сервиса
Чтобы наиболее наглядно продемонстрировать работу механизма WEB-сервисов, создадим пример – функционал, определяющий длину введенной строки. Программное обеспечение передаст в качестве параметра запроса строку, а функция, описанная в 1С, вернет число символов. При создании нужно помнить, что публикация этого механизма даст возможность обращения к нему различного ПО. Так как не каждое ПО способно воспринимать кириллицу, будем называть объекты конфигурации, используя латинские знаки.
Открываем конфигуратор, находим в дереве ветку «WEB-сервисы» и добавляем новый сервис «wa_LengthString». Также необходимо на вкладке «Операции» добавить новую операцию. Назовем ее «CalcLengthString», в свойствах укажем тип возвращаемого значения – int или integer и создадим внутри нее параметр «InputString». Тип значения оставляем string.
Теперь необходимо прописать действие функции CalcLengthString в модуле WEB-сервиса. Для этого открываем свойства созданной функции и нажимаем кнопку в виде лупы справа, у поля ввода «Имя процедуры». 1С автоматически создаст функцию в модуле нашего WEB-сервиса и откроет его для того, чтобы мы описали действие CalcLengthString. Воспользуемся этим и напишем действие функции – определение длины вводимой строки.
Фактически на этом создание простейшего WEB-сервиса закончено. Теперь необходимо «выложить» этот сервис в общий доступ, чтобы стороннее ПО или другие системы 1С могли пользоваться данным функционалом.
Для того чтобы мы смогли опубликовать созданный веб-сервис с его функциональностью, нам необходимо иметь доступ на сайт. Перед тем как мы начнем публикацию сервиса, необходимо проверить имя файла в свойствах созданного модуля wa_LengthString. Оно должно быть понятное, простое и иметь расширение «1cws».
Теперь настало время публиковать созданный нами WEB-сервис на сервере. Эта возможность появилась в версии платформы 8.3 и многие компании уже поняли всю пользу этого функционала. Для того чтобы приступить к публикации, необходимо в конфигураторе открыть форму «Администрирование/Публикация на веб-сервере…».
В открывшемся окне нам необходима настройка Web сервисов 1С и заполнение определенных полей:
- Имя. Обозначает папку на веб-сервере, в которой будет храниться описание нашего веб-сервиса. Будьте внимательны к регистрам, так как иногда серверы различают символы большого и малого регистра;
- Веб-сервер. Необходимо выбрать сервер из установленных на компьютере;
- Каталог. Вы должны выбрать путь к папке, где хранятся данные веб-сервера по настройке подключения. Используются исключительно латинские буквы;
- Два признака типа «Булево». Первый нам пригодиться, если необходимо настроить доступ через веб-клиент к конфигурации. Для того чтобы опубликовать сервис 1С, необходимо поставить вторую отметку.
Остается лишь проверить, что у нужного WEB-сервиса установлена галка в первом столбце, и нажать на «Опубликовать».
Так как данный механизм еще достаточно новый, то вы можете столкнуться с ошибкой вида «Ошибка при выполнении файловой операции…». В этом случае вам нужно просто повторить нажатие «Опубликовать». В большинстве случаев это помогает, и вам покажется сообщение о том, что публикация веб-сервиса выполнена.
<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl
В ответ на такой запрос адреса браузер должен отобразить структуру файла XML. Если же вы видите пустую страницу, ошибку или непонятные символы (проблемы с кодировкой), то нужно еще раз проверить все действия. Также не лишним будет убедиться, что сервер настроен верно, и у вас есть к нему доступ. После успешной публикации WEB-сервис 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 файл примерно вот такого содержания:
- Использование динамической ws-ссылки.
- Создание статической 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("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедурыПечать (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-сервиса.
Работа с веб-сервисами сторонних поставщиков
Система «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-ссылки
Использование динамической ссылки отличается от использования статической ссылки только способом создания 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Прокси на основании определения веб-сервисов:
Редактирование свойств 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-сервиса.
Web-сервис в 1С 8.3 и 8.2 — объект метаданных, позволяющий интегрировать платформу 1С с другими информационными системами при помощи сервис-ориентированной архитектуры (SOA).
Рассмотрим создание и настройку на примере веб-сервиса, позволяющего производить двухсторонний обмен между базами 1С 8 по средству SOAP.
Для начала обратим внимание на вкладку Прочее:
Получите 267 видеоуроков по 1С бесплатно:
- В поле URI пространства имен описывается расположение идентификатора ресурса.
- — описание типов, с которыми сможет работать будущий веб-сервис.
- Имя файла публикации — название файла *.1CWS, который будет размещен на веб-сервере
Структура веб-сервиса 1С
Рассмотрим структуру веб-сервиса:
DataExchange — сам web-сервис. UnloadData, LoadData — операции, по сути, описание функций, которые можно вызывать по протоколу SOAP. ExchangePlanName, NodeCode и т.д. — передаваемые веб-сервису значения.
Модуль веб-сервиса
В модуле закладывается самое интересное — описание функций будущего веб-сервиса. В нашем случае мы описываем функционал, позволяющий получать и отправлять данные, используя стандартные механизмы обмена 1С. Т.к. обмен идёт между одной платформой — 1С, то они не требуют сериализации данных.