Как вывести SOAP- и REST-сервисы 1С наружу через Apache или IIS

· 9 мин

Содержание

Чтобы опубликовать веб-сервис или HTTP-сервис 1С, нужны три вещи: веб-сервер (Apache 2.4 или IIS), установленный компонент платформы «Модули расширения веб-сервера» и публикация базы из Конфигуратора через Администрирование → Публикация на веб-сервере с флажками «Публиковать Web-сервисы» и «Публиковать HTTP-сервисы». После этого SOAP-сервис отвечает по адресу http://сервер/база/ws/..., а REST-сервис — по http://сервер/база/hs/....

Порядок одинаков для файловой и клиент-серверной базы 1С 8.3. Механизм общий для платформы: в Бухгалтерии, ЗУП и УТ шаги одинаковые, различаются только сами сервисы в конфигурации.

Что подготовить до публикации: веб-сервер и модули 1С

Публикацию делают на том компьютере, где стоит веб-сервер. База может лежать на другом сервере — веб-сервер обратится к ней по строке соединения.

Что должно быть на машине:

  • 🖥️ Веб-сервер. Apache 2.4 (Windows или Linux) или IIS (Windows Server 2016 и новее).
  • 🧩 Компонент платформы «Модули расширения веб-сервера». Ставится тем же установщиком платформы: при установке отметьте его в списке компонентов. Без него в Конфигураторе не будет кнопки публикации, а веб-сервер не сможет загрузить модуль 1С.
  • 🔢 Совпадение разрядности. 64-разрядный Apache работает только с модулем из 64-разрядной платформы. Для IIS с 32-разрядной платформой в пуле приложений включают «Разрешить 32-разрядные приложения».
  • 🔑 Права администратора Windows. Конфигуратор для публикации запускают «От имени администратора»: он пишет в httpd.conf или в настройки IIS и перезапускает службу.

Какой веб-сервер выбрать

Веб-серверКогда подходитНа что смотреть
Apache 2.4 (Windows)Быстрый старт, тестовый стенд, небольшой обменСлужба ставится командой httpd.exe -k install; модуль — wsap24.dll
Apache 2.4 (Linux)Серверы 1С на Linux, публикация в интернетМодуль wsap24.so, права пользователя www-data на каталог публикации
IISУже есть Windows Server с IIS, нужна доменная аутентификацияРоль «Расширения ISAPI», модуль wsisapi.dll, настройка пула приложений

Для IIS в диспетчере сервера добавьте роль «Веб-сервер (IIS)» и в компонентах разработки приложений отметьте «Расширения ISAPI». Без них публикация создастся, но запросы будут падать с ошибкой обработчика.

Как устроен SOAP веб-сервис в конфигураторе

Веб-сервис — объект метаданных в ветке Общие → Web-сервисы. Перед публикацией проверьте его свойства, от них зависит адрес и WSDL.

Что настраивают в веб-сервисе:

  1. Имя — латиницей, без пробелов. Оно попадёт в адрес.
  2. URI пространства имен — уникальная строка вида http://mycompany.ru/exchange. Клиент на другой стороне увидит её в WSDL.
  3. Пакеты XDTO — типы, которые принимают и возвращают операции. Для простых сервисов хватает пакета платформы с типами string, boolean, dateTime.
  4. Имя файла публикации — по умолчанию Имя.1cws.
  5. Операции — на каждой задают тип возвращаемого значения, параметры с направлением (входной, выходной) и имя процедуры в модуле сервиса.

Обработчик операции — обычная функция в модуле веб-сервиса:

Функция ПолучитьОстаток(КодТовара)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
	|	Номенклатура.Наименование КАК Наименование
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Код = &Код";
	Запрос.УстановитьПараметр("Код", КодТовара);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Наименование;
	КонецЕсли;
	Возврат "";
КонецФункции

Если вы правите типовую конфигурацию, добавляйте веб-сервис в расширение. Тогда обновления типовой не затрут вашу доработку. Для сервисов из расширений при публикации нужен отдельный флажок — о нём ниже.

После изменения веб-сервиса выполните «Обновить конфигурацию базы данных» (F7). Пока это не сделано, опубликованный адрес отдаёт старую версию WSDL или не отвечает вовсе.

Как создать HTTP-сервис (REST) и отладить его

HTTP-сервис живёт в ветке Общие → HTTP-сервисы. Он проще SOAP: никакого WSDL и XDTO, на вход приходит HTTP-запрос, на выход уходит HTTP-ответ. Формат тела — какой захотите, обычно JSON.

Из чего он состоит:

  • 🌐 Корневой URL — первая часть адреса после /hs/, например api.
  • 🧭 Шаблоны URL — пути с параметрами в фигурных скобках: /product/{code}.
  • ⚙️ Методы — у каждого шаблона свои методы (GET, POST, PUT, DELETE) и своя функция-обработчик.

В итоге адрес выглядит так: http://сервер/имя_публикации/hs/api/product/00-000123.

Обработчик принимает параметр Запрос и обязан вернуть объект HTTPСервисОтвет:

Функция ProductGet(Запрос)
	Код = Запрос.ПараметрыURL.Получить("code");

	Данные = Новый Структура("code, found", Код, Ложь);
	Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);
	Если ЗначениеЗаполнено(Ссылка) Тогда
		Данные.found = Истина;
		Данные.Вставить("name", Строка(Ссылка));
	КонецЕсли;

	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	ЗаписатьJSON(Запись, Данные);

	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
	Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
	Возврат Ответ;
КонецФункции

Тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку(), параметры после знака вопроса — через Запрос.ПараметрыЗапроса.

Отладка HTTP- и веб-сервисов

Точка останова в обработчике сама по себе не сработает: запрос выполняется в сеансе веб-сервера, а не в вашем клиенте. Порядок такой:

  1. В диалоге публикации включите отладку для публикации (в default.vrd появится элемент debug).
  2. В Конфигураторе откройте Отладка → Подключение и в автоматическом подключении отметьте «HTTP-сервисы» и «Web-сервисы».
  3. Поставьте точку останова и отправьте запрос из Postman или curl. Конфигуратор остановится на строке.

На рабочей публикации отладку держите выключенной. Остановленный в отладчике запрос висит, а клиент на той стороне получает таймаут.

Публикация на веб-сервере: Конфигуратор и webinst

Через Конфигуратор

  1. Запустите Конфигуратор от имени администратора и откройте базу.
  2. Меню Администрирование → Публикация на веб-сервере.
  3. Имя — короткое латинское имя публикации, например trade. Это часть адреса.
  4. Веб-сервер — выберите Apache 2.4 или IIS. Если выпадающий список пуст, модули расширения веб-сервера не установлены.
  5. Каталог — папка, куда ляжет default.vrd, например C:\inetpub\wwwroot\trade.
  6. Отметьте нужное:
    • «Публиковать тонкий клиент и веб-клиент» — если нужен веб-клиент; для чистого обмена можно снять;
    • «Публиковать Web-сервисы» и в списке ниже — конкретные сервисы;
    • «Публиковать HTTP-сервисы» и нужные сервисы в таблице;
    • «Публиковать HTTP-сервисы расширений по умолчанию» — если сервис лежит в расширении.
  7. Нажмите «Опубликовать». Конфигуратор предложит перезапустить веб-сервер — соглашайтесь.

Перезапуск Apache или IIS обрывает все текущие сеансы веб-клиента и обмена на этом сервере. Если публикация рабочая и ей пользуются, делайте это вне рабочего времени.

Через командную строку webinst

На сервере без графического Конфигуратора или в скриптах развёртывания публикуют утилитой webinst из каталога bin платформы:

webinst -publish -apache24 -wsdir trade -dir "C:\inetpub\wwwroot\trade" ^
  -connstr "Srvr=srv1c;Ref=trade;" -confPath "C:\Apache24\conf\httpd.conf"

Для IIS вместо -apache24 указывают -iis. Если default.vrd подготовлен заранее, его передают ключом -descriptor. Полный список ключей выводит сам webinst при запуске без параметров.

Что публикация пишет в конфигурацию Apache

После публикации в конце httpd.conf появится блок примерно такого вида:

LoadModule _1cws_module "C:/Program Files/1cv8/8.3.24.1467/bin/wsap24.dll"

# 1c publication
Alias "/trade" "C:/inetpub/wwwroot/trade/"
<Directory "C:/inetpub/wwwroot/trade/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "C:/inetpub/wwwroot/trade/default.vrd"
</Directory>

В строке LoadModule зашит номер версии платформы. После обновления платформы и удаления старой версии Apache перестаёт стартовать. Поправьте путь на новый каталог bin или опубликуйте базу заново из новой версии.

Файл default.vrd: тонкая настройка

default.vrd — XML с параметрами публикации. Его можно править руками, а затем перезапустить веб-сервер. Фрагмент для HTTP-сервиса:

<httpServices publishByDefault="false">
    <service name="API" rootUrl="api" enable="true"
             reuseSessions="autouse" sessionMaxAge="20"
             poolSize="10" poolTimeout="5"/>
</httpServices>

Атрибут reuseSessions включает повторное использование сеансов. Без него каждый запрос открывает и закрывает сеанс 1С — при частых вызовах это заметно замедляет ответ.

Права доступа и защита опубликованных сервисов

Здесь два уровня прав: операционной системы и самой 1С. Ошибка на любом из них даёт отказ.

Права на уровне ОС

  • 📁 Файловая база. Учётная запись, под которой работает веб-сервер, должна иметь чтение и запись на каталог базы. Для Apache в Windows это пользователь службы (по умолчанию LocalSystem; лучше завести отдельного), для IIS — удостоверение пула приложений. В Linux — пользователь www-data или тот, что указан в конфигурации Apache.
  • 📄 Каталог публикации. Веб-сервер должен читать default.vrd.
  • 🗄️ Клиент-серверная база . Права на файлы базы не нужны, нужен сетевой доступ к серверу 1С: порт агента 1540, менеджера кластера 1541 и диапазон портов рабочих процессов, который задан в свойствах рабочего сервера.

Пользователь 1С и аутентификация

Внешняя система входит в базу под пользователем 1С. Обычно — по Basic-аутентификации: логин и пароль в заголовке запроса.

Как сделать правильно:

  1. Заведите отдельного пользователя, например ExchangeApi. Латинский логин надёжнее: кириллицу в Basic-заголовке не все клиенты кодируют одинаково.
  2. Выдайте ему только роли, нужные обработчикам сервиса. Полные права не давайте.
  3. Отключите этому пользователю интерактивный вход, если конфигурация это позволяет: он нужен только для обмена.

Логин и пароль можно вписать прямо в строку соединения в default.vrd, и тогда сервис пустит любого без авторизации. Так делают только на закрытом внутреннем стенде. Для публикации в интернет это дыра: любой, кто знает адрес, работает с базой под этим пользователем.

Если сервис смотрит в интернет

  • 🔒 Включите HTTPS: сертификат на Apache через mod_ssl или привязку в IIS. Basic-аутентификация без шифрования передаёт пароль открытым текстом.
  • 🧱 Ограничьте доступ по IP-адресам партнёра на межсетевом экране или в конфигурации веб-сервера.
  • ✂️ Публикуйте только нужные сервисы. Снимите веб-клиент и OData, если они не используются.

Как проверить, что сервис доступен

Первая проверка — в браузере. WSDL веб-сервиса открывается по адресу:

http://сервер/trade/ws/ИмяСервиса?wsdl

Если вместо XML пришло окно авторизации — это нормально, введите пользователя 1С.

HTTP-сервис проверяйте через curl, чтобы видеть код ответа:

curl -i -u ExchangeApi:Pa55word http://srv-web/trade/hs/api/product/00-000123

Ключ -i показывает заголовки. Код 200 и JSON в теле — сервис работает. Для POST добавьте -X POST -H "Content-Type: application/json" -d "{\"code\":\"00-000123\"}".

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

Типичные проблемы, которые не видно в коде ответа

  • 🐢 Медленный первый запрос. Первый вызов после перезапуска открывает сеанс и загружает конфигурацию — это секунды. Дальше быстрее, если включено повторное использование сеансов.
  • 🔁 Обработчик вызвал исключение. Клиент получает 500, а подробности лежат в журнале регистрации базы. Отфильтруйте его по пользователю сервиса — увидите текст ошибки и строку модуля.
  • 🧾 Кракозябры в ответе. Не указан charset=utf-8 в заголовке Content-Type. Клиент читает тело в другой кодировке.
  • 🧩 Сервис из расширения не виден. Не отмечен флажок публикации HTTP-сервисов расширений по умолчанию, либо расширение не применено к базе. Проверьте его в списке расширений.
  • 🗂️ После переустановки Apache пропали публикации. Блоки из httpd.conf не переносятся сами. Сохраните конфигурацию заранее или опубликуйте базы заново.

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

Можно ли опубликовать веб-сервис без веб-клиента?
Да. В диалоге публикации снимите флажок тонкого клиента и веб-клиента, оставьте только Web-сервисы или HTTP-сервисы. Пользователи не смогут работать через браузер, а обмен будет работать.
Чем веб-сервис отличается от HTTP-сервиса в 1С?
Веб-сервис работает по SOAP: строгий контракт в WSDL, типы через XDTO. HTTP-сервис — свободный REST: вы сами задаёте адреса, методы и формат тела, обычно JSON. Для новых интеграций чаще выбирают HTTP-сервис.
Можно ли опубликовать одну базу несколько раз?
Да, под разными именами публикации и в разных каталогах. Например, одна публикация для веб-клиента сотрудников, другая — только с HTTP-сервисом для партнёра, со своими настройками доступа.
Нужен ли отдельный сервер для веб-сервера?
Нет, Apache или IIS можно поставить на сервер 1С. Отдельная машина нужна, если сервис открыт в интернет и вы хотите вынести его из внутренней сети.
Что делать после обновления платформы?
Проверьте путь к модулю в httpd.conf или в настройках IIS: он ссылается на каталог конкретной версии. Проще всего заново опубликовать базу из Конфигуратора новой версии.