Статьи
Нестандартные решения: Статья №01. Платформа 1С и веб-сервис на PHP
Данная статья покажет как создать веб-сервис на основе PHP и построить взаимодействие с любой конфигурацией 1С на базе платформы 8.3 (через внешнюю обработку).
Рабочий компьютер:
- ОС: Ubuntu Desktop 14.04.1 LTS
- IDE: Eclipse Luna
- Система контроля версий: Subversion
- Веб-сервер: Apache2 + PHP
- 1C: Платформа 8.3.5.1186 + Пустая конфигурация (Возможно любая не пустая)
Как настроить рабочую платформу углубляться пока не будем, в сети достаточно об этом информации, к тому же вы можете использовать и не такой набор ПО, главное это PHP и Платформа 1С, остальное можно сочетать в разных вариациях (например, Windows 2008 R2, IIS+php, GIT; или веб-хостинг и ваш домашний компьютер на Windows 7 и т. д.)
Что вы должны уметь:
основы работы с IDE (в данной статье Eclipse), понимание работы систем контроля версий (в данной статье Subversion), основы синтаксиса PHP (желательно), предполагается что вы уверено умеете вести разработку на платформе 1С.
Можно приступать к работе.
- Создаем хранилище для проекта
> |
svnadmin create ./svn/article01 |
- Создаем проект в IDE
- Подключаем проект к хранилищу
Для "красивого" построения и разбора запросов будем использовать библиотеку NuSOAP. (скачать можно здесь)
Скопируем файлы библиотеки в папку libs нашего проекта.
Создадим рабочий файл index.php
Подключаем нашу библиотеку.
1 2 3 |
<?php require_once 'libs/nusoap/nusoap.php'; |
Объявим основные настройки, чтобы проверить в верном ли направлении мы идем.
Отправим изменения в хранилище. (Правой кнопкой мыши по проекту и Team – Commit)
Теперь зайдем через консоль в папку нашего веб-сервера и получим код из хранилища.
> |
svn checkout svn://192.168.1.157/article01/ |
По ссылке http://192.168.1.157/article01/index.php?wsdl мы видим XML схему нашего веб-сервиса. Никаких методов он еще не имеет, объявлены только основные характеристики сервиса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<definitions targetNamespace="http://192.168.1.157/article01/"> <types> <xsd:schema targetNamespace="http://192.168.1.157/article01/"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/> </xsd:schema> </types> <portType name="TestServicePortType"> </portType> <binding name="TestServiceBinding" type="tns:TestServicePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> </binding> <service name="TestService"> <port name="TestServicePort" binding="tns:TestServiceBinding"> <soap:address location="http://192.168.1.157/article01/"/> </port> </service> </definitions> |
Добавим метод возвращающий строку "Привет!".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php class CONFIG { public static $wsnamespace = "http://192.168.1.157/article01/"; public static $wsservicename = "TestService"; } // require_once 'libs/nusoap/nusoap.php'; // $server = new soap_server (); $server->configureWSDL ( CONFIG::$wsservicename, CONFIG::$wsnamespace, CONFIG::$wsnamespace ); $server->decode_utf8 = false; $server->soap_defencoding = 'UTF-8'; // Регистрируем метод $server->register ( 'Hello', array (), array ( 'return' => 'xsd:string' ), CONFIG::$wsnamespace, CONFIG::$wsnamespace . '#Hello', 'rpc', 'encoded', 'Простая функция для проверки взаимодействия с 1C.' ); function Hello() { return "Привет!"; } $HTTP_RAW_POST_DATA = isset ( $HTTP_RAW_POST_DATA ) ? $HTTP_RAW_POST_DATA : ''; $server->service ( $HTTP_RAW_POST_DATA ); |
И снова отправим изменения в хранилище (Team-Commit) и обновим данные на веб-сервере
> |
svn up |
На этом настройка серверной части веб-сервера завершена. Перейдем теперь к платформе 1С. За основу возьмем пустую конфигурацию. В конфигураторе создадим внешнюю обработку. Создадим команду со следующим кодом:
// Для меньших танцев с бубном адрес веб-сервиса должен совпадать с простарнством имен
ВыбПутьПубликацииСервиса = "http://192.168.1.157/article01/?wsdl";
// в веб-сервисе мы прописали wsnamespace
ВыбURIПространстваИменСервиса = "http://192.168.1.157/article01/";
// там же имя сервиса wsservicename
ВыбИмяСервиса = "TestService";
// имя точки подключения совпадает с именем сервиса + слово Port
ВыбИмяТочкиПодключения = "TestServicePort";
// Теперь объявим подключение
Определение = Новый WSОпределения(ВыбПутьПубликацииСервиса);
Сервис = Новый WSПрокси(Определение, ВыбURIПространстваИменСервиса, ВыбИмяСервиса, ВыбИмяТочкиПодключения);
// Ну и наконец-то вызовем наш метод
Сообщить(Сервис.Hello());
Можно слегка усложнить задачу и передать параметр на сервер для обработки.
Для этого немного модифицируем код на сервере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php class CONFIG { public static $wsnamespace = "http://192.168.1.157/article01/"; public static $wsservicename = "TestService"; } // require_once 'libs/nusoap/nusoap.php'; // $server = new soap_server (); $server->configureWSDL ( CONFIG::$wsservicename, CONFIG::$wsnamespace, CONFIG::$wsnamespace ); $server->decode_utf8 = false; $server->soap_defencoding = 'UTF-8'; // Регистрируем метод $server->register ( 'Hello', array ( 'str' => 'xsd:string' ), array ( 'return' => 'xsd:string' ), CONFIG::$wsnamespace, CONFIG::$wsnamespace . '#Hello', 'rpc', 'encoded', 'Простая функция для проверки работы с 1C.' ); function Hello($str = "Guest") { return "Привет, {$str}!"; } $HTTP_RAW_POST_DATA = isset ( $HTTP_RAW_POST_DATA ) ? $HTTP_RAW_POST_DATA : ''; $server->service ( $HTTP_RAW_POST_DATA ); |
И добавим несколько строк в нашу обработку после объявления подключения:
ТипВхПараметра = Сервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string");
ВходПар = Сервис.ФабрикаXDTO.Создать(ТипВхПараметра, "Миша");
Сообщить(Сервис.Hello(ВходПар));
Как это использовать? Например, для обновления статусов на сайте. Можно организовать чат с посетителями веб-ресурса (например, менеджеров и клиентов интернет магазина).
В следующей статье мы разберем, как работать со сложными типами данных, и далее попробуем написать сервис для формирования каталога товаров для какой-нибудь бесплатной CMS.