вторник, 6 августа 2013 г.

1С:Предприятие 8. Веб-сервисы. Ошибки веб-сервисов и их причины


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


Хочу рассказать об ошибках, с которыми столкнулся при разработке веб-сервисов на 1С. Статью буду дополнять по мере получения опыта.

1
Это сообщение об ошибке при подключении к веб сервису из PHP.
[31-Mar-2013 05:32:02 UTC] PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://test.ru/test/ws/WebServices?wsdl' : failed to load external entity

Данное сообщение говорит лишь о недоступности веб-сервера, на котором опубликована база. В этом случае попробуйте вручную вызвать http://test.ru/test/ws/WebServices?wsdl и убедиться, что WSDL формируется. Если не формируется, значит либо веб-сервер выключен, либо база опубликована по другому адресу или порту, либо блокирует фаервол. Могут быть и другие причины.



2
02-Apr-2013 13:46:10 UTC] PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Error Fetching http headers in /home/users/b/test/domains/test.ru/testDIR/test.php:169

Эта ошибка возникает если WSDL возвращается с ошибкой. Есть несколько причин для этой ошибки:
  1. Несогласованность пространств имен в конфигурации. Например в ws-операции тип возвращаемого значения не соответствует типу из XDTO. Это может возникнуть при сменен URI пространства имен пакета XDTO.
  2. Возникает если в PHP включить кеш WSDL. Кеш запоминает WSDL и при каждом вызове веб-операции не запрашивает его, но если вы поменяли веб-сервис, то произойдет ошибка. Вообще, при разработке кеш стоит отключить, а если уже все работает то для скорости лучше включить. Ускорение при отключенном кеше заметное. Для примера скажу, что создание объекта SoapClient с выключенным кешем занимает примерно 2 сек, а с включенным - за сотые доли секунды. Отключить можно так:
    ini_set("soap.wsdl_cache_enabled", 0);
    или
    $client = new SoapClient('http://somewhere.com/?wsdl', array('cache_wsdl' => 0));
3
Ошибка SOAP сервера: Неизвестная ошибка. bad allocation.

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

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

  1. Не могу разобраться со следующей ошибкой. Разные soap клиенты возвращают ошибку типа "Unable to parse URL" при вызове любого метода после чтения wsdl. Т.е. wsdl читают, а следующий запрос отправить не могут. На причину этой ошибки меня наталкивает отсутствие полного url в wsdl: . 1C 8.2.16.362, apache 2.2.18, 2.2.25. Т.е. обновление апача с 18 до 25 релиза не помогло. В httpd.conf прописан ServerName tst.icc.biz:80. Куда рыть дальше? Пробовать другой релиз 1С?

    ОтветитьУдалить
    Ответы
    1. Я бы проверил пространства имен пакетов XDTO, которые описывают типы возвращаемые в результатах операций.

      Удалить
    2. Тестовый вэб-сервис очень простой - без пакетов xdto. Один метод получает на вход два параметра типа string (http://www.w3.org/2001/XMLSchema) и возвращает один такой же. Да и пространство имён не имеет отношения к адресу вэб-сайта. В предыдущем сообщении порезалась строка из wsdl:
      < soap12bind:address location="/ws/Order"/>

      Удалить
    3. У меня тоже указано имя сервера так же как у вас, но ошибка не воспроизводится. Думаю дело не в этом. На другой версии 1С пробовали?

      Удалить
  2. Разобрался с проблемой.
    Совпало два фактора.
    Первый фактор - неправильный адрес web-сервиса, к которому я обращался: http://tst/ws/Order?wsdl.
    Второй фактор - web-сервис я опубликовал в каталоге ws относительно корня web-сервера.
    При совпадении двух факторов начинает отдаваться тот злосчастный wsdl без полного url по адресу http://tst/ws/Order?wsdl.
    По хорошему, этот адрес не должен возвращать wsdl вообще, но при появлении второго фактора почему то возвращает.
    Правильный адрес такой: http://tst/base/ws/Order?wsdl или http://tst/base/ws/order.1cws?wsdl. Здесь base - это alias для каталога ws в httpd.conf, он же имя базы 1C, а /ws после /base - это уже зарезервированное 1С обращение к вэб-сервису.
    Видимо 1С и апач не разобрались, что значит /ws в неправильном адресе, каждый наверно подумал про своё.
    Если бы я назвал подкаталог web-сервера ws другим именем, то по неправильному адресу неправильного wsdl не было бы.

    ОтветитьУдалить
  3. Добрый день!
    У меня при подключении к веб-сервису 1С из 1С пишет ошибку аутентификации пользователя.
    Пытался в файле default.vrd прописать доступ пользователя, но все равно выдает ошибку аутентификации.

    Вот текст файла(у меня apache2.2) default.vrd:
    ?xml version="1.0" encoding="UTF-8"?>





















    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. ib="File="C:\Users\Евгений\Работа\Личное сопровождение пользователей\Работа с Фоминым\УТ";Usr="'1'";pwd="";"

    ОтветитьУдалить
    Ответы
    1. Пользователи берутся из базы. Попробуйте авторизоваться пользователем у которого есть пароль.

      Удалить
  6. Добрый день. При работе на одном компьютере стали возникать ошибки при отображении отчетов. При файловой системе достаточно почистить кэш. Как быть с веб-сервером? Кэш браузера пробовала чистить - не помогло. Вход с другого браузера помог, но если и на нем сбой случится? Есть решение проблемы?

    ОтветитьУдалить
    Ответы
    1. Как быстрое решение - открыть приватную вкладку в браузере.
      Но вообще очистка кеша браузера должна помогать. Может быть не все удаляется.

      Удалить