Публикация HTTP- и веб-сервисов 1С на IIS и Apache: от конфигуратора до первого запроса
Содержание
Чтобы опубликовать сервис 1С, нужны три вещи: модуль расширения веб-сервера из дистрибутива платформы, сам HTTP-сервис (или веб-сервис) в конфигурации и публикация базы через Администрирование → Публикация на веб-сервере в Конфигураторе, запущенном от имени администратора Windows. После этого сервис отвечает по адресу вида http://сервер/имя_публикации/hs/корневой_URL/шаблон.
Частое заблуждение — что достаточно «опубликовать базу», и сервис заработает сам. На деле публикация базы и публикация сервиса — разные галочки. Базу можно открыть в веб-клиенте, а запрос к сервису при этом вернёт 404, потому что HTTP-сервис не отмечен на своей вкладке.
Что подготовить на веб-сервере перед публикацией сервиса
Платформа 1С сама по себе не умеет принимать HTTP-запросы. Их принимает веб-сервер (IIS или Apache) и передаёт в 1С через модуль расширения.
Что нужно до начала работы:
- 🧩 Модуль расширения веб-сервера. При установке платформы выберите компонент «Модули расширения веб-сервера». Если платформа уже стоит, запустите установщик снова и выберите «Изменить».
- 🖥 Сам веб-сервер. IIS ставится как роль Windows Server, Apache — отдельным дистрибутивом. Поддерживаются Apache 2.2 и 2.4, на практике сейчас берут 2.4.
- 🔢 Совпадение разрядности. 64-битный Apache работает только с 64-битной платформой, 32-битный — с 32-битной. Для IIS разрядность задаётся в пуле приложений.
- 🌐 Сетевой доступ к базе. Для файловой базы — права на папку. Для клиент-серверной — доступ с веб-сервера к серверу 1С по портам 1540, 1541 и диапазону рабочих процессов.
Настройка IIS
В Диспетчере серверов → Добавить роли и компоненты включите роль «Веб-сервер (IIS)». В её составе, в группе «Разработка приложений», отметьте «Расширения ISAPI» и «Фильтры ISAPI». Без расширений ISAPI модуль 1С не загрузится.
Если на 64-битном сервере стоит 32-битная платформа, откройте пул приложений публикации и в дополнительных параметрах включите «Разрешить 32-разрядные приложения».
Для файловой базы выдайте группе IIS_IUSRS права на изменение каталога базы. Права на чтение нужны и к каталогу bin платформы.
Настройка Apache
Apache 2.4 под Windows ставится как служба. Проверьте, что он запускается без 1С и отдаёт стартовую страницу на http://localhost. Только после этого переходите к публикации — иначе потом не понять, кто виноват в ошибке.
Учётной записи, под которой работает служба Apache, нужны права на каталог файловой базы. По умолчанию это локальная системная учётная запись; в рабочей среде лучше завести отдельного пользователя.
Как создать HTTP-сервис в конфигураторе
HTTP-сервис — это объект конфигурации, ветка Общие → HTTP-сервисы. Если конфигурация типовая и на поддержке, не правьте её напрямую: добавьте сервис в расширение конфигурации
. Расширения поддерживают HTTP-сервисы, и типовую можно обновлять без объединения.
Порядок создания:
- В дереве конфигурации откройте
Общие → HTTP-сервисыи нажмите «Добавить». - Задайте Имя (латиницей или кириллицей — это имя объекта) и Корневой URL — только латиница, например
api. Именно корневой URL попадёт в адрес. - Выберите Повторное использование сеансов: «Не использовать», «Использовать» или «Автоматически».
- На вкладке «Шаблоны URL» добавьте шаблон, например
/items/{code}. Фигурные скобки — параметр, который придёт в обработчик. - Внутри шаблона добавьте методы:
GET,POSTи другие нужные. - В свойствах метода нажмите на значок лупы у поля «Обработчик» — платформа создаст функцию в модуле сервиса.
Сделайте отдельный шаблон /ping с методом GET, который просто возвращает 200 и строку ok. На нём удобно проверять публикацию, не трогая бизнес-логику.
Повторное использование сеансов
| Режим | Что происходит | Когда выбирать |
|---|---|---|
| Не использовать | На каждый запрос открывается и закрывается сеанс | Редкие запросы, простота |
| Использовать | Клиент обязан вернуть cookie сеанса, иначе ошибка | Свой клиент, который умеет хранить cookie |
| Автоматически | Сеансы берутся из пула на стороне веб-сервера | Частые запросы от внешних систем |
Открытие сеанса — самая дорогая часть короткого запроса. При десятках вызовов в минуту режим «Автоматически» заметно снижает время ответа.
Веб-сервис (SOAP) вместо HTTP-сервиса
Если внешняя система требует SOAP и WSDL, нужен объект Общие → Web-сервисы. Там задаются пространство имён, XDTO-пакеты и операции с типами параметров. WSDL после публикации доступен по адресу http://сервер/имя_публикации/ws/имя_сервиса?wsdl. Для новых интеграций обычно выбирают HTTP-сервис с JSON: он проще и легче отлаживается.
Код обработчика: как читать запрос и формировать ответ
Обработчик получает объект HTTPСервисЗапрос и обязан вернуть HTTPСервисОтвет. Ниже рабочий пример для шаблона /items/{code}: метод GET ищет элемент номенклатуры по коду и возвращает JSON.
Функция ItemsGET(Запрос)
Код = Запрос.ПараметрыURL.Получить("code");
Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);
Если Ссылка.Пустая() Тогда
Ответ = Новый HTTPСервисОтвет(404);
Ответ.УстановитьТелоИзСтроки("Элемент не найден", КодировкаТекста.UTF8);
Возврат Ответ;
КонецЕсли;
Данные = Новый Структура;
Данные.Вставить("code", Код);
Данные.Вставить("name", Ссылка.Наименование);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Текст = Запись.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Текст, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Для POST тело запроса читают так:
Функция ItemsPOST(Запрос)
Тело = Запрос.ПолучитьТелоКакСтроку();
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Тело);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Исключение
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоИзСтроки("Некорректный JSON", КодировкаТекста.UTF8);
Возврат Ответ;
КонецПопытки;
// Здесь обработка: Данные — структура с полями из JSON
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("ok", КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Где что лежит в запросе:
- 📍
Запрос.ПараметрыURL— параметры из фигурных скобок шаблона; - ❓
Запрос.ПараметрыЗапроса— всё, что после?в адресе; - 📨
Запрос.Заголовки— HTTP-заголовки; - 📦
Запрос.ПолучитьТелоКакСтроку()— тело запроса.
Возвращайте осмысленные коды: 400 на кривые данные, 404 на отсутствующий объект, 200 на успех. Если всё отдавать с кодом 200 и текстом ошибки внутри, внешняя система не поймёт, что запрос не прошёл.
Права доступа и аутентификация для сервиса 1С
Отдельного права «на HTTP-сервис» в роли нет. Обработчик выполняется от имени пользователя, который прошёл аутентификацию, и с его ролями. Если у него нет права чтения справочника, код упадёт с ошибкой нарушения прав, а клиент получит код 500.
Варианты аутентификации:
| Способ | Как работает | Плюсы и минусы |
|---|---|---|
| Basic | Клиент передаёт логин и пароль пользователя 1С в заголовке Authorization | Просто, но без HTTPS пароль идёт почти открытым текстом |
| Пользователь в публикации | Логин и пароль прописаны в строке соединения публикации | Клиенту не нужен пароль, но сервис открыт всем, кто знает адрес |
| Аутентификация ОС | Windows-аутентификация через IIS | Удобно внутри домена, неудобно для внешних систем |
Практика, которая себя оправдывает:
- Заведите отдельного пользователя, например
api_service, с логином латиницей. С кириллическими логинами в Basic-аутентификации часто бывают проблемы на стороне клиента. - Включите ему «Аутентификацию 1С:Предприятия» и задайте сложный пароль.
- Дайте только нужные роли. Не давайте «Полные права» сервисному пользователю.
- Если сервис смотрит наружу — включите HTTPS на веб-сервере. Сертификат настраивается средствами IIS или Apache, 1С здесь не участвует.
Когда сервису нужно прочитать данные, к которым у сервисного пользователя доступа нет, вынесите это чтение в общий модуль с флажком «Привилегированный». Так права остаются узкими, а нужная операция выполняется.
Ограничение доступа на уровне веб-сервера
Пароль пользователя 1С — не единственный замок. Если сервисом пользуется одна внешняя система, разрешите доступ к публикации только с её IP-адреса.
- 🔒 В Apache 2.4 это директива
Require ip 203.0.113.10в блоке<Directory>публикации вместоRequire all granted. - 🔒 В IIS — компонент «Ограничения IP-адресов и доменов» в роли веб-сервера.
- 🔒 Отдельная публикация только с HTTP-сервисами, без веб-клиента, уменьшает то, что видно снаружи.
Публикация базы и сервиса на веб-сервере
Публикация делается из Конфигуратора. Запускайте Конфигуратор от имени администратора, иначе он не сможет записать настройки IIS или файл httpd.conf.
Администрирование → Публикация на веб-сервере.trade. Оно станет частью адреса. Каталог — папка, куда запишется файл default.vrd.httpd.conf.После публикации в Apache в httpd.conf появятся строки примерно такого вида:
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.24.1586/bin/wsap24.dll"
Alias "/trade" "C:/inetpub/trade/"
<Directory "C:/inetpub/trade/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "C:/inetpub/trade/default.vrd"
</Directory>
Строка LoadModule содержит номер версии платформы. После обновления платформы путь указывает на старую версию. Её удаление ломает публикацию, поэтому после обновления переопубликуйте базу или поправьте путь вручную.
Файл default.vrd
В нём хранятся строка соединения и список опубликованных сервисов. Фрагмент для HTTP-сервиса:
<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="/trade"
ib="Srvr="srv1c";Ref="trade";">
<httpServices publishByDefault="false">
<service name="API" rootUrl="api" enable="true"
reuseSessions="autouse" sessionMaxAge="20"
poolSize="10" poolTimeout="5"/>
</httpServices>
</point>
publishByDefault="true" публикует все HTTP-сервисы конфигурации сразу. Удобно на тестовой базе, но на рабочей лучше перечислять сервисы явно.
Публикация на Linux
На Linux окно публикации в Конфигураторе тоже есть, но чаще пользуются утилитой webinst из каталога платформы:
sudo /opt/1cv8/x86_64/8.3.24.1586/webinst -publish -apache24 \
-wsdir trade -dir /var/www/trade \
-connstr "Srvr=srv1c;Ref=trade;" \
-confPath /etc/apache2/apache2.conf
После этого добавьте в default.vrd блок httpServices и перезапустите Apache: sudo systemctl restart apache2.
Перезапуск веб-сервера обрывает текущие подключения веб-клиента и запросы к сервисам. На рабочем сервере делайте это вне часов активной работы или предупредите пользователей.
Проверка первого запроса
Проверяйте с самого веб-сервера, чтобы исключить сеть и файрвол:
curl -i -u api_service:Пароль http://localhost/trade/hs/api/ping
Ключ -i покажет код ответа и заголовки. Ответ HTTP/1.1 200 OK и тело ok значат, что публикация работает. Дальше проверяйте адрес снаружи.
Ошибки при публикации сервиса 1С и как их найти
Сначала смотрите на код ответа: он почти всегда указывает на слой, где проблема.
hs, корневой URL и шаблон. Проверьте в default.vrd, что у сервиса стоит enable="true" или publishByDefault="true".httpd.conf указан путь к удалённой версии платформы. Запустите httpd -t — проверка покажет строку с ошибкой.Если журнал регистрации пуст, а клиент получает 500, ошибка возникла до входа в обработчик. Обычно это неверная строка соединения в default.vrd или проблема с правами на каталог.
Отладка обработчика
Код HTTP-сервиса можно отлаживать в Конфигураторе. В окне публикации есть флажок «Разрешить отладку». Затем в Конфигураторе включите автоматическое подключение к сеансам HTTP-сервисов через Отладка → Подключение и поставьте точку останова в обработчике. Следующий запрос остановится на ней.
Частые вопросы
Нужна ли отдельная лицензия для HTTP-сервиса?
Можно ли опубликовать сервис из расширения, не меняя типовую конфигурацию?
Как опубликовать несколько баз на одном веб-сервере?
/trade/hs/api и /buh/hs/api, конфликтов не возникнет.