Проверка HTTP-сервиса 1С в браузере: от публикации до ответа JSON

· 9 мин

Содержание

Чтобы вызвать 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.

Публикация из Конфигуратора

  1. Запустите Конфигуратор от имени администратора Windows. Без этого публикация на IIS и запись в httpd.conf Apache не пройдут.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Укажите имя публикации (оно станет частью адреса), веб-сервер и каталог публикации.
  4. Перейдите на вкладку HTTP-сервисов. Отметьте флажок публикации HTTP-сервисов по умолчанию или отметьте нужные сервисы по одному.
  5. Нажмите «Опубликовать». Для 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=&quot;srv01&quot;;Ref=&quot;trade&quot;;">
  <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, это не шифрование. Любой, кто видит трафик, прочитает пароль. Для доступа снаружи локальной сети:

  1. Включите HTTPS на веб-сервере (сертификат от доверенного центра или внутреннего УЦ).
  2. Закройте порт 80 или настройте перенаправление на 443.
  3. Дайте пользователю сервиса минимальную роль: только права, которые нужны обработчику.
  4. Ограничьте доступ к публикации по 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.

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

Можно ли вызвать HTTP-сервис файловой базы?
Да. Файловую базу публикуют на веб-сервере так же, как серверную, в строке подключения указывается File= и путь к каталогу. Учётная запись веб-сервера должна иметь права на запись в каталог базы.
Нужна ли отдельная лицензия на вызовы HTTP-сервиса?
Каждый вызов выполняется в сеансе 1С и использует клиентскую лицензию на время работы. При частых запросах включите повторное использование сеансов, чтобы не открывать сеанс на каждый вызов.
Почему веб-клиент открывается, а HTTP-сервис отвечает 404?
Публикация веб-клиента и публикация HTTP-сервисов — разные флажки. Скорее всего, в default.vrd сервисы не отмечены к публикации. Опубликуйте базу повторно с нужной галочкой.
Как сделать сервис доступным без пароля?
Укажите пользователя и пароль в строке подключения default.vrd. Создайте для этого отдельного пользователя с ролью только на нужный сервис.
Где взять корневой URL, если конфигурацию писал не я?
В Конфигураторе откройте ветку Общие → HTTP-сервисы, выделите сервис и посмотрите его свойства. Там же видны шаблоны URL и методы каждого шаблона.