Цель блога описать интересные и полезные примеры программирования в системе 1С:Предприятие 8.
Страницы
вторник, 6 августа 2013 г.
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 возвращается с ошибкой. Есть несколько причин для этой ошибки:
- Несогласованность пространств имен в конфигурации. Например в ws-операции тип возвращаемого значения не соответствует типу из XDTO. Это может возникнуть при сменен URI пространства имен пакета XDTO.
- Возникает если в PHP включить кеш WSDL. Кеш запоминает WSDL и при каждом вызове веб-операции не запрашивает его, но если вы поменяли веб-сервис, то произойдет ошибка. Вообще, при разработке кеш стоит отключить, а если уже все работает то для скорости лучше включить. Ускорение при отключенном кеше заметное. Для примера скажу, что создание объекта SoapClient с выключенным кешем занимает примерно 2 сек, а с включенным – за сотые доли секунды. Отключить можно так:
ini_set ( "soap.wsdl_cache_enabled" , 0);
или
$client = new SoapClient( ‘http://somewhere.com/?wsdl’ , array ( ‘cache_wsdl’ => 0));
12 комментариев :
Не могу разобраться со следующей ошибкой. Разные 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С?
Я бы проверил пространства имен пакетов XDTO, которые описывают типы возвращаемые в результатах операций.
Возникла необходимость взаимодействовать с 1C с мобильного клиента под Windows Phone 7/8. Самым простым способом взаимодействия показалось работа через web сервисы, поддерживаемые 1С.
С точки зрения публикации web сервиса особых сложностей нет. Шаги подробно описаны в статьях:
Проблемы возникли с доступом к опубликованному web-сервису 1С. Под IIS 7.5 из под Windows 2008R2 после полудня танцев с бубном проблему решить не удалось. Были изучены статьи и ветки форумов:
но счастье так и не наступило.
В результате решил, что стоит попробовать поднять web сервис на Apache, поскольку с ним у меня обычно все было несколько проще с настройкой. Итак, на другом порту (8080) на том-же сервере был поднят Apache 2.2.22. В 1С был создан ещё один web сервис и опубликован уже на Apache. С настройками по умолчанию он также не заработал. Разберем ошибки.
Web сервис был опубликован в 1С под именем wsApache.
Публикация web-сервиса 1С под Apache
Соответственно, в указанном при публикации каталоге появился файл default.vrd следующего содержания:
В httpd.conf 1С добавила следующие строчки:
В целом, файлы/изменения создаваемые 1С почти рабочие. Теперь о проблемах.
Правильный линк на сервис
В некоторых статьях путь к web сервису указан как: http://имя_сервера:порт/имя_при_публикации/alias?wsdl.
- Имя сервера: s-1s-1-hw
- Порт: 8080
- Имя при публикации: wsApache
- Alias из файла default.vrd: service.1cws
Соответственно, НЕПРАВИЛЬНАЯ ссылка на web сервис 1С такая: http://s-1c-1-hw:8080/wsApache/service.1cws?wsdl
Если использовать такой линк, то 1C 8.2 выдаст сообщение вида:
Правильный вариант:
http://имя_сервера:порт/имя_при_публикации/ ws/ alias?wsdl.
Это обращение эквивалентно обращению по имени сервиса из default.vrd:
http://имя_сервера:порт/имя_при_публикации/ ws/ name?wsdl.
- Name из файла default.vrd: Service
Соответственно, ПРАВИЛЬНЫЙ линк для доступа к web сервису 1С будет такой:
http://s-1c-1-hw:8080/wsApache/ ws/ service.1cws?wsdl
http://s-1c-1-hw:8080/wsApache/ ws/ service?wsdl
Если указать ссылку с суффиксом ?wsdl, то в веб браузере отобразиться XML файл с описанием опубликованного сервиса.
Если указать ссылку без суффикса ?wsdl, то при правильной настройке должна появится страница с гиперссылкой на опубликованный сервис:
Авторизация пользователя при обращении к web сервису 1С
Если попытаться получить доступ к web сервису опубликованному под Apache не исправляя файл default.vrd, то появиться стандартный диалог авторизации:
Диалог авторизации на web сервисе 1С
В тестовой базе был заведен тестовый пользователь IUSR с полными правами с пустым паролем. Если ввести в диалог в качестве логина этого пользователя, то авторизация пройдет успешно и отобразиться либо XML файл, либо ссылка на него (см. выше).
Можно исключить запрос авторизационной информации вбив логин и пароль прямо в файл default.vrd, что, конечно, не рекомендуется с точки зрения безопасности, но иногда необходимо.
Это все. В моем случае каких-то дополнительных правок конфиг файлов не потребовалось.
В некоторых статьях указывалось, что нужно убрать из httpd.conf опцию «Options None«. У меня работает в обоих вариантах, т.е. когда строка присутствует и когда она удалена.
Публикация web сервиса 1С на IIS 7.5
Как уже упоминал выше, с публикацией web сервиса на IIS 7.5 с первого раза у меня не задалось, хотя тонкий клиент запускается без проблем. Поскольку пароль в конфигурационном файле по соображениям безопасности меня не устраивал, вернулся к вопросу настройки IIS. Был опубликован web сервис с именем wsIIS и именем сервиса ServiceIIS и alias-ом serviceIIS.1cws. Галка в чекбоксе «Использовать аутентификацию операционной системы на веб-сервере» для простоты эксперимента была снята.
Публикация web сервиса 1С в IIS 7.5.
Корректная ссылка в моем случае: http://s-1c-1-hw/wsIIS/ws/ServiceIIS?wsdl. При попытке зайти из Chrome/IE получаем ошибку возвращенную IIS:
Ошибка HTTP 401.2 — Unauthorized
дабы избавиться от ошибки правим web.config сформированный 1С следующим образом:
Эта правка эквивалента изменению через консоль управления IIS для нашего опубликованного приложения с именем wsIIS правил авторизации пользователя.
Настройки IIS 7.5 для доступа к web сервисам 1C
Добавление тегов security в web.config или правка правил авторизации в консоли IIS приводит к тому, что при обращении к сервису по указанной выше ссылке появляется запрос на авторизацию. Вводим нашего тестового пользователя IUSR без пароля и получаем нужный XML файл в ответе сервера.
Прописав в default.vrd логин и пароль пользователя, как было указано выше для Apache, уберем окно авторизации и сервис будет всегда авторизовываться под указанным пользователем. Как проходит авторизация можно посмотреть в логах 1C. Но вариант с прописыванием пользователя в конфигурационный файл — не наш путь, ибо не секьюрно.
Изменим настройки авторизации пользователя (в IIS проверка подлинности), чтобы использовалась Windows авторизация. Сменить можно в консоли управления IIS, либо в конфигурационном файле. Мне больше нравиться конфигурационный файл. так как проще переносить настройки при миграции на другой сервер.
Пытаюсь поднять свое облако согласно статье: https://geektimes.ru/post/294997
Вроде на последнем этапе перезапуска апача он перестает запускаться, утилита apache2ctl configtest говорит следующее:
Т.е. где-то тут ошибка:
Сам в этом разбираюсь чуть более, чем никак; с автором связывался – на что был получен ответ "я в китае, тут ГК не открывается, все должно работать".
Подскажите, что и где нужно подправить?