Web-сервисы. Работа с Web-сервисами Terrasoft из внешних приложений Принимаем файл web сервисом 1с


Цель этой статьи – помочь разобраться «как устроены» WEB-сервисы в «1С», понять «как механизмы работают» и «для каких задач» рационально использовать эти механизмы.

Особенностью статьи является то, что:

  • Рассматриваются (и сравниваются между собой) разные способы и приемы, которые можно применять при интеграции «1С», WEB (php) и мобильных (Ios, Android) приложений;
У разных способов есть свои плюсы/минусы, и рационьно выбрать для конкретной задачи наиболее простой из них, компактный.
  • Одновременно приведены примеры решения как на стороне «1С», так и на стороне WEB-серверов (PHP);
Примеры решения могут быть полезными как 1С: программистам, так и WEB-специалистам, тем - кто работает на стыке направлений.
  • Собрана вместе вся необходимая информация (пошаговые инструкции), чтобы осуществить «быстрый старт», начать разработку. Т.е, что бы «не убить много времени» на изучение и настройку WEB-серверов, windows, «борьбу» с системными ошибками и пр.
Cтатья адресована:
  • 1C: Программистам и WEB-специалистам, изучающим интеграцию с использованием технологии web-сервисов;
  • Проектировщикам, IT-аналитикам - понять «суть» и сделать рациональный выбор технологий при создании проектов.
В заключение вводной части стоит сказать, что если у вас уже был опыт работы с технологиями COM/Ole, то это хорошо поможет вам и в понимании технологии WEB-сервисов.

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) он будет.
Далее, работу с XDTO рассмотрим на примере получения с сервере некой «таблицы тарифов»:

Создадим операцию GetTzTariffs_0, которая будет возвращать данные типа tzTariffs.

На рисунке показано, что tzTariffs включает в себя неограниченное количество объектов el. Фактически, tzTariffs - это таблица объектов типа el.

- Как это увидеть?

  • Если параметр "максимальное" указан как "-1", то значит количество этих объектов не ограничено (таблица с неограниченным количеством строк);
  • Если же таблица нам не нужна, а нужна просто структура (одна строка), то максимальное и минимальное значение нужно указать равными "1".
  • В свою очередь, объект el представляет из себя структуру, в которой есть реквизит объектного типа (eTariff) и реквизиты примитивного типа (cPrice, comment).

Продвигаясь по иерархии вниз, можно увидеть, что тип 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-запрос.
В "1С" 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-соединения.
- А какая альтернатива 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 предусмотрен метод: ОтправитьДляОбработки

И так, приведем пример, в котором на стороне выполняются все действия по отработке 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С стала доступна внешнему ПО, необходимо выполнить следующий алгоритм действий:

  1. Зайти в конфигурацию и в определенной ветке дерева добавить объект WEB-сервис;
  2. Описать все операции, которые сможет выполнять наш функционал. Описание функций производиться в модуле на встроенном в 1С языке;
  3. Добавить описание параметров функций веб-сервиса. Учтите, что типы данных описываются с учетом существующих типов механизма XDTO, появившегося в платформе версии 8.1;
  4. Опубликовать созданный 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 файл примерно вот такого содержания:

  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("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры

Печать (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-сервиса.

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С, то они не требуют сериализации данных.

Проверка работы http сервиса 1С на веб-сервере

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то