Публикация веб-сервиса и HTTP-сервиса 1С на IIS и Apache
Содержание
Разработчик написал HTTP-сервис, в конфигураторе всё собирается, а снаружи адрес отвечает ошибкой 404. Так бывает почти всегда: сервис в конфигурации ещё не значит сервис в сети. Чтобы внешняя система могла обратиться к базе, нужно опубликовать веб-сервис 1С на веб-сервере — IIS или Apache.
Публикация делает три вещи: создаёт на диске каталог с файлом default.vrd, подключает к веб-серверу модуль расширения от платформы и связывает адрес в браузере с конкретной информационной базой. Всё это работает на платформе 8.3 с интерфейсом «Такси» одинаково для файловой и клиент-серверной базы.
Ниже — порядок действий от подготовки сервера до проверки готового адреса.
Что понадобится до публикации
Сначала определитесь, что именно вы публикуете. Под словом «веб-сервис» в 1С скрываются разные вещи, и публикуются они в одном окне, но с разными галочками.
| Что публикуем | Где создаётся | Адрес после публикации |
|---|---|---|
| SOAP веб-сервис | Конфигурация → Общие → Веб-сервисы | http://сервер/база/ws/ИмяСервиса?wsdl |
| HTTP-сервис | Конфигурация → Общие → HTTP-сервисы | http://сервер/база/hs/КорневойURL/шаблон |
| Стандартный интерфейс OData | Включается при публикации | http://сервер/база/odata/standard.odata |
Проверьте по списку:
- ✅ Веб-сервер установлен: IIS на Windows Server 2016 и новее либо Apache 2.4.
- ✅ При установке платформы был отмечен компонент «Модули расширения веб-серверов». Иначе публиковать будет нечем.
- ✅ Разрядность модуля совпадает с разрядностью платформы и пула приложений IIS (чаще всего 64 бита).
- ✅ Есть учётная запись, под которой веб-сервер подключается к базе, и она имеет доступ к каталогу базы или к серверу 1С.
- ✅ Конфигуратор запущен от имени администратора Windows. Без этого каталог публикации не создастся.
Для клиент-серверной базы веб-сервер и сервер 1С обычно стоят на разных машинах или хотя бы в разных службах. Веб-сервер подключается к кластеру по строке соединения, например Srvr="srv1c";Ref="trade";.
Выбор веб-сервера: IIS или Apache
Для Windows почти всегда берут IIS: он уже есть в системе, а модуль платформы с ним дружит из коробки. Apache нужен, когда сервер на Linux или когда IIS запрещён политикой компании.
| IIS | Apache 2.4 | |
|---|---|---|
| ОС | Windows Server | Windows и Linux |
| Установка | Через «Роли и компоненты» | Отдельный дистрибутив |
| Что включить | ISAPI-расширения и ISAPI-фильтры | Модуль расширения платформы для Apache 2.4 |
| Подходит, если | Сервер уже на Windows | Linux или нужна единая схема с другими сайтами |
Подготовка IIS
Откройте «Диспетчер серверов» → «Добавить роли и компоненты» → «Веб-сервер (IIS)». В «Разработке приложений» отметьте:
Расширения ISAPI;Фильтры ISAPI;
Для веб-клиента этого достаточно. Для HTTP-сервисов дополнительно ничего ставить не нужно: они работают через тот же модуль.
Подготовка Apache
Установите Apache 2.4 и запомните путь к httpd.conf. Платформа допишет в него блок с подключением модуля при публикации. Перед правкой сделайте копию файла: ошибка в конфиге останавливает службу целиком.
Как создать HTTP-сервис в конфигураторе
Если сервис уже есть в вашей конфигурации (например, он входит в типовое решение), этот раздел можно пропустить. Для своего сервиса порядок такой.
- Откройте конфигуратор, в дереве метаданных найдите ветку «Общие» → «HTTP-сервисы», нажмите «Добавить».
- Задайте имя, например
Обмен, и корневой URL — напримерexchange. Именно он попадёт в адрес послеhs/. - Внутри сервиса добавьте шаблон URL, скажем
/orders/{Номер}. Фигурные скобки — параметр, его значение придёт в обработчик. - К шаблону добавьте метод: выберите HTTP-метод (
GET,POSTи другие) и создайте обработчик. - Напишите процедуру в модуле сервиса.
Минимальный обработчик GET, который возвращает номер из адреса:
Функция ЗаказыGET(Запрос)
Номер = Запрос.ПараметрыURL["Номер"];
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("Заказ " + Номер);
Возврат Ответ;
КонецФункции
Параметры после знака вопроса (?дата=...) лежат в Запрос.ПараметрыЗапроса, а тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку(). Не забудьте сохранить конфигурацию и обновить конфигурацию
базы данных (F7 в конфигураторе, затем «Принять»): публикация показывает то, что уже записано в базе.
Если вы создаёте веб-сервис SOAP, а не HTTP-сервис, то в свойствах укажите пространство имён и добавьте операции с обработчиками. Для SOAP это единственный шаг, где проще всего ошибиться: пространство имён должно совпадать с тем, что ждёт внешняя система.
Публикация на веб-сервере: два способа
Способ 1. Через конфигуратор
Это самый короткий путь.
- Откройте нужную базу в конфигураторе.
- В главном меню выберите
Администрирование→Публикация на веб-сервере…. - В поле «Имя» введите короткое латинское имя, которое станет частью адреса:
trade,buh. Кириллицу и пробелы не используйте. - В поле «Веб-сервер» выберите IIS или Apache. Каталог заполнится сам; при желании укажите свой, например
C:\inetpub\wwwroot\trade. - Отметьте нужное: публикацию веб-сервисов, HTTP-сервисов, стандартного интерфейса OData, расширений конфигурации. Для веб-сервисов откроется список, где галочками выбирают конкретные сервисы.
- Нажмите «Опубликовать».
После этого платформа создаст в каталоге файл default.vrd, а в IIS — приложение с тем же именем. Проверьте в диспетчере IIS, что приложение появилось под сайтом по умолчанию.
Способ 2. Через командную строку
Подходит для скриптов и серверов без графической оболочки. Утилита webinst лежит в каталоге bin платформы:
webinst -publish -iis -wsdir trade -dir C:\inetpub\wwwroot\trade -connstr "Srvr=srv1c;Ref=trade;"
Для Apache вместо -iis указывают -apache24 и путь к конфигу: -confpath "C:\Apache24\conf\httpd.conf". Снять публикацию можно ключом -delete с теми же именем и каталогом. Полный список параметров смотрите в справке платформы по webinst: набор ключей зависит от версии.
Что внутри default.vrd
Файл default.vrd — это описание публикации в XML. Через него тонко настраивают то, что окно конфигуратора не показывает. Фрагмент для HTTP-сервиса и веб-сервиса:
<httpServices publishByDefault="false">
<service name="Обмен" rootUrl="exchange" enable="true"
reuseSessions="autouse" sessionMaxAge="20"/>
</httpServices>
<ws publishByDefault="false">
<point name="ВебСервисЗаказов" enable="true"/>
</ws>
Здесь важны три вещи:
publishByDefault="false"— по умолчанию ничего не публиковать, включаете только перечисленное. Это безопаснее, чем открывать всё сразу.enable="true"— без него адрес вернёт 404, даже если сервис есть в конфигурации.reuseSessions="autouse"иsessionMaxAge— повторное использование сеансов (в секундах).
Последнее экономит лицензии и время: без него каждый запрос открывает новый сеанс и занимает лицензию, а при частых вызовах это быстро кончается ошибкой лицензирования.
Права доступа и безопасность
Здесь ошибаются чаще всего: публикуют «как работает» и забывают закрыть.
Права на каталоги
Пул приложений IIS работает под своей учётной записью. Ей нужны:
- чтение и выполнение в каталоге публикации и в каталоге
binплатформы; - запись во временный каталог, который использует платформа;
- для файловой базы — полный доступ к каталогу базы (файл
1Cv8.1CDи служебные файлы рядом).
Если этих прав нет, веб-сервер отвечает ошибкой 500 без внятного текста. Для клиент-серверной варианта права на базу не нужны, достаточно сетевого доступа к серверу 1С.
Пользователь, под которым идёт обращение
Внешняя система должна приходить под обычным пользователем 1С, а не под администратором. Создайте отдельного пользователя, дайте ему роль, где разрешено ровно то, что делает сервис. Если сервис читает заказы, права на запись ему не нужны.
В запросе передавайте логин и пароль через заголовок Basic-аутентификации. Подробности настройки аутентификации в default.vrd зависят от схемы: можно оставить аутентификацию 1С либо использовать аутентификацию ОС. Выбирайте одну и проверяйте на тестовой базе.
Что ещё стоит сделать
- 🔒 Отдайте сервис по HTTPS. Пароль в Basic-аутентификации передаётся без шифрования, по HTTP его видно в сети.
- 🔒 Ограничьте доступ по IP на уровне веб-сервера или фаервола, если клиент известен заранее.
- 🔒 Не публикуйте на внешний адрес базу целиком вместе с веб-клиентом, если нужен только один сервис. Для интеграции заведите отдельную публикацию с отключённым веб-клиентом.
- 🔒 Не храните пароль интеграционного пользователя в коде сторонней системы открытым текстом.
Публикация в интернет без HTTPS и без ограничений по IP открывает базу всем сканерам. Если сервис нужен только внутри сети, наружу его не выводите.
Проверка и отладка опубликованного сервиса
Проверяйте по нарастающей: сначала что отвечает веб-сервер, потом что отвечает платформа, потом что работает ваш обработчик.
Быстрые проверки
В адресной строке браузера для SOAP:
http://сервер/trade/ws/ВебСервисЗаказов?wsdl
Должен открыться XML с описанием операций. Если открылся — публикация и веб-сервис живы.
Для HTTP-сервиса удобнее curl:
curl -u Интеграция:Пароль "http://сервер/trade/hs/exchange/orders/15"
Ответ Заказ 15 говорит, что связка «адрес → шаблон → обработчик» собрана верно. Для POST добавьте -X POST -d @файл.json -H "Content-Type: application/json". Если удобнее графический клиент, подойдёт Postman: те же адрес, метод и заголовок Authorization.
Как найти ошибку внутри обработчика
- Запустите базу в конфигураторе и поставьте точку останова в обработчике. Отладка HTTP-сервисов подключается к работающему приложению: в меню «Отладка» → «Подключение» отметьте нужное.
- Пишите в журнал регистрации события из обработчика через
ЗаписьЖурналаРегистрации. Это работает без отладчика и видно на боевой базе. - Оборачивайте код в
Попытка … Исключениеи возвращайте статус 400 или 500 с текстом ошибки, а не пустой ответ.
Тело ошибки в таком случае сразу объясняет клиенту, что не так:
Попытка
// основная логика
Исключение
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
Возврат Ответ;
КонецПопытки;
Типичные ошибки публикации и как их исправить
Сначала смотрите на код ответа. Он сужает поиск вдвое.
default.vrd у сервиса нет enable="true" или опечатка в корневом URL. Проверьте регистр и имя после hs/ и ws/. Сервис ещё и должен быть записан в базу: обновите конфигурацию БД.bin платформы. Выдайте права, перезапустите приложение. Если ошибка в обработчике, текст виден в журнале регистрации и при отладке.reuseSessions="autouse" и задайте разумный sessionMaxAge.Если не помогло
- Остановите всё лишнее: снимите публикацию через
webinst -deleteи опубликуйте заново с чистого листа. Старыйdefault.vrdперед этим сохраните: в нём могли быть ручные правки. - Перезапуск пула приложений IIS или службы Apache оборвёт все сеансы пользователей, которые идут через эту публикацию. Делайте это в нерабочее время.
- Проверьте, что адрес не перехватывает другое приложение на том же сайте: одинаковые имена публикаций дают конфликт.
Если после правки default.vrd ничего не изменилось, сервер мог закешировать старое описание. Тогда перезапускайте пул приложений, предупредив пользователей.
Частые вопросы
Можно ли опубликовать веб-сервис без IIS и Apache?
Нужна ли отдельная лицензия для HTTP-сервиса?
Чем отличается веб-сервис от HTTP-сервиса?
Нужно ли публиковать заново после изменения конфигурации?
default.vrd.Как отключить публикацию?
Администрирование → Публикация на веб-сервере… нажмите «Отключить» либо выполните webinst -delete. Каталог публикации можно удалить вручную.Можно ли опубликовать несколько баз на одном сервере?
trade, buh, zup.