Нестандартные решения: Статья №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.