Проверка HTTP-сервиса 1С в браузере: от публикации до ответа JSON
Содержание
Чтобы вызвать HTTP-сервис 1С из браузера, наберите в адресной строке http://<сервер>/<имя публикации>/hs/<корневой URL сервиса>/<шаблон>. Например: http://srv01/trade/hs/api/v1/ping. Браузер отправит GET-запрос, спросит логин и пароль пользователя информационной базы и покажет ответ, который вернул модуль сервиса.
Так работает только GET. Для POST, PUT и DELETE адресной строки мало: нужен fetch() в консоли разработчика, Postman или curl. И ещё одно условие: база должна быть опубликована на веб-сервере с включёнными HTTP-сервисами, иначе браузер получит 404 ещё до того, как запрос дойдёт до 1С. HTTP-сервисы есть в платформе 8.3, начиная с 8.3.5.
Из чего состоит адрес HTTP-сервиса
Адрес собирается из четырёх частей. Каждая берётся из своего места: две из настроек веб-сервера, две из конфигурации.
| Часть адреса | Пример | Где задаётся |
|---|---|---|
| Сервер и порт | http://srv01:8080 | Веб-сервер (Apache, IIS) |
| Имя публикации | /trade | Диалог публикации в Конфигураторе или webinst |
Префикс hs | /hs | Платформа, всегда одинаковый |
| Корневой URL сервиса | /api | Свойство «Корневой URL» объекта HTTP-сервис |
| Шаблон URL | /v1/ping, /orders/{id} | Шаблоны URL внутри сервиса |
Префикс hs путают чаще всего. Его не пишут ни в конфигурации, ни в публикации, но без него адрес не работает
. Для веб-сервисов SOAP префикс другой — ws, для OData — odata/standard.odata.
Шаблон может содержать параметры в фигурных скобках. Шаблон /orders/{id} примет и /orders/125, и /orders/А-0007. Значение {id} модуль получит отдельно, без разбора строки.
💡 Корневой URL и шаблоны чувствительны к написанию. Если в конфигурации корневой URL API, адрес .../hs/api/... может не найти сервис. Копируйте значения из свойств объекта, а не набирайте по памяти.
Из браузера параметры строки запроса передают после ?: http://srv01/trade/hs/api/v1/orders?date=2026-10-01&limit=50. Кириллицу в адресе браузер сам переведёт в процентную кодировку. В curl и скриптах это нужно делать вручную.
Публикация базы, без которой браузер ничего не увидит
HTTP-сервис отвечает только через веб-сервер. На машине с веб-сервером должна стоять платформа 1С с компонентом «Модули расширения веб-сервера». Разрядность модуля должна совпадать с разрядностью Apache или пула IIS.
Публикация из Конфигуратора
- Запустите Конфигуратор от имени администратора Windows. Без этого публикация на IIS и запись в
httpd.confApache не пройдут. - Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации (оно станет частью адреса), веб-сервер и каталог публикации.
- Перейдите на вкладку HTTP-сервисов. Отметьте флажок публикации HTTP-сервисов по умолчанию или отметьте нужные сервисы по одному.
- Нажмите «Опубликовать». Для Apache после этого перезапустите службу веб-сервера.
Перезапуск Apache или пула IIS обрывает все веб-сеансы этой публикации и соседних. Если через веб-клиент уже кто-то работает, делайте это вне рабочего времени.
Публикация утилитой webinst
На сервере без графического интерфейса базу публикуют утилитой webinst из каталога bin платформы. Пример для Apache 2.4 и серверной базы:
"C:\Program Files\1cv8\8.3.24.1586\bin\webinst.exe" -publish -apache24 -wsdir trade -dir "C:\Apache24\htdocs\trade" -connstr "Srvr=srv01;Ref=trade;" -confpath "C:\Apache24\conf\httpd.conf"
Номер версии в пути подставьте свой. Список ключей для вашей версии выводит запуск webinst без параметров.
Что должно быть в default.vrd
В каталоге публикации появится файл default.vrd. За HTTP-сервисы в нём отвечает элемент httpServices:
<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="srv01";Ref="trade";">
<httpServices publishByDefault="true"/>
</point>
Если атрибут publishByDefault="false" и нет отдельных строк service, сервисы не опубликованы. Браузер получит 404, хотя веб-клиент по той же публикации открывается.
Авторизация: как браузер передаёт логин и пароль
HTTP-сервис выполняется в сеансе пользователя информационной базы. Значит, 1С должна понять, от чьего имени работать. Вариантов три.
- 🔐 Basic-аутентификация. Основной способ. Браузер показывает своё окно входа, вы вводите имя и пароль пользователя 1С. До закрытия браузера он запоминает их и подставляет в следующие запросы к этому адресу.
- 🪟 Аутентификация операционной системы. Работает на IIS с включённой проверкой Windows и при пользователе 1С, связанном с доменной учётной записью. Браузер в домене войдёт без окна логина.
- 👤 Пользователь в строке подключения. В атрибут
ibфайлаdefault.vrdдобавляютUsr=иPwd=. Тогда любой запрос выполняется от этого пользователя без запроса пароля.
Третий способ открывает сервис всем, кто знает адрес. Используйте его только для отдельного пользователя с ролью, где нет ничего, кроме доступа к этому сервису. Пароль лежит в default.vrd открытым текстом — закройте каталог публикации от чтения посторонними.
Адрес вида http://user:pass@srv01/... современные браузеры либо блокируют, либо показывают предупреждение. Не используйте его даже для теста: адрес с паролем остаётся в истории и журналах прокси.
Безопасность канала
Basic-аутентификация передаёт пароль в кодировке Base64, это не шифрование. Любой, кто видит трафик, прочитает пароль. Для доступа снаружи локальной сети:
- Включите HTTPS на веб-сервере (сертификат от доверенного центра или внутреннего УЦ).
- Закройте порт 80 или настройте перенаправление на 443.
- Дайте пользователю сервиса минимальную роль: только права, которые нужны обработчику.
- Ограничьте доступ к публикации по IP средствами Apache или IIS, если клиенты известны.
У каждого пользователя 1С в карточке есть флажок «Аутентификация 1С:Предприятия». Если он снят и не включена аутентификация ОС, войти в сервис не получится даже с верным паролем.
Как модуль сервиса читает параметры и формирует ответ
Обработчик метода — функция модуля HTTP-сервиса. Она получает объект HTTPСервисЗапрос и обязана вернуть HTTPСервисОтвет. Пример для шаблона /orders/{id} и запроса .../hs/api/orders/125?format=short:
Функция ЗаказыGET(Запрос)
// Параметр из шаблона URL: {id}
НомерСтрокой = Запрос.ПараметрыURL.Получить("id");
// Параметр строки запроса: ?format=short
Формат = Запрос.ПараметрыЗапроса.Получить("format");
Данные = Новый Структура;
Данные.Вставить("id", НомерСтрокой);
Данные.Вставить("format", ?(Формат = Неопределено, "full", Формат));
Данные.Вставить("method", Запрос.HTTPМетод);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Браузер покажет {"id": "125", "format": "short", "method": "GET"} — с форматированием или в одну строку, в зависимости от браузера.
Что откуда берётся:
| Что нужно | Свойство или метод | Тип результата |
|---|---|---|
Параметр из шаблона {id} | Запрос.ПараметрыURL.Получить("id") | Строка |
Параметр после ? | Запрос.ПараметрыЗапроса.Получить("format") | Строка или Неопределено |
| Тело POST-запроса | Запрос.ПолучитьТелоКакСтроку() | Строка |
| Заголовок запроса | Запрос.Заголовки.Получить("Content-Type") | Строка или Неопределено |
| Метод запроса | Запрос.HTTPМетод | Строка: GET, POST |
Все параметры приходят строками. Число из ?limit=50 превращайте через Число() внутри Попытка, иначе кривой параметр обернётся ошибкой 500 вместо понятного ответа 400.
💡 Без заголовка Content-Type с charset=utf-8 браузер может показать кириллицу «кракозябрами». Сам ответ при этом правильный — ошибка только в отображении.
Для проверки удобно сделать в сервисе служебный шаблон /ping, который возвращает строку ok и время сервера. Если он отвечает, а рабочий метод нет — проблема в коде метода, а не в публикации.
Не только GET: вызов из консоли браузера
Из адресной строки уходит только GET. Остальные методы проще всего отправить из консоли разработчика (F12 → Console). Хитрость: сначала откройте любой адрес этой же публикации, например /hs/api/v1/ping, и войдите. Тогда запрос из консоли будет идти с того же адреса, и браузер не применит к нему ограничения кросс-доменных запросов.
fetch('/trade/hs/api/v1/orders', {
method: 'POST',
headers: { 'Content-Type': 'application/json; charset=utf-8' },
body: JSON.stringify({ client: 'ООО Ромашка', sum: 1500 })
})
.then(r => r.text().then(t => console.log(r.status, t)));
Код выводит статус и тело ответа. Если обработчик для POST не задан в шаблоне, придёт 405.
Для регулярной проверки удобнее Postman или curl. Пример с Basic-аутентификацией:
curl -u Администратор:пароль -H "Content-Type: application/json" -d "{\"sum\":1500}" http://srv01/trade/hs/api/v1/orders
Ошибки при обращении и где искать причину
Код ответа сразу сужает круг поиска: одни коды выдаёт веб-сервер, другие — сама 1С.
Журнал регистрации
Ошибки выполнения кода сервиса попадают в журнал регистрации базы. В типовых конфигурациях он открывается через Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — Администрирование → Журнал регистрации. Отберите события уровня «Ошибка» за последние минуты и найдите в комментарии текст исключения с номером строки модуля.
Свои записи добавляйте в обработчик явно — тогда видно, какие параметры пришли:
ЗаписьЖурналаРегистрации("HTTP-сервис.Заказы", УровеньЖурналаРегистрации.Информация, , ,
"Метод: " + Запрос.HTTPМетод + "; id: " + Запрос.ПараметрыURL.Получить("id"));
Журналы веб-сервера и отладка
Если в журнале регистрации пусто, запрос до 1С не дошёл. Тогда смотрите журналы веб-сервера: у Apache — logs\error.log и logs\access.log в каталоге установки, у IIS — каталог C:\inetpub\logs\LogFiles. Ошибка загрузки модуля wsap24.dll в error.log означает несовпадение разрядности или версии модуля.
Код сервиса можно пройти отладчиком. В Конфигураторе включите отладку по протоколу HTTP, а в Отладка → Подключение настройте автоматическое подключение к HTTP-сервисам. Поставьте точку останова в обработчике и обновите страницу в браузере — выполнение остановится на ней.
Чего браузер сделать не сможет
Проверить сервис браузером удобно, но у такого доступа есть пределы.
- 🌐 Чужой сайт не достучится до сервиса без CORS. Если JavaScript со страницы
https://shop.exampleобращается кhttp://srv01/trade/hs/..., браузер заблокирует ответ. Модуль должен вернуть заголовокAccess-Control-Allow-Originс адресом сайта. - 🔁 Предварительный запрос OPTIONS. Для POST с JSON браузер сначала шлёт OPTIONS без логина и пароля. При Basic-аутентификации 1С ответит на него 401, и основной запрос не уйдёт. Решение — отвечать на OPTIONS силами веб-сервера (правило в Apache или IIS) или вызывать сервис со своего бэкенда, а не из браузера.
- 🔑 Пароль в JavaScript виден всем. Если вшить логин и пароль в скрипт страницы, их прочитает любой посетитель. Браузерный вызов годится для отладки и внутренних страниц, а для публичного сайта нужен промежуточный сервер.
- 📦 Большие ответы. Браузер покажет и мегабайты JSON, но обработка в 1С идёт в одном сеансе. Выгрузку тысяч документов разбивайте на страницы через параметры
limitиoffset. - ⏱ Тайм-ауты. Долгий обработчик упрётся в тайм-аут веб-сервера раньше, чем 1С закончит работу. Длинные операции запускайте фоновым заданием и возвращайте идентификатор, по которому клиент потом спросит результат.
Повторное использование сеансов
По умолчанию каждый запрос открывает новый сеанс 1С и занимает лицензию на время выполнения. При частых вызовах это медленно. В default.vrd для сервиса можно включить повторное использование сеансов:
<httpServices publishByDefault="false">
<service name="API" rootUrl="api" enable="true"
reuseSessions="autouse" sessionMaxAge="20" poolSize="10"/>
</httpServices>
Значение autouse держит сеансы в пуле, а sessionMaxAge задаёт их время жизни в секундах. В атрибуте name указывают имя объекта HTTP-сервиса из конфигурации, в rootUrl — его корневой URL.