При публикации веб-сервисов 1С:Предприятия на веб-сервере Apache разработчики часто сталкиваются с ситуацией, когда публикация завершена без явных ошибок, но при попытке открыть WSDL-описание сервиса по ссылке вида http://localhost/testService/ws/testService.1cws?wsdl браузер выдает ошибку 404 Not Found. При этом прямое обращение к файлу дескриптора http://localhost/testService/default.vrd отображает его XML-содержимое или инициирует скачивание файла.
Разберем по шагам, почему возникает эта проблема, как функционирует связка Apache и платформы 1С и как правильно настроить публикацию веб-сервиса.
Для корректной обработки запросов к базам 1С веб-сервер Apache использует специальный модуль расширения платформы (для Apache 2.2 это библиотека wsap22.dll, для Apache 2.4 — wsap24.dll). Когда модуль загружен и настроен обработчик SetHandler 1c-application, все запросы к виртуальному каталогу публикации передаются на исполнение платформе 1С.
Если при прямом обращении к default.vrd в браузере отображается XML-структура файла, это главный признак того, что веб-сервер Apache работает с каталогом как с обычной папкой статических файлов, а модуль 1С не перехватывает и не обрабатывает входящие запросы. Из-за этого запросы к виртуальным точкам входа вроде /ws/testService.1cws?wsdl не находят физического файла на диске и возвращают ошибку Not Found.
Рассмотрим файл конфигурации веб-сервера httpd.conf. В нем должны присутствовать две обязательные составляющие:
LoadModule, расположенная в глобальной секции конфигурации.<Directory>.Проверим наличие строки загрузки модуля в httpd.conf:
# Загрузка модуля интеграции с 1С:Предприятием
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.XX.XXXX/bin/wsap22.dll"
Затем убедимся в корректности описания виртуального каталога:
# 1c publication
Alias "/testService" "C:/server/www/testService/"
<Directory "C:/server/www/testService/">
AllowOverride All
Options None
Order allow,deny
Allow from all
SetHandler 1c-application
ManagedApplicationDescriptor "C:/server/www/testService/default.vrd"
</Directory>
Обратим внимание на следующие критические моменты:
wsap22.dll. 32-разрядный Apache не сможет загрузить модуль из каталога 64-битной платформы 1С.httpd.conf, а также автоматическая публикация из конфигуратора 1С требуют обязательного перезапуска службы Apache (Restart), иначе новые обработчики не вступят в силу.Проанализируем файл дескриптора default.vrd, расположенный в каталоге публикации. В нем объявляются точки входа для веб-сервисов и параметры подключения к информационной базе:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/testService"
ib="File="C:\1c_Base\mobile_base";"
enableStandardOData="true">
<httpServices publishByDefault="false"/>
<ws>
<point name="testService"
alias="testService.1cws"
enable="true"/>
</ws>
</point>
Разберем важные параметры дескриптора:
ib содержит параметры строки соединения. Внутренние двойные кавычки пути к базе данных должны быть обязательно экранированы как ". Нарушение XML-синтаксиса приводит к невозможности чтения дескриптора модулем 1С.name, атрибут alias и имя в URL браузера должны строго совпадать с учетом регистра символов.enable для целевого сервиса должен иметь значение "true".Служба Apache в операционной системе Windows по умолчанию запускается от имени системной учетной записи SYSTEM (или LOCAL SYSTEM). Для корректного запуска сеанса 1С и генерации WSDL этой учетной записи необходимы права на следующие ресурсы:
C:\1c_Base\mobile_base).default.vrd в папке веб-сервера.TEMP/TMP для создания служебных файлов блокировок и кэша сеансов 1С.Важное замечание: если файловая информационная база расположена на сетевом диске или в сетевой shared-папке, стандартная локальная учетная запись SYSTEM не сможет получить к ней доступ по сети. В таком случае службу Apache необходимо перевести на запуск от имени доменного или выделенного локального пользователя, обладающего сетевыми правами к указанному ресурсу.
Если веб-сервер настроен верно, но WSDL не отдается, убедимся в корректности метаданных в конфигураторе 1С:
Веб-сервис обязательно должно быть заполнено свойство URI пространства имен (Namespace URI).LoadModule в файле httpd.conf.http://localhost/testService/ws/testService.1cws?wsdl.