Возникла необходимость взаимодействовать с 1C с мобильного клиента под Windows Phone 7/8. Самым простым способом взаимодействия показалось работа через web сервисы, поддерживаемые 1С.
С точки зрения публикации web сервиса особых сложностей нет. Шаги подробно описаны в статьях:
- http://habrahabr.ru/post/136684/
- http://howknow1c.ru/programmirovanie-1c/web-servisy-1s.html
- http://infostart.ru/public/86791/
- http://1cprogrammistu.ru/60-sozdanie-web-servisa-v-1s-predpriyatii.html
- http://www.basic.visual2000.ru/kolesov/pcmag/2006-1c/2006-05/web_1c.htm
- http://v8.1c.ru/overview/Term_000000286.htm
- http://1c-dn.com/forum/forum1/topic1184/
- http://fixin.com.ru/articles/1s_web_services/article.htm
- http://infostart.ru/public/327963/
Проблемы возникли с доступом к опубликованному web-сервису 1С. Под IIS 7.5 из под Windows 2008R2 после полудня танцев с бубном проблему решить не удалось. Были изучены статьи и ветки форумов:
- http://infostart.ru/public/75205/
- http://www.forum.mista.ru/topic.php?id=568905
- http://www.forum.mista.ru/topic.php?id=665708
- http://www.forum.mista.ru/topic.php?id=539933
- и т.д.
но счастье так и не наступило.
В результате решил, что стоит попробовать поднять web сервис на Apache, поскольку с ним у меня обычно все было несколько проще с настройкой. Итак, на другом порту (8080) на том-же сервере был поднят Apache 2.2.22. В 1С был создан ещё один web сервис и опубликован уже на Apache. С настройками по умолчанию он также не заработал. Разберем ошибки.
Web сервис был опубликован в 1С под именем wsApache.
Соответственно, в указанном при публикации каталоге появился файл default.vrd следующего содержания:
<? xml version = "1.0" encoding = "UTF-8" ?> base = "/wsApache" ib = "Srvr="s-1c-1-hw";Ref="TestDB";" enable = "false" > < ws > < point name = "Files" alias = "files.1cws" enable = "false" /> < point name = "Service" alias = "service.1cws" /> < point name = "ServiceIIS" alias = "serviceIIS.1cws" enable = "false" /> </ ws > </ point > |
В httpd.conf 1С добавила следующие строчки:
# 1c publication LoadModule _1cws_module "C:/Program Files (x86)/1cv82/8.2.17.153/bin/wsap22.dll" Alias "/ws" "C:/inetpub/wwwroot/ws/" < Directory "C:/inetpub/wwwroot/ws/"> AllowOverride All Options None Order allow,deny Allow from all SetHandler 1c-application ManagedApplicationDescriptor "C:/inetpub/wwwroot/ws/default.vrd" </ Directory > |
В целом, файлы/изменения создаваемые 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 выдаст сообщение вида:
1C:Enterprise 8 application error: HTTP: Not found Ошибка при работе с ресурсом /ws/service.1cws |
Правильный вариант:
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, то при правильной настройке должна появится страница с гиперссылкой на опубликованный сервис:
http://s-1c-1-hw:8080/wsApache/ws/Service
Авторизация пользователя при обращении к web сервису 1С
Если попытаться получить доступ к web сервису опубликованному под Apache не исправляя файл default.vrd, то появиться стандартный диалог авторизации:
В тестовой базе был заведен тестовый пользователь IUSR с полными правами с пустым паролем. Если ввести в диалог в качестве логина этого пользователя, то авторизация пройдет успешно и отобразиться либо XML файл, либо ссылка на него (см. выше).
Можно исключить запрос авторизационной информации вбив логин и пароль прямо в файл default.vrd, что, конечно, не рекомендуется с точки зрения безопасности, но иногда необходимо.
<? xml version = "1.0" encoding = "UTF-8" ?> base = "/wsApache" ib = "Srvr="s-1c-1-hw";Ref="TestDB";Usr="IUSR";Pwd="";" enable = "false" > < ws > < point name = "Files" alias = "files.1cws" enable = "false" /> < point name = "Service" alias = "service.1cws" /> < point name = "ServiceIIS" alias = "serviceIIS.1cws" enable = "false" /> </ ws > </ point > |
Это все. В моем случае каких-то дополнительных правок конфиг файлов не потребовалось.
В некоторых статьях указывалось, что нужно убрать из httpd.conf опцию «Options None«. У меня работает в обоих вариантах, т.е. когда строка присутствует и когда она удалена.
Публикация web сервиса 1С на IIS 7.5
Как уже упоминал выше, с публикацией web сервиса на IIS 7.5 с первого раза у меня не задалось, хотя тонкий клиент запускается без проблем. Поскольку пароль в конфигурационном файле по соображениям безопасности меня не устраивал, вернулся к вопросу настройки IIS. Был опубликован web сервис с именем wsIIS и именем сервиса ServiceIIS и alias-ом serviceIIS.1cws. Галка в чекбоксе «Использовать аутентификацию операционной системы на веб-сервере» для простоты эксперимента была снята.
Корректная ссылка в моем случае: http://s-1c-1-hw/wsIIS/ws/ServiceIIS?wsdl. При попытке зайти из Chrome/IE получаем ошибку возвращенную IIS:
Ошибка HTTP 401.2 — Unauthorized
дабы избавиться от ошибки правим web.config сформированный 1С следующим образом:
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < system.webServer > < handlers > < add name = "1C Web-service Extension" path = "*" verb = "*" modules = "IsapiModule" scriptProcessor = "C:\Program Files (x86)\1cv82\bin\wsisapi.dll" resourceType = "Unspecified" requireAccess = "None" /> </ handlers > < security > < authorization > < add accessType = "Allow" users = "*" /> </ authorization > </ security > </ system.webServer > </ configuration > |
Эта правка эквивалента изменению через консоль управления IIS для нашего опубликованного приложения с именем wsIIS правил авторизации пользователя.
Добавление тегов security в web.config или правка правил авторизации в консоли IIS приводит к тому, что при обращении к сервису по указанной выше ссылке появляется запрос на авторизацию. Вводим нашего тестового пользователя IUSR без пароля и получаем нужный XML файл в ответе сервера.
Прописав в default.vrd логин и пароль пользователя, как было указано выше для Apache, уберем окно авторизации и сервис будет всегда авторизовываться под указанным пользователем. Как проходит авторизация можно посмотреть в логах 1C. Но вариант с прописыванием пользователя в конфигурационный файл — не наш путь, ибо не секьюрно.
Изменим настройки авторизации пользователя (в IIS проверка подлинности), чтобы использовалась Windows авторизация. Сменить можно в консоли управления IIS, либо в конфигурационном файле. Мне больше нравиться конфигурационный файл. так как проще переносить настройки при миграции на другой сервер.
Поскольку изменения секции web.config <authentication> заблокированы на уровне IIS в файле
%windir%\system32\inetsrv\config\applicationHost.config
нужно зайти туда и сменить «Deny» на «Allow» для секции «authentication»:
< sectionGroup name = "authentication" > < section name = "anonymousAuthentication" overrideModeDefault = "Allow" /> < section name = "basicAuthentication" overrideModeDefault = "Allow" /> < section name = "clientCertificateMappingAuthentication" overrideModeDefault = "Deny" /> < section name = "digestAuthentication" overrideModeDefault = "Deny" /> < section name = "iisClientCertificateMappingAuthentication" overrideModeDefault = "Deny" /> < section name = "windowsAuthentication" overrideModeDefault = "Allow" /> </ sectionGroup > |
после чего РАБОЧИЙ web.config для опубликованного web сервиса 1С будет выглядеть следующим образом:
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < system.webServer > < handlers > < add name = "1C Web-service Extension" path = "*" verb = "*" modules = "IsapiModule" scriptProcessor = "C:\Program Files (x86)\1cv82\bin\wsisapi.dll" resourceType = "Unspecified" requireAccess = "None" /> </ handlers > < security > < authorization > < add accessType = "Allow" users = "*" /> </ authorization > < authentication > < windowsAuthentication enabled = "true" useKernelMode = "true" > < providers > < clear /> < add value = "Negotiate" /> < add value = "NTLM" /> </ providers > < extendedProtection tokenChecking = "Allow" /> </ windowsAuthentication > < basicAuthentication enabled = "false" /> < anonymousAuthentication enabled = "false" /> </ authentication > </ security > </ system.webServer > </ configuration > |
Эквивалент последней выполненной операции (настройка <authentication>) — публикация сервиса с включенной галкой в чекбоксе «Использовать аутентификацию операционной системы на веб-сервере». 1С при публикации меняет эту настройку не в web.config, а в настройках IIS через API. В любом случае изменения должны быть видны в консоли управления IIS:
На всякий случай для проверки настроек при публикации web сервиса имеет смысл в консоли управления IIS зайти в следующие разделы:
После указанной выше настройки web.config, удаляем жестко прописанные логин и пароль из файла default.vrd. На всякий случай перегружаем IIS. Если для доменных пользователей прописаны корректные соответствия в учетных записях 1С, то авторизация пройдет прозрачно под доменными учетными записями, в чем можно будет убедиться посмотрев в логах авторизации 1С.
приводится ряд ошибок IIS (и способы их устранения) которые с высокой вероятностью могут возникнуть при публикации web сервиса 1С на IIS.
Доступ из Visual Studio 2012
Как подробно описано в статье на хабре, чтобы добавить ссылку на опубликованный web сервис 1С в Visual Studio для разработки клиента необходимо создать приложение (например, консольное), кликнуть правой кнопкой мышки на solution и выбрать пункт «Add Service Reference…». Следует обратить внимание на точное указание ссылки непосредственно на WSDL описание, т.е. без указания суффикса ?wsdl Visual Studio ничего не обнаружит.
Далее разрабатываем обычный клиент для web сервиса.
Удачи!!!
2 Responses to Нюансы настройки публикации web-сервиса 1С 8.2 в Apache и IIS