Работа с веб-сервисами 1С на PHP

Здравствуйте.

Я не буду останавливаться на вопросе что такое веб-сервисы 1С, т.к в сети очень много статей на эту тему. Просто постараюсь вкратце показать, каким способом возможна работа с веб-сервисами 1С на php.

И так начнем.

В первую очередь для PHP надо подключить модуль  для работы по протоколу SOAP. Для windows надо в файле php.ini либо раскомментировать либо дописать строки
[PHP_SOAP]
extension=php_soap.dll

Под windows замечена следующая особенность — файл php.ini надо обязательно положить в папку C:\Windows. Также необходимо перезапустить веб-сервер, если PHP установлен как модуль.

Рассмотрим 2 случая:

  1. Когда в параметр метода веб-сервиса необходимо передать строку
  2. Когда в параметр метода веб-сервиса необходимо передать объект пакета XDTO, который описан в 1С

Примем одно условие, что ответ веб-сервис 1С присылает в формате JSON. К сожалению поддержка формата JSON на уровне методов платформы появилось только в версии «1С Предприятие 8.3.6». Чтобы использовать формат JSON в более ранних версиях платформы есть хорошая обработка, которой можно воспользоваться, а можно и написать что-то свое, т.к. данный формат передачи данных не сложный.
Ответ веб-сервиса 1С будет в формате JSON с параметрами «Status» и «Message» (в данном примере я не использовал обработку, а описал ответ сам):


НашеСообщение = "Какое-то сообщение"
ТекстОтветаВебСервисов = "{" + Символы.ПС + """Status""" + ":" + """Ok""" + "," + Символы.ПС 
                         + """Message""" + ":" + """" + НашеСообщение + """" + Символы.ПС
	                 + "}";

1 случай. Передача параметра в виде строки.


// Необходимо отключить кэширование для SOAP. Если этого не сделать, 
// функции веб-сервисов будут работать некорректно.    
ini_set('soap.wsdl_cache_enabled', 0 );
ini_set('soap.wsdl_cache_ttl', 0); 

$client = new SoapClient("//localhost:8080/ExampleBase/ws/ExampleWebService.1cws?wsdl",
    array(
        'login' => "1C", //логин пользователя к базе 1С
        'password' => "54321", //пароль пользователя к базе 1С
        'soap_version' => SOAP_1_2, //версия SOAP
        'cache_wsdl' => WSDL_CACHE_NONE,
        'trace' => true,
        'features' => SOAP_USE_XSI_ARRAY_TYPE
    )
);

//Заполним массив передаваемых параметров 
        $ParametrStroka = 'TestStroka';
        $params["ParametrStroka"] = $ParametrStroka;

//Выполняем операцию
        $result = $client->ExampleMethod($params); //ExampleMethod - это метод веб-сервиса 1С, который описан в конфигурации.

//Обработаем возвращаемый результат

        $jsResult = $result->return;
        $dataResult = json_decode($jsResult);
        $StatusResult = $dataResult->Status; //получим значение параметра Status, который был сформирован при ответе веб-сервиса 1С
        $MessageResult = $dataResult->Message; //получим значение параметра Message, который был сформирован при ответе веб-сервиса 1С

2 случай. Передача параметра в виде пакета XDTO 1C.
Допустим параметр XDTO — это документ «заказ клиента», который имеет реквизиты: номер документа, ФИО покупателя, табличная часть «Товары» (реквизиты — штрихкод товара, наименование товара, цена, количество, сумма). Для нашего примера пакет XDTO примет вид
Пример пакета XDTO


// Необходимо отключить кэширование для SOAP. Если этого не сделать, 
// функции веб-сервисов будут работать некорректно.    
ini_set('soap.wsdl_cache_enabled', 0 );
ini_set('soap.wsdl_cache_ttl', 0); 

$client = new SoapClient("//localhost:8080/ExampleBase/ws/ExampleWebService.1cws?wsdl",
    array(
        'login' => "1C", //логин пользователя к базе 1С
        'password' => "54321", //пароль пользователя к базе 1С
        'soap_version' => SOAP_1_2, //версия SOAP
        'cache_wsdl' => WSDL_CACHE_NONE,
        'trace' => true,
        'features' => SOAP_USE_XSI_ARRAY_TYPE
    )
);

//Заполним массив передаваемых параметров 
       $ParametrXDTO= Array(
            "DocumentNumber" => '0000001',
            "NameCustomer" => 'Андрей Петрович',
            "Goods" => Array(
                "Product" => array(
                      "ProductBarCod" => '8718863003152',
                      "ProductName" => 'Телевизор PHILIPS 40PFT4100/60',
                      "Count" => 1,
                      "Price" => 25000,
                      "Summa" => 25000);

        $params["ParametrXDTO"] = $ParametrXDTO;

//Выполняем операцию
        $result = $client->ExampleMethod($params); //ExampleMethod - это метод веб-сервиса 1С, который описан в конфигурации.

//Обработаем возвращаемый результат

        $jsResult = $result->return;
        $dataResult = json_decode($jsResult);
        $StatusResult = $dataResult->Status; //получим значение параметра Status, который был сформирован при ответе веб-сервиса 1С
        $MessageResult = $dataResult->Message; //получим значение параметра Message, который был сформирован при ответе веб-сервиса 1С

На этом все. Как видите ничего сложно нет. Будут вопросы — спрашивайте.

Популярность: 26%

Запись опубликована в рубрике Настройка и оптимизация с метками , . Добавьте в закладки постоянную ссылку.

5 Responses to Работа с веб-сервисами 1С на PHP

  1. Сергей говорит:

    Доброго дня
    Может Вы сталкивались с особенностями обращения к SOAP API из 1С 7.7?
    Есть задача — достучаться до данных через wsdl-схему именно из 1С 7.7 (в 8-ке проблем нет)
    Задача написана через post-запрос, но проблема — в ответе вся WSDL-схема.
    Если сталкивались — могу описать весь путь.
    Спасибо

    • Сергей Сопелев говорит:

      Добрый день. Что касается 1с 7.7, сейчас очень редко приходится сталкиваться с данной версией платформы.
      Могу сказать что работу с веб-сервисами на 1с 7.7 делал с помощью winhttp и MSXML.
      Почему приходит в ответе вся схема не могу сказать, по моему тут либо что то на стороне самого веб-сервиса, либо что то с передаваемыми параметрами.

  2. Андрей говорит:

    Сергей, большое спасибо за статью!

    Есть вопрос — как правильно написать для второго случая в параметре $ParametrXDTO передачу нескольких строк в «goods»?

    • Сергей Сопелев говорит:

      Добрый день. для второго случая будет приблизительно так

      
      $CountProducts = 5;
      $ProductArray = array();
          for ($i = 1; $i <= $CountProducts; $i++) {
              $ProductArray[] = array(
                  "ProductBarCod" => '8718863003152',
                   "ProductName" => 'Телевизор PHILIPS 40PFT4100/60',
                   "Count" => 1,
                   "Price" => 25000,
                   "Summa" => 25000));
          }
      
      $ParametrXDTO= Array(
                  "DocumentNumber" => '0000001',
                  "NameCustomer" => 'Андрей Петрович',
                  "Goods" => Array(
                      "Product" => ProductArray)
      
  3. Пока вопросов нет, спасибо.

Добавить комментарий для Сергей Сопелев Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.