Мы рассмотрели общие понятия использования механизма « Web -сервисов». Освежим некоторые знания.

Web-сервисы применяются для обмена данными между сервером и клиентом; формат XML используется для «упаковывания» данных в целях взаимопонимания между обоими участниками общения.

РАЗДЕЛ I

ПРИМЕР РЕАЛИЗАЦИИ WEB -СЕРВИСА В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

ЗАДАЧА: Необходимо создать web-сервис, обращаясь к которому клиенты могут определить всю необходимую информацию по своим заявкам.

Задача является демонстрационной и служит только примером для понимания и обучения механизму web -сервисов.

РЕШЕНИЕ:

Шаг 1. Создадим новую информационную базу без конфигурации для разработки новой конфигурации.

Шаг 2. Добавим в конфигурацию несколько новых объектов

Справочник «Клиенты»;

Документ «Заявка»;

Перечисление «СтатусыЗаявок».

Шаг 3. Создадим новый XDTO-пакет.

Почему и для чего мы создаем XDTO-пакет? Подробнее об использовании механизма XDTO можно прочитать в «Глава 16. Руководство разработчика» и .

Коротко отметим лишь только то, что механизм XDTO является универсальным способом представления данных для взаимодействия с различными внешними источниками данных и программными системами.

В нашем случае пакет XDTO создается для описания возвращаемого значения web-сервиса.

Раскроем ветку «Общие» → «XDTO-пакеты» → Добавить…

Укажем имя XDTO-пакета «DocumentsData » и его пространство имен http://localhost/request или http://192.168.1.76/request (для облегчения понимания и процесса обучения, мы указываем локальный IP-адрес компьютера, где установлен web-сервер (поддерживаемые web-сервера: IIS или Apache)). Каждый Web-сервис может быть однозначно идентифицирован по своему имени и URI пространству имен, которому он принадлежит.

Наш пакет содержит два типа объектов XDTO:

1) Сustomer - для передачи данных элемента справочника «Клиенты».

- Name ;

2) Document - для передачи данных документа «Заявки»

Этот тип объекта XDTO будет содержать следующие свойства:

- Сustomer - тип Сustomer из пространства имен http://192.168.1.76/request ; представляет собой ссылку на объект XDTO, который мы определили выше;

- Status - тип string из пространства имен http://www.w3.org/2001/XMLSchema ;

- Numder - тип string из пространства имен http://www.w3.org/2001/XMLSchema .

Шаг 4. Добавим в конфигурацию новый Web-сервис

Раскроем ветку «Общие» → «Web-сервисы» → Добавить…

Для Web-сервиса укажем следующими значения свойств:

Имя - DocumentsData

URI Пространства имен - http://192.168.1.76/request

Пакеты XDTO - DocumentsData или http://192.168.1.76/request

Имя файла публикации - request.1cws

Шаг 5. У созданного Web-сервиса определим операцию «GetData »

Значения свойств операции:

Тип возвращаемого значения - Document (http://192.168.1.76/request)

Возможно пустое значение - Истина

Имя процедуры - GetData .

Шаг 6. У операции GetData определим параметр Сustomer со следующими значениями свойств:

Тип значения - тип string из пространства имен http://www.w3.org/2001/XMLSchema;

Направление передачи - входной .

Шаг 7. Откроем модуль созданного Web-сервиса и поместить в него функцию Получить(), которая будет выполняться при вызове данного Web-сервиса.

Функция GetData(Сustomer) // Получить типы объектов XDTO КлиентТип = ФабрикаXDTO.Тип("http://192.168.1.76/request", "Сustomer"); ЗаявкаТип = ФабрикаXDTO.Тип("http://192.168.1.76/request", "Document"); // Получаем клиента КлиентСсылка = Справочники.Клиенты.НайтиПоНаименованию(Сustomer); Если Не ЗначениеЗаполнено(КлиентСсылка) Тогда Возврат Неопределено; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Заявка.Ссылка, | ПРЕДСТАВЛЕНИЕ(Заявка.Статус) КАК Статус, | Заявка.Номер |ИЗ | Документ.Заявка КАК Заявка |ГДЕ | Заявка.Клиент = &Клиент"; Запрос.УстановитьПараметр("Клиент", КлиентСсылка); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат Неопределено; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); Документ = Выборка.Ссылка.ПолучитьОбъект(); // Создать объект XDTO заявки Заявка = ФабрикаXDTO.Создать(ЗаявкаТип); Заявка.Numder = Выборка.Номер; Клиент = ФабрикаXDTO.Создать(КлиентТип); Клиент.Name = КлиентСсылка.Наименование; Заявка.Сustomer = Клиент; Заявка.Status = Выборка.Статус; // Вернуть заявку Возврат Заявка; КонецФункции

Шаг 8. Опубликуем созданный Web-сервис на веб-сервере.

Пункт меню Конфигуратор: «Администрирование» → «Публикация на Web-сервере».

На вкладке «Web-сервисы» устанавливаем признак «Публиковать Web-сервисы» и напротив нашего нового Web-сервиса также ставим «галочку».

РАЗДЕЛ II

ПРИМЕР ОБРАЩЕНИЯ К WEB -СЕРВИСУ СИСТЕМЫ «1С:ПРЕДПРИЯТИЕ» ИЗ СТОРОННЕГО ПРИЛОЖЕНИЯ

Основное назначение механизма Web-сервисов в системе «1С:Предприятие» - это передача необходимых данных сторонним приложениям.

Рассмотрим пример разработки приложения на Delphi обращения к нашему web-сервису из первого раздела данной статьи.

Шаг 1. Создадим новый проект и на форме разместим несколько элементов управления

Текстовое поле - используется для вывода полученной от web-сервиса информации;

Две кнопки - очистка текстового поля и обращение к web-сервису;

Поле ввода - передаваемый в web-сервис параметр.

Шаг 2. Выполняем импорт WSDL-файла

В результате мы получаем новый модуль request (такое наименование мы определили непосредственно в 1С). В данном модуле имеется все необходимая информация по web-сервису.

Шаг 3. Напишем обработчик вызова web-сервиса

Переменная DocumentDataPortType уже определена в модуле request

Шаг 4. Запустить приложение и выполнить проверку.

РАЗДЕЛ III

ПРИМЕР ОБРАЩЕНИЯ К WEB -СЕРВИСУ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

Шаг 1. Создадим новую внешнюю обработку с именем «WEB_Service»

Шаг 2. Для обработки определим новую форму

Шаг 3. У формы укажем несколько реквизитов

Клиент - тип «Строка»

КлиентВозврат - тип «Строка»

НомерВозврат - тип «Строка»

СтатусВозврат - тип «Строка».

Выведем реквизиты на форму.

Шаг 4. Добавим команду формы «ПолучитьДанные »

Укажем обработчик команды

&НаКлиенте Процедура ПолучитьДанные(Команда) ПолучитьДанныеНаСервере(Клиент); КонецПроцедуры Процедура ПолучитьДанныеНаСервере(Клиент) // Создать WS-прокси на основании ссылки и выполнить операцию Получить() Определение = Новый WSОпределения("http://192.168.1.76/WEB_Service/ws/request.1cws?wsdl"); Прокси = Новый WSПрокси(Определение, "http://192.168.1.76/request", "DocumentsData", "DocumentsDataSoap"); ДанныеЗаявки = Прокси.GetData(Клиент); Если ДанныеЗаявки = Неопределено Тогда КлиентВозврат = "Неопределено"; СтатусВозврат = "Неопределено"; НомерВозврат = "Неопределено"; Возврат; КонецЕсли; КлиентВозврат = ДанныеЗаявки.Сustomer.Name; СтатусВозврат = ДанныеЗаявки.Status; НомерВозврат = ДанныеЗаявки.Numder; КонецПроцедуры

Система «1С:Предприятие» может использовать веб-сервисы, предоставляемые другими поставщиками, двумя способами:

С помощью статических ссылок, создаваемых в дереве конфигурации;

«плюс»: большая скорость работы;

«минус»: повторный импорт WSDL-описания средствами конфигуратора и сохранение измененной конфигурации.

С помощью динамических ссылок, создаваемых средствами встроенного языка

(соответственно «минусы» статических для динамических - «плюсы»)

РАЗДЕЛ IV

ОТЛАДКА WEB-СЕРВИСОВ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

Для локального web-сервиса необходимо:

Шаг 1. Положить на клиент, где запускается система 1С файлик webservicecfg.xml со следующим содержимом

Шаг 2. В файл default . vrd публикации конфигурации добавить строку

Шаг 3. В конфигураторе выбрать пункт меню

«Отладка» → «Подключение» → «Автоматическое подключение» → «Web-сервисы на сервере»

Шаг 4. Нажать на кнопку «OK»

Для серверного варианта надо еще сервер 1с запускать в режим отладки с ключом /debug

Обмен данными обычно организовывается с помощью выгрузки файла из одной программы и загрузки в другую. Некоторые программисты предоставляют сторонним программам доступ в SQL базу 1С (что вроде как сильно не рекомендуется).

Термин «обмен данными» не всегда подходит к задаче, иногда более корректно сказать – предоставление данных. Например, внешней программе требуется идентифицировать – существует ли такой клиент в 1С и его баланс.

Предоставление доступа к данным 1С – некорректно по причинам безопасности данных. Необходим скорее механизм проверки по имени и паролю с дальнейшим возвратом баланса.

Этот подход называют – сервисным, когда программа предоставляет не данные, а сервис, который позволяет идентифицировать клиента и узнать его баланс.

Как это работает?

Функции извне вызываются (запускаются) запросом по протоколу SOAP .

Для передачи параметров и результатов используется . Для работы с веб-сервисами Вы должны иметь базовое понимание про .

Web сервисы 1С

Web сервис 1С это способ, с помощью которого можно разрешить запускать некоторые функции 1С снаружи базы 1С, в том числе из других программ или других баз 1С.

Это лучше, чем предоставление прямого доступа к данным 1С, так как при вызове метода (функции) web сервиса 1С, доступ к данным внешняя программа не имеет. Функция на языке 1С самостоятельно определяет право внешней программы получить конкретную толику данных по переданным параметрам (например, имени и паролю).

Во многих случаях, можно не создавать свой пакет XDTO, а использовать по умолчанию – выбрав из списка пакет www.sample-package.org

Методы web сервиса 1С

После этого нужно добавить список функций (методов веб сервиса 1С) – которые будут предоставляться наружу. Называть их лучше англоязычно. Функция может иметь параметры.

Базовые типы к использованию:

  • string – строка
  • int или integer – целое число
  • real – дробное число
  • date – дата.

Для каждой добавленной функции веб сервиса 1С, в свойствах нужно создать , так же, как мы это делали в , и так далее.

Именно эта функция 1С будет выполняться при вызове метода веб сервиса 1С. Не забывайте, что выполняться она будет на сервере 1С. Файловый режим работы 1С с веб-сервисами не рекомендуется.

Функция обычно возвращает какие-либо данные. Обычно указывают тип string и возвращают строку XML.

Строку XML можно сформировать с помощью объектов языка 1С для , а можно просто составить текстовую строку, в которой хранится текст XML.

Публикация web сервиса 1С

Как мы говорили раньше, другие программы должны «знать», что веб сервис 1С существует, имеет такой вот список методов и так далее.

Описание должно лежать на веб сайте. Для этого нужно:

  • Иметь веб сайт
  • В свойствах web сервиса 1С указать имя файла с расширением 1cws, который является ссылкой на WSDL описание
  • Выложить этот файл на веб сайт в конфигураторе с помощью пункта меню Администрирование/Публикация на веб-сервере.

Браузер должен отобразить некий файл XML (пример файла WSDL здесь http://ru.wikipedia.org/wiki/WSDL), а не ошибку, не пустую страницу и не невнятный текст на любой кодировке.

После успешной публикации web сервис 1С можно использовать. Для этого в другой программе нужно использовать данный интернет адрес для ссылок на веб сервис 1С.

Например, Visual Studio позволяет для любого языка (C++, C#, Visual Basic) – включить в проект web сервис 1С по его WSDL описанию и сгенерировать класс для использования веб-сервиса 1С.

Заголовок топика – это действительно вопрос, т.к. я сам не знаю, что это и впервые попробую поработать с этим в рамках настоящей статьи. Единственное, что могу гарантировать, что код, представленный ниже, будет работать, однако мои фразы будут лишь предположениями и догадками о том, как я сам все это понимаю. Итак, поехали…

Введение

Начать надо с того, для чего создавалась концепция веб-сервисов. К моменту появления этого понятия в мире уже существовали технологии, позволяющие приложениям взаимодействовать на расстоянии, где одна программа могла вызвать какой-нибудь метод в другой программе, которая при этом могла быть запущена на компьютере, расположенном в другом городе или даже стране. Все этого сокращенно называется RPC (Remote Procedure Calling – удаленный вызов процедур). В качестве примеров можно привести технологии CORBA, а для Java – RMI (Remote Method Invoking – удаленный вызов методов). И все вроде в них хорошо, особенно в CORBA, т.к. с ней можно работать на любом языке программирования, но чего-то все же не хватало. Полагаю, что минусом CORBA является то, что она работает через какие-то свои сетевые протоколы вместо простого HTTP, который пролезет через любой firewall. Идея веб-сервиса заключалась в создании такого RPC, который будет засовываться в HTTP пакеты. Так началась разработка стандарта. Какие у этого стандарта базовые понятия:
  1. SOAP . Прежде чем вызвать удаленную процедуру, нужно этот вызов описать в XML файле формата SOAP. SOAP – это просто одна из многочисленных XML разметок, которая используется в веб-сервисах. Все, что мы хотим куда-то отправить через HTTP, сначала превращается в XML описание SOAP, потом засовывается в HTTP пакет и посылается на другой компьютер в сети по TCP/IP.
  2. WSDL . Есть веб-сервис, т.е. программа, методы которой можно удаленно вызывать. Но стандарт требует, чтобы к этой программе прилагалось описание, в котором сказано, что «да, вы не ошиблись – это действительно веб-сервис и можно у него вызвать такие-то такие-то методы». Такое описание представляется еще одним файлом XML, который имеет другой формат, а именно WSDL. Т.е. WSDL – это просто XML файл описания веб-сервиса и больше ничего.
Почему так кратко спросите вы? А по подробней нельзя? Наверное можно, но для этого придется обратиться к таким книгам как Машнин Т. «Web-сервисы Java». Там на протяжении первых 200 страниц идет подробнейшее описание каждого тега стандартов SOAP и WSDL. Стоит ли это делать? На мой взгляд нет, т.к. все это на Java создается автоматически, а вам нужно лишь написать содержимое методов, которые предполагается удалено вызывать. Так вот, в Java появился такой API, как JAX-RPC. Если кто не знает, когда говорят, что в Java есть такой-то API, это означает, что есть пакет с набором классов, которые инкапсулируют рассматриваемую технологию. JAX-RPC долго развивался от версии к версии и в конечном итоге превратился в JAX-WS. WS, очевидно, означает WebService и можно подумать, что это простое переименование RPC в популярное нынче словечко. Это не так, т.к. теперь веб-сервисы отошли от первоначальной задумки и позволяют не просто вызывать удаленные методы, но и просто посылать сообщения-документы в формате SOAP. Зачем это нужно я пока не знаю, вряд ли ответ здесь будет «на всякий случай, вдруг понадобится». Сам бы хотел узнать от более опытных товарищей. Ну и последнее, далее появился еще JAX-RS для так называемых RESTful веб-сервисов, но это тема отдельной статьи. На этом введение можно заканчивать, т.к. далее мы будем учиться работать с JAX-WS.

Общий подход

В веб-сервисах всегда есть клиент и сервер. Сервер – это и есть наш веб-сервис и иногда его называют endpoint (типа как, конечная точка, куда доходят SOAP сообщения от клиента). Нам нужно сделать следующее:
  1. Описать интерфейс нашего веб-сервиса
  2. Реализовать этот интерфейс
  3. Запустить наш веб-сервис
  4. Написать клиента и удаленно вызвать нужный метод веб-сервиса
Запуск веб-сервиса можно производить разными способами: либо описать класс с методом main и запустить веб-сервис непосредственно, как сервер, либо задеплоить его на сервер типа Tomcat или любой другой. Во втором случае мы сами не запускаем новый сервер и не открываем еще один порт на компьютере, а просто говорим контейнеру сервлетов Tomcat, что «мы написали тут классы веб-сервиса, опубликуй их, пожалуйста, чтобы все, кто к тебе обратиться, могли нашим веб-сервисом воспользоваться». В независимости от способа запуска веб-сервиса, клиент у нас будет один и тот же.

Сервер

Запустим IDEA и создадим новый проект Create New Project . Укажем имя HelloWebService и нажмем кнопку Next , далее кнопку Finish . В папке src создадим пакет ru.javarush.ws . В этом пакете создадим интерфейс HelloWebService: package ru. javarush. ws; // это аннотации, т.е. способ отметить наши классы и методы, // как связанные с веб-сервисной технологией import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. soap. SOAPBinding; // говорим, что наш интерфейс будет работать как веб-сервис @WebService // говорим, что веб-сервис будет использоваться для вызова методов @SOAPBinding (style = SOAPBinding. Style. RPC) public interface HelloWebService { // говорим, что этот метод можно вызывать удаленно @WebMethod public String getHelloString (String name) ; } В этом коде классы WebService и WebMethod являются так называемыми аннотациям и ничего не делают, кроме как помечают наш интерфейс и его метод, как веб-сервис. Это же относится и к классу SOAPBinding . Разница лишь в том, что SOAPBinding – это аннотация с параметрами. В данном случае используется параметр style со значением, говорящим, что веб-сервис будет работать не через сообщения-документы, а как классический RPC, т.е. для вызова метода. Давайте реализуем логику нашего интерфейса и создадим в нашем пакете класс HelloWebServiceImpl . Кстати, замечу, что окончание класса на Impl – это соглашение в Java, по которому так обозначают реализацию интерфейсов (Impl – от слова implementation, т.е. реализация). Это не требование и вы вольны назвать класс как хотите, но правила хорошего тона того требуют: package ru. javarush. ws; // таже аннотация, что и при описании интерфейса, import javax. jws. WebService; // но здесь используется с параметром endpointInterface, // указывающим полное имя класса интерфейса нашего веб-сервиса @WebService (endpointInterface = "ru.javarush.ws.HelloWebService" ) public class HelloWebServiceImpl implements HelloWebService { @Override public String getHelloString (String name) { // просто возвращаем приветствие return "Hello, " + name + "!" ; } } Запустим наш веб-сервис как самостоятельный сервер, т.е. без участия всяких Tomcat и серверов приложений (это тема отдельного разговора). Для этого в структуре проекта в папке src создадим пакет ru.javarush.endpoint , а в нем создадим класс HelloWebServicePublisher с методом main: package ru. javarush. endpoint; // класс, для запуска веб-сервера с веб-сервисами import javax. xml. ws. Endpoint; // класс нашего веб-сервиса import ru. javarush. ws. HelloWebServiceImpl; public class HelloWebServicePublisher { public static void main (String. . . args) { // запускаем веб-сервер на порту 1986 // и по адресу, указанному в первом аргументе, // запускаем веб-сервис, передаваемый во втором аргументе Endpoint. publish ("http://localhost:1986/wss/hello" , new HelloWebServiceImpl () ) ; } } Теперь запустим этот класс, нажав Shift+F10 . В консоли ничего не появится, но сервер запущен. В этом можно убедиться набрав в браузере строку http://localhost:1986/wss/hello?wsdl . Открывшаяся страница, с одной стороны, доказывает, что у нас на компьютере (localhost) запустился веб-сервер (http://) на порту 1986, а, с другой стороны, показывает WSDL описание нашего веб-сервиса. Если вы остановите приложение, то описание станет недоступно, как и сам веб-сервис, поэтому делать этого не будем, а перейдем к написанию клиента.

Клиент

В папке проекта src создадим пакет ru.javarush.client , а в нем класс HelloWebServiceClient с методом main: package ru. javarush. client; // нужно, чтобы получить wsdl описание и через него // дотянуться до самого веб-сервиса import java. net. URL; // такой эксепшн возникнет при работе с объектом URL import java. net. MalformedURLException; // классы, чтобы пропарсить xml-ку c wsdl описанием // и дотянуться до тега service в нем import javax. xml. namespace. QName; import javax. xml. ws. Service; // интерфейс нашего веб-сервиса (нам больше и нужно) import ru. javarush. ws. HelloWebService; public class HelloWebServiceClient { public static void main (String args) throws MalformedURLException { // создаем ссылку на wsdl описание URL url = new URL ("http://localhost:1986/wss/hello?wsdl" ) ; // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions // 1-ый аргумент смотрим в атрибуте targetNamespace // 2-ой аргумент смотрим в атрибуте name QName qname = new QName ("http://ws.сайт/" , "HelloWebServiceImplService" ) ; // Теперь мы можем дотянуться до тега service в wsdl описании, Service service = Service. create (url, qname) ; // а далее и до вложенного в него тега port, чтобы // получить ссылку на удаленный от нас объект веб-сервиса HelloWebService hello = service. getPort (HelloWebService. class ) ; // Ура! Теперь можно вызывать удаленный метод System. out. println (hello. getHelloString ("JavaRush" ) ) ; } } Максимум комментариев по коду я дал в листинге. Добавить мне нечего, поэтому запускаем (Shift+F10). Мы должны в консоли увидеть текст: Hello, JavaRush! Если не увидели, то видимо забыли запустить веб-сервис.

Заключение

В данном топике был представлен краткий экскурс в веб-сервисы. Еще раз скажу, что многое из того, что я написал – это мои догадки по поводу того, как это работает, и поэтому мне не стоит сильно доверять. Буду признателен, если знающие люди меня поправят, ведь тогда я чему-нибудь научусь. UPD.
Ключевые слова: web-сервис, веб-сервис, SOAP, WSDL, ws-ссылка

Дисклеймер и условия использования

Все случайно упомянутые в статье торговые марки принадлежат своим владельцам.
Статья опубликована под лицензией Creative Commons Attribution-Share Alike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/

Ещё один дисклеймер (спустя многие времена)

Платформа "1С:Предприятие 8" постоянно развивается. В связи с чем, код, представленный в этой статье, в последних версиях платформы будет выдавать ошибку. Происходит это, в частности, из-за того, что изменился порядок вызова методов прокси-объекта web-сервиса: например, сложные объекты необходимо явно преобразовывать в ОбъектXDTO соответствующего типа, используя Фабрику соответствующего сервиса. Об этом вы можете почитать на нашем форуме или в книге "Технологии интеграции 1С:Предприятия" http://v8.1c.ru/metod/books/book.jsp?id=288

Вступление

Когда появляется новая версия какого-то программного продукта, то естественно, в первую очередь хочется понять, чего же такого в нем появилось нового. В случае с "1С:Предприятие 8.1" такой новой "фичей" для меня стали web-сервисы. Про web-сервисы написано и сказано много, поскольку существует эта технология по компьютерным меркам достаточно давно. По-этому я повторяться не буду, за справками отправляю всех к Яндексу. Скажу лишь, что с выходом новой редакции платформы "1С:Предприятие 8.1" у 1Сников появилась возможность создавать и использовать технологию web-сервисов, находясь, так сказать, в родной среде. В этой статье я хочу показать, как использовать внешние web-сервисы в своих разработках.

Для тех, кто совсем "не в теме": о web-сервисах "на пальцах"

ОК, специально для ТЕБЯ я чуть-чуть попытаюсь рассказать, что такое web-сервис, и почему именно это показалось мне таким "вкусным" новшеством платформы. Возможно ты знаешь про технологию COM или что-то слышал про OLE? С этой технологией рано или поздно сталкивается любой одинесник (особенно если надо быстро перекинуть какой-нибудь справочник "Сотрудники", а отдел кадров, предвидя необходимость снова вбивать всю 1500 сотрудников, готов повесить тебя на первом встречном подходящем гвозде).
Да, так вот, в основе технологии COM лежит идея о возможности вызова программного кода (и обращения к данным) одного приложения из другого приложения. Причем, возможности делать это не на уровне отдельных процедур и функций, но получая в распоряжение объекты другого приложения. При использовании OLE, мы в своем приложении создаем объект, являющийся "представителем " или, если хотите, "оберткой " некоторого объекта того приложения, с которым мы хотим наладить взаимодействие (т.н. "OLE-объект" или "COM-объект"). Через этот объект-"обертку" нам становятся доступны свойства и методы объекта другого приложения, причем только те из них, которыми разработчик того приложения разрешил нам пользоваться, опубликовав их в описании интерфейса . (Ну вот, не хотел лезть в дебри, но по-другому не получается...)
Теперь представим себе, что то-самое приложение находится на другом компьютере, и даже не в локальной сети (с такими случаями неплохо справляются DCOM, CORBA и прочие заумные аббревиатуры), а где-то далеко-далеко в Интернете. Вот тут-то и выходят на сцену web-сервисы (тоже в комплекте с заумными аббревиатурами: SOAP, WSDL и др.), которые позволяют проделывать аналогичный "фокус" и в этом случае: т.е. получать данные и манипулировать объектами приложения, выполняющегося на компьютере на другом краю Интернета.
Под "внешним " web-сервисом я буду понимать web-сервис, предоставляемый некоторым поставщиком сервиса (т.е. не нашим приложением.) Соответственно, под "внутренним" - web-сервис, который будем предоставлять мы из , или, точнее, на основе нашего приложения. При использовании внешних web-сервисов надо понимать, что хотя объект-"обертка" создается в нашем "локальном" приложении, "исполняющий код" этого объекта находится, может быть, на другой стороне Земного Шара. При этом обмен между нами и ними происходит на вездесущем ныне XML, с его известными "плюсами" (универсальностью и структурированностью) и "минусами" (раздутостью), а в качестве "линии передачи" используется старый добрый http.
Да, и не забудь про интернет-трафик! Причем, в случае с внешними web-сервисами большая часть его придется на входящую составляющую.
Все, остальное есть в Яндексе. Поехали дальше...

Откуда ноги, т.е. крылья растут

Порывшись в том же Яндексе, я нашел замечательный web-сервис от компании "Аэрофлот", который позволяет в режиме реального времени получать информацию о прилете и вылете самолетов, и решил сделать эдакое "Табло аэропорта" в "1С:Предприятие". Сам сервис живет тут: http://webservices.aeroflot.ru/desc_flightinfo.asp

Он сказал: "Поехали!"

Для начала я создал пустую конфигурацию "1С:Предприятия 8.1" (на момент написания статьи в моем распоряжении была версия платформы 8.1.5.123). Затем я добавил в свою конфигурацию новый объект типа WS-ссылка. На предложенный запрос ввести URL импортируемого WSDL, я ввел ссылку на WSDL-файл, которая значится на странице сервиса: http://webservices.aeroflot.aero/flightstatus.wsdl (WSDL-файл является описанием web-сервиса. За подробностями - в Яндекс), и гордо назвал созданный объект "Аэрофлот". Щелкнув два раза на этом объекте, я получил дерево со структурой web-сервиса.

Это дерево представляет собой "портрет" web-сервиса, как его видит 1Ска. Самое интересное находится в ветке "Web-сервисы": это имена и порты web-сервисов (на самом деле WSDL-файл может описывать не один, а несколько web-сервисов, тогда для каждого web-сервиса будет создана своя ветка), и перечислены методы web-сервиса. Это и есть те самые "ниточки", подергав за которые можно приоткрыть себе доступ к тем данным, которые предоставляет web-сервис. В ветке "Модель данных" содержится описание библиотек типов данных, которые используются web-сервисом.
Краткую справку об использовании web-сервиса обычно можно получить там же, где и ссылку на WSDL-файл. В случае с "Аэрофлотом", это страничка http://webservices.aeroflot.aero/flightstatus.asmx

"То взлет, то посадка..."

Для работы с web-сервисом я добавил в конфигурацию обработку "ТаблоВылетов", а в ней - одну форму, которую назначил основной. На форму я положил поле выбора "ВыборАэропорта", поле ввода "ДатаРейса", панель "ПанельТабло" с двумя страницами "Прилет" и "Вылет", при этом я снял флаг "Распределять по страницам" в свойствах панели, и табличное поле "ТаблицаТабло".
Взаимодействие с web-сервисом происходит по принципу "запрос-ответ", при этом для web-сервиса создается специальный объект-посредник. Поэтому я добавил реквизит формы "СервисАэрофлот" произвольного типа.
Если внимательно почитать описание сервиса, то можно увидеть, что web-сервис предоставляет данные о прилетах и вылетах через вызовы методов Arrival и Departure соответственно. При этом оба метода принимают в качестве параметров код аэропорта и нужную дату. Кроме того, web-сервис предоставляет возможность получить список аэропортов, по которым имеются данные в системе. Достаточно очевидным является следующий сценарий взаимодействия с web-сервисом:
1. Получить список аэропортов;
2. Выбрать нужный аэропорт и дату;
3. Получить данные о прилетах или вылетах;
Но прежде чем обращаться к web-сервису, необходимо инициализировать объект-посредник (типа WSПрокси), что я и сделал в обработчике открытия формы:
СервисАэрофлот=WSСсылки.Аэрофлот.СоздатьWSПрокси("http://www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Первым параметром передается URI пространства имен web-сервиса. Узнать его можно открыв свойства web-сервиса в дереве WS-ссылки. Вторым и третьим параметром параметрами передаются соответственно имя и порт web-сервиса.
(не надо путать понятия "имя", "порт", "прокси" и т.п. в применении к web-сервисам с более привычными понятиями протокола TCP/IP. Соответствие между ними если и есть, то скорее смысловое. В общем случае нужно понимать, что, например порт web-сервиса и TCP-порт - это абсолютно разные вещи).
Таким образом я проинициализировал объект СервисАэрофлот типа WSПрокси, который по-сути своей является "оберткой" web-сервиса. Через него я смогу обращаться к методам web-сервиса как к "родным" методам платформы.
Первым делом я получил список аэропортов и заполнил список поля выбора "ВыборАэропорта":

СписокВыбора=ЭлементыФормы.ВыборАэропорта.СписокВыбора; СписокВыбора.Очистить(); СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list "); ВсегоАэропортов=СписокАэропортов.Количество(); Для ии=0 по ВсегоАэропортов-1 Цикл Аэропорт=СписокАэропортов.Получить(ии); СписокВыбора.Добавить(Аэропорт.code, ""+Аэропорт.city+" : "+Аэропорт.name); КонецЦикла;
Тут нужен небольшой комментарий по конструкции СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list");
Дело в том, что значения, возвращаемые методами web-сервисов, представляются в платформе объектами типа ОбъектXDTO. Поскольку тематика технологии XDTO выходит за рамки этой статьи, скажу лишь, что для превращения этого объекта в список (чем он и является), я вызвал его метод ПолучитьСписок(). Остальное в коде достаточно очевидно, включая названия полей структуры Аэропорт, которые я нашел на странице описания web-сервиса.
Теперь можно запустить конфигурацию и убедиться, что список поля выбора заполняется названиями аэропортов:

"День отлета, день прилета..."

Теперь у меня практически все готово для того, чтобы заставить мое табло функционировать. Осталось только его "выкрасить и выбросить" :) Чем и займусь:

Процедура ЗаполнитьТабло(Прилет=Истина) ТаблицаТабло.Колонки.Очистить(); ТаблицаТабло.Колонки.Добавить("КодРейса ", "Код рейса "); ТаблицаТабло.Колонки.Добавить("КодАвиакомпании ", "Авиакомпания "); ТаблицаТабло.Колонки.Добавить("НомерРейса ", "Номер "); ТаблицаТабло.Колонки.Добавить("АэропортТранзит ", "Аэропорт-транзит "); ТаблицаТабло.Колонки.Добавить("Аэропорт ", "Аэропорт "+?(Прилет,"вылета ","прилета ")); ТаблицаТабло.Колонки.Добавить("ВремяРасписание ", "По расписанию "); ТаблицаТабло.Колонки.Добавить("ВремяПланируемое ", "Планируемое "); ТаблицаТабло.Колонки.Добавить("ВремяФактическое ", "Фактическое "); ТаблицаТабло.Колонки.Добавить("ВремяРасчетное ", "Расчетное "); ТаблицаТабло.Колонки.Добавить("ВремяПосадки ", ?(Прилет,"Посадка ","Взлет ")); ТаблицаТабло.Колонки.Добавить("ОбъедРейс ", "Объед.рейс "); ТаблицаТабло.Колонки.Добавить("Статус ", "Статус "); Если Не Прилет Тогда ТаблицаТабло.Колонки.Добавить("Регистрация ", "Регистрация "); ТаблицаТабло.Колонки.Добавить("Посадка ", "Посадка "); КонецЕсли; ЭлементыФормы.ТаблицаТабло.СоздатьКолонки(); ЭлементыФормы.ТаблицаТабло.Колонки.КодРейса.Видимость=Ложь; Если Не Прилет Тогда ЭлементыФормы.ТаблицаТабло.Колонки.ВремяРасчетное.Видимость=Ложь; КонецЕсли; Если Прилет Тогда Данные=СервисАэрофлот.Arrival(ВыборАэропорта, ДатаРейса).ПолучитьСписок("list "); Иначе Данные=СервисАэрофлот.Departure(ВыборАэропорта, ДатаРейса).ПолучитьСписок("list "); КонецЕсли; ВсегоЗаписей=Данные.Количество(); Для ии=0 по ВсегоЗаписей-1 Цикл Запись=ДАнные.Получить(ии); НоваяСтрока=ТаблицаТабло.Добавить(); НоваяСтрока.КодАвиакомпании=Запись.company; НоваяСтрока.НомерРейса=Запись.flight_no; НоваяСтрока.АэропортТранзит=Запись.airport_inter; НоваяСтрока.Аэропорт=Запись.airport; НоваяСтрока.ВремяРасписание=Запись.sched; НоваяСтрока.ВремяПланируемое=Запись.plan; НоваяСтрока.ВремяФактическое=Запись.fact; НоваяСтрока.ВремяРасчетное=Запись.calc; НоваяСтрока.ВремяПосадки=Запись.real; НоваяСтрока.ОбъедРейс=Запись.union_flight_no; НоваяСтрока.Статус=Запись.status; Если Не Прилет Тогда НоваяСтрока.Регистрация=Запись.is_check; НоваяСтрока.Посадка=Запись.is_board; КонецЕсли; КонецЦикла; КонецПроцедуры

Для того, чтобы проверить как это все работает, я добавил на командную панель формы кнопку "Обновить" с соответствующей картинкой, а в ее обработчике написал такое:

Процедура КоманднаяПанель1 Обновить(Кнопка) ЗаполнитьТабло(ЭлементыФормы.ПанельТабло.ТекущаяСтраница=ЭлементыФормы.ПанельТабло.Страницы.Прилет); КонецПроцедуры
Сохраняю, запускаю, выбираю, нажимаю, получаю:

Послесловие

Удивительное дело, но уже после того, как статья была написана и опубликована, выяснилось, что уважаемый ZAV уже опубликовал похожий пример на IT-Land"е: http://itland.ru/biblio/detail.php?ID=1060
Дабы избежать возможных обвинений в плагиате, настоятельно рекомендую ознакомиться и с этой статьей тоже и сравнить подходы авторов.


Цель этой статьи – помочь разобраться «как устроены» 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-запросов.




Close