Как вывести SOAP- и REST-сервисы 1С наружу через Apache или IIS
Содержание
Чтобы опубликовать веб-сервис или 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.
Что настраивают в веб-сервисе:
- Имя — латиницей, без пробелов. Оно попадёт в адрес.
- URI пространства имен — уникальная строка вида
http://mycompany.ru/exchange. Клиент на другой стороне увидит её в WSDL. - Пакеты XDTO — типы, которые принимают и возвращают операции. Для простых сервисов хватает пакета платформы с типами
string,boolean,dateTime. - Имя файла публикации — по умолчанию
Имя.1cws. - Операции — на каждой задают тип возвращаемого значения, параметры с направлением (входной, выходной) и имя процедуры в модуле сервиса.
Обработчик операции — обычная функция в модуле веб-сервиса:
Функция ПолучитьОстаток(КодТовара)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 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- и веб-сервисов
Точка останова в обработчике сама по себе не сработает: запрос выполняется в сеансе веб-сервера, а не в вашем клиенте. Порядок такой:
- В диалоге публикации включите отладку для публикации (в
default.vrdпоявится элементdebug). - В Конфигураторе откройте
Отладка → Подключениеи в автоматическом подключении отметьте «HTTP-сервисы» и «Web-сервисы». - Поставьте точку останова и отправьте запрос из Postman или
curl. Конфигуратор остановится на строке.
На рабочей публикации отладку держите выключенной. Остановленный в отладчике запрос висит, а клиент на той стороне получает таймаут.
Публикация на веб-сервере: Конфигуратор и webinst
Через Конфигуратор
- Запустите Конфигуратор от имени администратора и откройте базу.
- Меню
Администрирование → Публикация на веб-сервере. - Имя — короткое латинское имя публикации, например
trade. Это часть адреса. - Веб-сервер — выберите Apache 2.4 или IIS. Если выпадающий список пуст, модули расширения веб-сервера не установлены.
- Каталог — папка, куда ляжет
default.vrd, напримерC:\inetpub\wwwroot\trade. - Отметьте нужное:
- «Публиковать тонкий клиент и веб-клиент» — если нужен веб-клиент; для чистого обмена можно снять;
- «Публиковать Web-сервисы» и в списке ниже — конкретные сервисы;
- «Публиковать HTTP-сервисы» и нужные сервисы в таблице;
- «Публиковать HTTP-сервисы расширений по умолчанию» — если сервис лежит в расширении.
- Нажмите «Опубликовать». Конфигуратор предложит перезапустить веб-сервер — соглашайтесь.
Перезапуск 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-аутентификации: логин и пароль в заголовке запроса.
Как сделать правильно:
- Заведите отдельного пользователя, например
ExchangeApi. Латинский логин надёжнее: кириллицу в Basic-заголовке не все клиенты кодируют одинаково. - Выдайте ему только роли, нужные обработчикам сервиса. Полные права не давайте.
- Отключите этому пользователю интерактивный вход, если конфигурация это позволяет: он нужен только для обмена.
Логин и пароль можно вписать прямо в строку соединения в 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не переносятся сами. Сохраните конфигурацию заранее или опубликуйте базы заново.
Частые вопросы
Можно ли опубликовать веб-сервис без веб-клиента?
Чем веб-сервис отличается от HTTP-сервиса в 1С?
Можно ли опубликовать одну базу несколько раз?
Нужен ли отдельный сервер для веб-сервера?
Что делать после обновления платформы?
httpd.conf или в настройках IIS: он ссылается на каталог конкретной версии. Проще всего заново опубликовать базу из Конфигуратора новой версии.