воскресенье, 20 апреля 2014 г.

1С:Предприятие 8. Веб-сервисы. Передаем массив в 1С

Содержание статей: 1С:Предприятие 8. Веб-сервисы
Предыдущая статья: 1С:Предприятие 8. Веб-сервисы. Синхронизация с сайтом

Чтобы передать массив в 1С в качестве параметра операции веб сервиса достаточно просто этому параметру указать тип anyType (http://www.w3.org/2001/XMLSchema). После чего, переданный из php массив, в 1С будет передан как СписокXDTO, который можно обходить в цикле.


Давайте создадим веб сервис и операцию "GetMass". Для этой операции добавим один параметр "param" типа anyType (http://www.w3.org/2001/XMLSchema) как показано на рисунке.


В принципе, это все что необходимо сделать.

Следующий код передает массив в 1С.

<?php

// устанавливаем кодировку
header("Content-Type: text/html; charset=UTF-8");
ini_set("soap.wsdl_cache_enabled","0");

// создаем клиент для веб-сервисов и вызываем операцию
$SoapClient1C = new SoapClient("http://ghostaz.no-ip.org/mass/ws/WebСервис?wsdl");
$Mass = array(1,2,3);
$Result = $SoapClient1C->GetMass(array("param"=>$Mass));

print_r($Result);

?>

В 1С в отладчике можно увидеть что params имеет тип СписокXDTO.

Соответственно возможен обход в цикле:

Функция GetMass(param)

Результат = 0;
Для каждого Значение из param.int цикл
Результат = Результат + Значение;
КонецЦикла;

Возврат Результат;

КонецФункции

Вместо типа anyType можно использовать другие типы, например, array из стандартных типов 1С datacore.


UPD от 01.09.2015:

По каким то причинам передать массив или структуру в веб сервис из 1С нельзя. Ругается на несоответствие типов. Но передать параметр можно, если в операцию передать ОбъектXDTO.


На рисунке приведен код, который передает структуру в 1С. Тип параметра WS операции должен быть Structure (http://v8.1c.ru/8.1/data/core).

9 комментариев:

  1. Анонимный26 апреля, 2014 02:06

    а можете выложить подробную статью как реализовать с нуля эту связку 8.2, C#, веб-сервис, передача по COM примитивную строку? очень нужно... http://www.develplatform.com/2012/12/com-2.html?showComment=1398425453191#c1822162368745664590

    ОтветитьУдалить
  2. Анонимный17 июля, 2014 00:55

    хэлп плиз

    создаю простой массив
    передаю его в сервис пишет:
    Несоответствие типов (параметр номер '1')
    сервис создал такой как описано выше.
    пытался передавать и array и anyType . только строку (string) передает без ошибок

    ОтветитьУдалить
    Ответы
    1. А вы в веб-сервисе указали тип параметра anyType?

      Удалить
    2. Анонимный21 июля, 2014 23:04

      да, ставил array, anyType и string. Только строку норм передало.
      ps
      вышел из положения так.
      Результат запроса выгружаю в ТЗ. Таблицу в хранилище значений. с хранилищем работаю через XMLСтрока() и XMLЗначение().

      Удалить
  3. А как передать массив параметров из 1С на сторонний веб сервис? Через запятую или как? В ПОСТ запросе

    ОтветитьУдалить
    Ответы
    1. Можете почитать мою же статью о передаче массива http://codenotes-1c.blogspot.ru/2013/06/1-8_18.html

      Удалить
  4. Каждый сервер имеет свое АПИ, которое описывает структуру данных которую может принять. Так как я ее не знаю, то предлагаю самый простой для 1с вариант:
    1 - создаете веб операцию которая в качестве выходного типа имеет тип Structure (http://v8.1c.ru/8.1/data/core)
    2 - делаете обычную таблицу значений
    3 - заполняете ее
    4 - в веб сервисе пишете Возврат СериализаторXDTO.ЗаписатьXDTO(РезультатОперации);

    Если делать как вы пишете через ПОСТ, то это уже не веб сервис это HTTPСоединение. Тут по быстрому не расскажешь. Вариантов много

    ОтветитьУдалить
  5. Анонимный08 июня, 2020 15:20

    Мистер Бенджамин сделал все возможное, чтобы помочь мне с моим кредитом, который я использовал, чтобы расширить мой аптечный бизнес. Они были дружелюбны, профессиональны и абсолютно самоотверженны. Я рекомендую всем, кто ищет кредит, связаться с нами. lfdsloans@outlook.com.WhatsApp ... + 19893943740.

    ОтветитьУдалить