Меню

Soapfault неизвестная ошибка недостаточно параметров операции

   koupny

29.07.11 — 15:45

Здравствуйте! Необходимо осуществить подключение 1С 8.2 к сайту через SOAP используя веб-сервис.

Проблема возникает, при передачи в веб-сервис значения параметра. Ошибка: «Недостаточно параметров операции по причине: Недостаточно параметров операции.»

Когда параметров нету, все отлично работает.

soapParameters = Array(‘login’ => «login», ‘password’ => «psw») ;

$client = new SoapClient(«http://XX.XX.XX.XX/ws/ws1.1cws?wsdl», $soapParameters);

$result = $client->helloWorld();

echo $result->return;

А как правильно передать значения параметрам веб-сервиса?

Заранее спасибо!

   Просто Лёха

1 — 29.07.11 — 15:48

У меня вот так работает:

$client = new SoapClient(«http://127.0.0.1/wsserv/ws/service.1cws?wsdl» , array(‘login’ => «Login», ‘password’ => «mypassword», ‘exceptions’ => 1));

       $params[«Сотрудник»] = $cmluids;

       $params[«ДатаНачала»] = $start_date;

       $params[«ДатаОкончания»] = $end_date;

       $result = $client-> Returninfo($params);

   Просто Лёха

2 — 29.07.11 — 15:52

(1) Returninfo — у меня так процедура экспортная веб сервиса называется

   koupny

3 — 29.07.11 — 15:59

хм..странно, у меня такая ошибка:

«Fatal error: Uncaught SoapFault exception: [soap:Client] Неизвестная ошибка. Недостаточно параметров операции по причине: Недостаточно параметров операции »

Вот код мой:

$client = new SoapClient(«http://127.0.0.1/wsgara/ws/ws1.1cws?wsdl», array(‘login’ => «mylogin», ‘password’ => «mypsw»,’exceptions’ => 1));

 
$params[«newparam»] = «1»;

     
$result = $client-> helloWorld($params);

Может у меня проблема именно в конфигурации?

[URL=http://www.radikal.ru][IMG]http://s40.radikal.ru/i087/1107/be/19b5d75cabfe.jpg[/IMG][/URL]

   koupny

4 — 29.07.11 — 16:01

   Просто Лёха

5 — 29.07.11 — 16:04

(3) Если без параметров работает, а с параметром такая вещь — значит проблема к конфигурации

   koupny

6 — 29.07.11 — 16:05

да( интересно в чем же именно(

   Просто Лёха

7 — 29.07.11 — 16:05

свойства newparam — стоит галочка возможно пустое значение? И какой тип возвращаемого значения задан?

   koupny

8 — 29.07.11 — 16:06

галочка не стоит. а тип — string

   Fragster

9 — 29.07.11 — 16:06

   Просто Лёха

10 — 29.07.11 — 16:06

Попробуй поставить и ещё раз проверить

   koupny

11 — 29.07.11 — 16:09

галку поставил — такая же ошибка(

   koupny

12 — 29.07.11 — 16:10

Самое интересное что, если параметра нету. Работает все отлично.

   Просто Лёха

13 — 29.07.11 — 16:12

Туплю, у тебя параметра то нет (4)

   Просто Лёха

14 — 29.07.11 — 16:14

(13) Т.е. не так поставь галочки и и свойству helloword и параметру свойства и newparam,  параметра псомотри так же типы значения, направления параметра

   koupny

15 — 29.07.11 — 16:19

у helloWorld — галка «Возможно пусто значение» — стоит. Тип возвращаемого — string. Аналогично и у параметра newparam + направление передачи — «входной».

   Просто Лёха

16 — 29.07.11 — 16:25

скинь то что отображается в браузере по ссылке

http://127.0.0.1/wsgara/ws/ws1.1cws?wsdl

   koupny

17 — 29.07.11 — 16:36

<definitions xmlns=»http://schemas.xmlsoap.org/wsdl/» xmlns:soap12bind=»http://schemas.xmlsoap.org/wsdl/soap12/» xmlns:soapbind=»http://schemas.xmlsoap.org/wsdl/soap/» xmlns:tns=»helloWorld» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:xsd1=»helloWorld» name=»webService» targetNamespace=»helloWorld»>

<types>

<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xs1=»helloWorld» targetNamespace=»helloWorld» elementFormDefault=»qualified»>

<xs:element name=»helloWorld»>

<xs:complexType>

<xs:sequence>

<xs:element name=»newparam» type=»xs:string» nillable=»true»/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name=»helloWorldResponse»>

<xs:complexType>

<xs:sequence>

<xs:element name=»return» type=»xs:string» nillable=»true»/>

<xs:element name=»newparam» type=»xs:string» nillable=»true»/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

</types>

<message name=»helloWorldRequestMessage»>

<part name=»parameters» element=»tns:helloWorld»/>

</message>

<message name=»helloWorldResponseMessage»>

<part name=»parameters» element=»tns:helloWorldResponse»/>

</message>

<portType name=»webServicePortType»>

<operation name=»helloWorld»>

<input message=»tns:helloWorldRequestMessage»/>

<output message=»tns:helloWorldResponseMessage»/>

</operation>

</portType>

<binding name=»webServiceSoapBinding» type=»tns:webServicePortType»>

<soapbind:binding style=»document» transport=»http://schemas.xmlsoap.org/soap/http»/>

<operation name=»helloWorld»>

<soapbind:operation style=»document»/>

<input>

<soapbind:body use=»literal»/>

</input>

<output>

<soapbind:body use=»literal»/>

</output>

</operation>

</binding>

<binding name=»webServiceSoap12Binding» type=»tns:webServicePortType»>

<soap12bind:binding style=»document» transport=»http://schemas.xmlsoap.org/soap/http»/>

<operation name=»helloWorld»>

<soap12bind:operation style=»document»/>

<input>

<soap12bind:body use=»literal»/>

</input>

<output>

<soap12bind:body use=»literal»/>

</output>

</operation>

</binding>

<service name=»webService»>

<port name=»webServiceSoap» binding=»tns:webServiceSoapBinding»>

<documentation>

<wsi:Claim xmlns:wsi=»http://ws-i.org/schemas/conformanceClaim/» conformsTo=»http://ws-i.org/profiles/basic/1.1″/>

</documentation>

<soapbind:address location=»http://127.0.0.1/wsgara/ws/ws1.1cws»/>

</port>

<port name=»webServiceSoap12″ binding=»tns:webServiceSoap12Binding»>

<soap12bind:address location=»http://127.0.0.1/wsgara/ws/ws1.1cws»/>

</port>

</service>

</definitions>

   Просто Лёха

18 — 29.07.11 — 17:00

(17) сейчас у себя попробую развернуть

   koupny

19 — 29.07.11 — 17:15

попробуйте.. вдруг получиться, а то я не знаю уже в чем может быть проблема(

   Просто Лёха

20 — 29.07.11 — 19:24

(19) Ну как бы все отлично, сейчас скину скрин

   Просто Лёха

21 — 29.07.11 — 19:37

Код файла:

<?php

// Отключаем кэширование для SOAP. Если этого не сделать,

// функции веб-сервисов будут работать некорректно.

ini_set(«soap.wsdl_cache_enabled», «0»);

//Работа с исследованиями

$client = new SoapClient(«http://192.168.1.10/MyApp/ws/preved.1cws?wsdl» , array(‘login’ => «admin», ‘password’ => «admin», ‘exceptions’ => 1));

$params[«param»] = «1234567890»;

$result = $client->getinfo($params);

Var_dump($result);

?>

   Просто Лёха

22 — 29.07.11 — 19:43

Версия 1С:Предприятие 8.2 (8.2.13.219)

База файловая, Apache 2.2, запускал с другого компа, т.к. на этом не стоит PHP, PHP Version 5.3.2-1

Поддржека Soap http://screencast.com/t/7EyaLj2iL

Обращение в веб сервису

http://screencast.com/t/2lLqfY8jx

   koupny

23 — 29.07.11 — 22:52

Алексей! Вы молодец, все получилось, проблема была в кэширование wsdl. Как только это сделал, все заработало!

Спасибо большое за потраченное время!

  

Просто Лёха

24 — 30.07.11 — 02:18

Да не за что

Как то давно это делал.
Я создал класс для работы из сайта с 1С 8:

Класс php class.1c.php

<?
    defined('1Cv8') OR die('Прямой доступ запрещён!');


    # Пример использования:
    #
    # 1. Создаём класс ::: $api = new api_1c();
    # 2. Устанавливаем соединение ::: $compound_SOAP = $api->connect();
    # 3. Выполняем запрос ::: $api->get($compound_SOAP, %Параметр%);
    #
    # Создаём класс для работы SOAP + 1С:Предприятие
    #   $api = new api_1c();            
    #   $compound_SOAP = $api->connect();
    #       
    # JSON параметр для 1С:Предприятие
    #   $data = array();
    #   $data['command'] = 'login';
    #   $data['user_name'] = 'admin';
    #   $data['user_password'] = 'admin';
    #
    # Выполним запрос
    #   $result = $api->get($compound_SOAP, json_encode($data));
    #
    # Проверим полученный результат, если результат обработан без ошибок
    #   if ($result['success']) {
    #
    #   $result['data']->return; - Это тело ответа 1С:Предприятие (Добовляем: '->return')
    #
    # Разбераем ответ и декадируем в массив PHP
    #   $structure = json_decode($result['data']->return, true);
    #
    #
    #############################################################################################
    #############################################################################################
    #
    #
    # Класс для соединение 1С:Предприятие 8 (WEB-Сервисы) WSDL
    #   
    # Возвращаемые параметры:
    #   Функция get возвращает двумерный массив массив
    #
    # Ключи:
    #
    # succes - true / false
    # data - результат
    # title - Заголовок (данный ключ формируются в случаи succes = false)
    # description - Описание (данный ключ формируются в случаи succes = false)
    # debug - Строковое значение результата для JS вывода в console
    #
    class api_1c {
        # Внутренняя переменная
        private $config;

        # Конструктор класса    
        public function __construct() {
            # Создаём класс конфигурации
            $CF = new config_XML();

            # Дополнительный контент API WSDL SOAP 1C
            $SOAP_server = $CF->get('1Cv8', 'Сервер'); # http://localhost/eta/ws/api.1cws?wsdl
            $SOAP_login = $CF->get('1Cv8', 'Пользователь'); # web
            $SOAP_password = $CF->get('1Cv8', 'Пароль'); # web
            $SOAP_debug = $CF->get('1Cv8', 'Использовать режим отладки'); # 1 или 0

            # Формируем параметры SOAP
            $CF_SOAP['login'] = "$SOAP_login";
            $CF_SOAP['password'] = "$SOAP_password";
            $CF_SOAP['soap_version'] = SOAP_1_2;
            $CF_SOAP['cache_wsdl'] = WSDL_CACHE_NONE;
            $CF_SOAP['exceptions'] = true;
            $CF_SOAP['trace'] = true;
            $CF_SOAP['features'] = SOAP_USE_XSI_ARRAY_TYPE; 
            # Собираем массив параметров в кучу    
            $this->config['SOAP'] = "$SOAP_server";
            $this->config['CF'] = $CF_SOAP;
            $this->config['debug'] = ($SOAP_debug == 1 ? true: false);
        } 

        # Подключаемся к web сервису
        public function connect() {
            # Результирующий массив
            $result = array();

            # Проверим подключенный модуль php-soap
            if (!function_exists('is_soap_fault')) {
                $result['success'] = false;
                $result['title'] = 'Ошибка сервера SOAP';
                $result['description'] = 'Не настроен web сервер. Не найден модуль php-soap.';
                return $result;
            }        

            try { # Попытка создать соединение
                # Создаём соединение с web сервисом 1С:Предприятие 8
                $SOAP = new SoapClient($this->config['SOAP'], $this->config['CF']);    
            } catch (SoapFault $e) { # Если ошибка
                $result['success'] = false;
                $result['title'] = 'Ошибка подключения';
                $result['description'] = 'Невозможно установить соединение с сервером ['. $e->getMessage() .']'; # $e;
                return $result;
            }

            # Если ошибка 
            if (is_soap_fault($SOAP)) {
                $result['success'] = false;
                $result['title'] = 'Внутренняя ошибка сервера';
                $result['description'] = 'Неопределенная ошибка сервера, повторите попытку';
                return $result;
            }

            # Возвращаем результат
            $result['success'] = true;
            $result['SOAP'] = $SOAP;
            $result['debug'] = $this->config['debug'];
            return $result;           
        }

        # Выполняем запрос и получаем ответ
        public function get($constructor, $options) {
            # Результирующий массив
            $result = array();

            # Если ошибок не обнаружено 
            if ($constructor['success']) {
                # Если тип ключа массива является объектом, то сформируем команду запроса
                if (is_object($constructor['SOAP'])) {

                    try { # Попытка выполнить команду на стороне 1С:Предприятие
                        $data = array();
                        $data['options'] = $options;

                        $result['success'] = true;
                        # Формируем команду 1С:Предприятие
                        # @Handle(Параметр) - является командой 1С:Предприятие
                        $result['data'] = $constructor['SOAP']->Handle($data); 

                        # Если включен режим отладки добавляем ключ (Для JS console)
                        if ($constructor['debug']) {
                            $result['debug'] = $result['data']->return;    
                        }

                        return $result;
                    } catch (SoapFault $e) {
                        $result['success'] = false;
                        $result['title'] = 'Ошибка';
                        $result['description'] = 'Невозможно выполнить операцию запроса';

                        # Если включен режим отладки добавляем ключ (Для JS console)
                        if ($constructor['debug']) {
                            $result['debug'] = $e;    
                        }

                        return $result; # var_dump($e);    
                    }   

                # Иначе если тип ключа массива не является объектом
                } else {
                    $result['success'] = false;
                    $result['title'] = 'Ошибка';
                    $result['description'] = 'Не удалося подключиться к 1С:Предприятие';

                    # Если включен режим отладки добавляем ключ (Для JS console)
                    if ($constructor['debug']) {
                        $result['debug'] = $result['description'];    
                    }

                    return $result;
                }

            # Иначе вернем ранее сформированный массив т.к. при подключении к WEB серверу были обнаружены ошибки
            } else { 
                return $constructor;
            }
        }
    }

?>

И в 1С Web-сервисы > API > Handle

Функция Handle(options)

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(options);
    Параметр = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();

    Ответ = ОбработатьДанныеДляОтвета(Параметр);

    Возврат Ответ;

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

// Обработка входящих данных
// Параметры:
//  Параметры - Структура - Структура параметров
// Возвращаемое значение:
//  Ответ - Строка - Строка в формате JSON
// 
// Обязательные ключи в структуре возврата:
//  is - Строка - с двумя вариантами "error" - Ошибка; "success" - Данные успешно обработаны
//  title - Строка - Заголовок 
//  description - Строка - Описание
//
Функция ОбработатьДанныеДляОтвета(Параметры) Экспорт

    Ответ = Новый Структура;
    Ответ.Вставить("is", "error");
    Ответ.Вставить("title", "Ошибка обработки команды");
    Ответ.Вставить("description", "Команда не зарегистрирована в системе 1С:Предприятие");

    // Тут чего нибудь делаешь  

    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Ответ);

    Возврат ЗаписьJSON.Закрыть();

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

Итак. Код метода каждой ws-операции находится в модуле веб-сервиса, к которому принадлежит эта ws-операция.

Модуль веб-сервиса исполняется только на Сервере.

Замечание 1: нет смысла писать директивы компиляции &НаСервере, &НаКлиенте и другие.

На каждый вызов веб-операции создается отдельный сеанс с информационной базой, поэтому при каждом вызове веб-операции происходит инициализация параметров сеанса. Инициализация параметров сеанса происходит в модуле сеанса в процедуре «УстановкаПараметровСеанса».

Замечание 2: не нагружайте эту процедуру лишними действиями.

Лично я в данное процедуре при первом вызове делаю инициализацию только самых часто используемых параметров сеанса. И только если нужны другие параметры сеанса, при повторном вызове, обрабатываю указанные параметры.

Пример:

Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)

//суть изменений — получить сразу только важные параметры, а если нужны еще параметры воспользоваться подсистемой БСП
Если ИменаПараметровСеанса=Неопределено Тогда
      Запрос = Новый Запрос;
      Запрос.Текст =
      «ВЫБРАТЬ ПЕРВЫЕ 1
      | Пользователи.Ссылка КАК Ссылка
      |ИЗ
      | Справочник.Пользователи КАК Пользователи
      |ГДЕ
      | Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ»;
      ИдентификаторПользователяИБ =       ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
      Запрос.Параметры.Вставить(«ИдентификаторПользователяИБ «, ИдентификаторПользователяИБ);
      РезультатПользователи = Запрос.Выполнить();
      ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
      Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            ПараметрыСеанса.ТекущийПользователь = ВыборкаДетальныеЗаписи.Ссылка;
      КонецЦикла;
      ПараметрыСеанса.ТекущийКонтрагент = ПараметрыСеанса.ТекущийПользователь.Контрагент;
Иначе
      СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса);
КонецЕсли;
КонецПроцедуры

Если вы читали статью «1С:Предприятие 8. Веб-сервисы. Реализация собственного веб-сервиса», то заметили что в дереве метаданных параметр ws-операции называется «Param», а в реализующем его методе называется «Параметр». Дело в том что наименование операндом в методе ws-операции не имеет значение, 1С подставляет операнды в том порядке в котором они указаны в дереве метаданных ws-операции. Например у нас есть операция Example1, в конфигураторе мы указали что операция имеет два параметра «param1» и «param2» и создали процедуру которая выводит «param2».

Если мы вызовем ws-операцию Example1 и передадим в качестве параметров param1=1, param2=2, то в результат получим 2.

Но если мы поменяем порядок операндов в конфигураторе:

То тот же самый вызов вернет 1.

Замечание 3: после смены порядка параметров ws-операции, не забудьте поменять их порядок в заголовке функции, реализующей эту операцию.

Замечание 4: в качестве операндов ws-операции можете использовать отличные от заданных в конфигураторе имена.

Если у части параметров ws-операции установлена галочка «Возможно пустое значение», то данный параметр может быть не указан при вызове, но тут есть несколько нюансов. При использовании клиента, например SoapClient вы не можете при передачи параметра просто взять и не указать параметр совсем. Например:

$a=$client->Plus2();

Эта строка вызовет ошибку «Неизвестная ошибка. Недостаточно параметров операции». То есть сам параметр надо передать, указав значение null:

$zz=array(«Param»=>null);
$a=$client->Plus2($zz);

Но тогда возникает вопрос, а как этот пустой параметр будет передан в 1С. Логично что программисту 1С захочется сделать в методе веб-операции следующее:

Функция Plus2(Параметр=0)
  Возврат Параметр+2;
КонецФункции

То есть указать значение операнда в случае его отсутствия.
Теперь надо вызвать наш веб-операцию с пустым. Приведу пример xml сообщения soap с передачей значение null.

<soapenv:Header/>

<soapenv:Body>

<uri:Plus2>

&nbsp;<uri:Param xsi:nil=»true»></uri:Param>

</uri:Plus2>

</soapenv:Body>

</soapenv:Envelope>

xsi:nil=»true» — указывает, что данный параметр не имеет значение. Для того что бы можно было указать null дополнительно надо связать префикс xsi с пространством имен: xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance».

Но если он сделает вызов такой ws-операции с пустым значением то получит сообщение об ошибке:

<soap:Header/>

<soap:Body>

<soap:Fault>

<faultcode>soap:Client</faultcode>

<faultstring>Неизвестная ошибка. {WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено

по причине:

{WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено</faultstring>

<detail>Неизвестная ошибка. {WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено

по причине:

{WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено</detail>

</soap:Fault>

</soap:Body>

</soap:Envelope>

Все потому, что переданное значение null преобразуется в значение 1с — «Неопределено». В этом можно убедиться если переписать процедуру так.

Функция Plus2(Параметр=0)
  Если Параметр = Неопределено Тогда
    Результат = 1;
  Иначе
    Результат = 2;
  КонецЕсли;
  Возврат Результат;
КонецФункции

Результатом будет — 1.

Замечание 5: нет смысла писать значение операнда ws-операции по умолчанию(Функция Plus2(Параметр=0)). Для операндов, которые могут принимать пустое значение надо добавить проверку на равенство «Неопределено».

Замечание 6: При передачи в веб-операцию параметра строкового типа, строка из одного или нескольких пробелов обрезается до пустой строки.

Замечание 7: При передаче в веб-операцию параметра типа дата (datetime) с использованием формата с указанием на часовой пояс, время приводится к часовому поясу в котором находится платформа 1с. Например если операция имеет параметр «Дата» типа datetime, ПК на котором располагается 1с находится в часовом поясе +6, то при передаче в этот параметр значения ‘2012-09-14T00:00:00.000+02:00’ в коде веб-операции данный параметр будет иметь значение ‘14.09.2012 4:00:00’. Следовательно ‘+02:00’ указывает на то, в каком поясе находится отправитель. Это позволит вам не задумываться о переводе времени при работе в нескольких часовых поясах.

Веб-сервисы как правило создают для обмена информацией с информационными системами разного происхождения. Перед программистом 1С возникает вопрос какие структуры XDTO стоит использовать. Например нужно на сайт из 1С передать информацию по какому либо товару. Есть два подхода: передача в виде объектов и передача в виде таблиц. При передаче в виде объектов вы создаете иерархическую структуру XDTO например:

На рисунке видно что имеется объект «Номенклатура», этот объект имеет поле «ЕдиницаИзмерения», которое имеет тип объекта «Единица измерения» и при выгрузке остатков через объект «Остатки номенклатуры» в свойстве «Массив» будет происходить передача всего объекта номенклатура и его остатка. То есть при каждой передаче передается довольное объемный объект Номенклатура, хотя она меняется довольно редко и при большом количестве номенклатуры (порядка 2000 при данной структуре) выгрузка бы просто не завершилась, т.к. хостинг ограничивает и объем передаваемых данных и время выполнения скрипта по передаче. Для ускорения передачи проще передавать массив [УИДНоменклатуры — Остаток]. В таком случае передается только уникальный идентификатор номенклатуры, по которому мы всегда сможем получить его свойства.

И у того и у другого способа есть свои достоинства и недостатки.

Достоинства объектного способа:

  • вы всегда получаете полный объем информации и нет необходимости в синхронизации объектов по идентификаторам;
  • удобочитаемость — вы всегда видите наименование объекта и его свойства. а не просто идентификатор.

Недостатки объектного способа:

  • при изменении структуры приходится переписывать код всех процедур в которых идет работа с этим объектом;
  • большой объем передаваемых данных;
  • для формирования объекта необходимо получать все его свойства из запроса или лругим способом.

Достоинства табличного подхода:

  • небольшой объем передаваемых данных;
  • при изменении свойств объекта достаточно изменить только одну процедуру п синхронизации этого объекта;
  • для передачи ссылки на объект нет необходимости получать все его свойства в каждой ws-операции.

Недостатки табличного подхода:

  • трудно читать soap-сообщения;
  • при выгрузке данных ссылок на объекты, надо продумать еще и операции по получению свойств этих объектов и их своевременную синхронизацию(например при смене наименования товара его надо тут же выгрузить на сайт);

Замечание 8: при проектировании структуры выгрузки веб-сервиса не пренебрегайте вопросами объема передаваемых данных и времени их передачи, т.к. передача через веб-сервисы действительно проходит долго. Приведу пример своего опыта. Я хотел узнать максимальный объем передаваемых данных и создал веб сервис который передавал массив объектов XDTO. Один объект занимал примерно 740 байт (это довольно мало, т.к. не забывайте что в этот объем входят и длинна тегов soap сообщения). При канале в 5 Мбит/с смог передать 150 тысяч таких объектов и все это занимало чуть больше 100 Мб. И эта передача выполнялась 3,5 минуты. После 100 Мбайт soap-клиент (souapUI) просто завис. При использовании платного хостинга данная выгрузка бы прервалась на 2 минуте (обычно такое ограничения ставят хостеры на время выполнения скрипта).

Замечание 9: для уменьшения передаваемых данных используйте короткие названия свойств объектов XDTO, т.к. они используются в названиях тегов (каждый тег повторяется два раза при открытии и закрытии тега). Используется кодировка UTF8, а это 2 байта на символ.

Замечание 10: Указание типа dateTime без символа «T» например: «2012-09-14 15:00:00» не вызывает ошибки, но отбрасывает часы,минуты и секунды. То есть система примет эту дату как «2012-09-14».

Замечание 11: в качестве URI пространства имен можно указать не только ссылку, но и строки не являющие ссылками, даже в кириллице и даже цифры, но это совсем не означает что не происходит проверок этого поля. В это поле, например, нельзя указать «http://tcp://». Но ошибку выдаст уже веб-сервер.

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Running two servers,Server 1: is a Soap Client & Sever 2: is a Soap Server

From server 1, I send an envelop to server 2 with the following parameters:

client_hash (string),
unique_code (string),
unique_code2 (string),
query_id (integer),
parameters (string)

The parameters, will be a json string, which will contain:
file_name (string),
file_mime (string),
file_content (string:base64 file encoded),
file_size (integer)

For some reason if the file is bigger than 700kb, php will through a SoapFault unknown error. While any smaller goes just fine.

Trying to debug it using Wireshark the envelop was sent but after 0.5234 seconds the connection was closed.

So I have tried all ways to increase php variables limit related on both sides but still the same,

Any idea what else could be limiting the connection?

Note:

On PHP:

post_max_size
upload_max_filesize

are already 15M

AND on mysql:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

innodb_buffer_pool_size=10M
innodb_additional_mem_pool_size=10M
innodb_log_buffer_size=10M
innodb_thread_concurrency=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=NO_ENGINE_SUBSTITUTION
long_query_time=1
max_allowed_packet=500M
log-slow-queries=/var/log/mysql-slow-query.log

Running two servers,Server 1: is a Soap Client & Sever 2: is a Soap Server

From server 1, I send an envelop to server 2 with the following parameters:

client_hash (string),
unique_code (string),
unique_code2 (string),
query_id (integer),
parameters (string)

The parameters, will be a json string, which will contain:
file_name (string),
file_mime (string),
file_content (string:base64 file encoded),
file_size (integer)

For some reason if the file is bigger than 700kb, php will through a SoapFault unknown error. While any smaller goes just fine.

Trying to debug it using Wireshark the envelop was sent but after 0.5234 seconds the connection was closed.

So I have tried all ways to increase php variables limit related on both sides but still the same,

Any idea what else could be limiting the connection?

Note:

On PHP:

post_max_size
upload_max_filesize

are already 15M

AND on mysql:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

innodb_buffer_pool_size=10M
innodb_additional_mem_pool_size=10M
innodb_log_buffer_size=10M
innodb_thread_concurrency=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=NO_ENGINE_SUBSTITUTION
long_query_time=1
max_allowed_packet=500M
log-slow-queries=/var/log/mysql-slow-query.log

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Soap ошибка преобразования данных xdto
  • Snowrunner системная ошибка vcruntime140 dll