Публикация веб-сервиса и HTTP-сервиса 1С на IIS и Apache

· 9 мин

Содержание

Разработчик написал 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 запрещён политикой компании.

IISApache 2.4
ОСWindows ServerWindows и Linux
УстановкаЧерез «Роли и компоненты»Отдельный дистрибутив
Что включитьISAPI-расширения и ISAPI-фильтрыМодуль расширения платформы для Apache 2.4
Подходит, еслиСервер уже на WindowsLinux или нужна единая схема с другими сайтами

Подготовка IIS

Откройте «Диспетчер серверов» → «Добавить роли и компоненты» → «Веб-сервер (IIS)». В «Разработке приложений» отметьте:

  • Расширения ISAPI;
  • Фильтры ISAPI;

Для веб-клиента этого достаточно. Для HTTP-сервисов дополнительно ничего ставить не нужно: они работают через тот же модуль.

Подготовка Apache

Установите Apache 2.4 и запомните путь к httpd.conf. Платформа допишет в него блок с подключением модуля при публикации. Перед правкой сделайте копию файла: ошибка в конфиге останавливает службу целиком.

Как создать HTTP-сервис в конфигураторе

Если сервис уже есть в вашей конфигурации (например, он входит в типовое решение), этот раздел можно пропустить. Для своего сервиса порядок такой.

  1. Откройте конфигуратор, в дереве метаданных найдите ветку «Общие» → «HTTP-сервисы», нажмите «Добавить».
  2. Задайте имя, например Обмен, и корневой URL — например exchange. Именно он попадёт в адрес после hs/.
  3. Внутри сервиса добавьте шаблон URL, скажем /orders/{Номер}. Фигурные скобки — параметр, его значение придёт в обработчик.
  4. К шаблону добавьте метод: выберите HTTP-метод (GET, POST и другие) и создайте обработчик.
  5. Напишите процедуру в модуле сервиса.

Минимальный обработчик GET, который возвращает номер из адреса:

Функция ЗаказыGET(Запрос)
	Номер = Запрос.ПараметрыURL["Номер"];
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
	Ответ.УстановитьТелоИзСтроки("Заказ " + Номер);
	Возврат Ответ;
КонецФункции

Параметры после знака вопроса (?дата=...) лежат в Запрос.ПараметрыЗапроса, а тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку(). Не забудьте сохранить конфигурацию и обновить конфигурацию базы данных (F7 в конфигураторе, затем «Принять»): публикация показывает то, что уже записано в базе.

Если вы создаёте веб-сервис SOAP, а не HTTP-сервис, то в свойствах укажите пространство имён и добавьте операции с обработчиками. Для SOAP это единственный шаг, где проще всего ошибиться: пространство имён должно совпадать с тем, что ждёт внешняя система.

Публикация на веб-сервере: два способа

Способ 1. Через конфигуратор

Это самый короткий путь.

  1. Откройте нужную базу в конфигураторе.
  2. В главном меню выберите Администрирование → Публикация на веб-сервере….
  3. В поле «Имя» введите короткое латинское имя, которое станет частью адреса: trade, buh. Кириллицу и пробелы не используйте.
  4. В поле «Веб-сервер» выберите IIS или Apache. Каталог заполнится сам; при желании укажите свой, например C:\inetpub\wwwroot\trade.
  5. Отметьте нужное: публикацию веб-сервисов, HTTP-сервисов, стандартного интерфейса OData, расширений конфигурации. Для веб-сервисов откроется список, где галочками выбирают конкретные сервисы.
  6. Нажмите «Опубликовать».

После этого платформа создаст в каталоге файл 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 открывает базу всем сканерам. Если сервис нужен только внутри сети, наружу его не выводите.

Проверка и отладка опубликованного сервиса

Проверяйте по нарастающей: сначала что отвечает веб-сервер, потом что отвечает платформа, потом что работает ваш обработчик.

Проверка после публикации
Выполнено: 0 / 5

Быстрые проверки

В адресной строке браузера для 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);
	Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
	Возврат Ответ;
КонецПопытки;

Типичные ошибки публикации и как их исправить

Сначала смотрите на код ответа. Он сужает поиск вдвое.

Диагностика: выберите симптом

Если не помогло

  • Остановите всё лишнее: снимите публикацию через webinst -delete и опубликуйте заново с чистого листа. Старый default.vrd перед этим сохраните: в нём могли быть ручные правки.
  • Перезапуск пула приложений IIS или службы Apache оборвёт все сеансы пользователей, которые идут через эту публикацию. Делайте это в нерабочее время.
  • Проверьте, что адрес не перехватывает другое приложение на том же сайте: одинаковые имена публикаций дают конфликт.

Если после правки default.vrd ничего не изменилось, сервер мог закешировать старое описание. Тогда перезапускайте пул приложений, предупредив пользователей.

Частые вопросы

Можно ли опубликовать веб-сервис без IIS и Apache?
Для внешнего доступа нужен один из этих веб-серверов. Для постоянной работы берите именно их.
Нужна ли отдельная лицензия для HTTP-сервиса?
Каждый открытый сеанс занимает лицензию сервера 1С. Включите повторное использование сеансов, тогда частые короткие запросы не расходуют лишних лицензий.
Чем отличается веб-сервис от HTTP-сервиса?
Веб-сервис — это SOAP с описанием WSDL, строгий формат. HTTP-сервис гибче: вы сами определяете адреса, методы и формат тела, чаще JSON.
Нужно ли публиковать заново после изменения конфигурации?
Если вы изменили только код обработчика, достаточно обновить конфигурацию БД. Переопубликовать нужно при добавлении нового сервиса: он должен появиться в default.vrd.
Как отключить публикацию?
Через Администрирование → Публикация на веб-сервере… нажмите «Отключить» либо выполните webinst -delete. Каталог публикации можно удалить вручную.
Можно ли опубликовать несколько баз на одном сервере?
Да. Дайте каждой своё имя публикации и свой каталог: trade, buh, zup.