HTTP-сервис опубликован, а ответа нет: проверяем адрес, права и методы
Содержание
Чтобы проверить HTTP-сервис 1С в браузере, откройте адрес вида http://сервер/имя_публикации/hs/корневой_URL/шаблон, например http://localhost/trade/hs/api/ping. Браузер отправит GET-запрос, спросит логин и пароль пользователя 1С и покажет то, что вернул обработчик. Работает только при условии, что база опубликована на веб-сервере, а у шаблона есть метод GET.
Обычно проверку начинают, когда интеграция «молчит»: внешняя система получает 404 или 500, а разработчик не понимает, где обрыв — в веб-сервере, в публикации или в коде модуля. Проверка идёт по звеньям: публикация, адрес, тестовый метод, авторизация, код ответа. Так обрыв находится за 10–15 минут.
Что должно быть готово до проверки HTTP-сервиса
Браузер обращается не к базе 1С, а к веб-серверу. Значит, цепочка такая: браузер → IIS или Apache → модуль расширения веб-сервера 1С → информационная база → модуль HTTP-сервиса. Порвано любое звено — ответа не будет.
Перед проверкой убедитесь, что есть:
- 🧩 HTTP-сервис в конфигурации. В дереве конфигуратора ветка
Общие → HTTP-сервисы. У сервиса задан корневой URL, хотя бы один шаблон URL и метод с обработчиком. - 💾 Обновлённая конфигурация БД. Сервис, добавленный в основную конфигурацию, не работает
, пока не выполнено
Конфигурация → Обновить конфигурацию базы данных(F7). - 🌐 Веб-сервер. IIS на Windows или Apache 2.2/2.4. Для IIS нужны компоненты ISAPI-расширений.
- 🔌 Модули расширения веб-сервера. Компонент ставится установщиком платформы 1С, его надо отметить при установке. Разрядность модуля должна совпадать с разрядностью, в которой работает веб-сервер.
Публикация базы с HTTP-сервисами
Публикуют из конфигуратора, запущенного от имени администратора Windows:
- Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации латиницей, например
trade. Оно станет частью адреса. - Выберите веб-сервер и каталог публикации.
- На вкладке HTTP-сервисов отметьте публикацию сервисов по умолчанию или флажок у нужного сервиса.
- Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
В каталоге публикации появится файл default.vrd. По нему видно, что именно опубликовано:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/trade"
ib="File="D:\Bases\Trade";">
<httpServices publishByDefault="true"/>
</point>
Если publishByDefault="false", каждый сервис надо перечислить отдельным элементом <service> с enable="true". Новый сервис, добавленный после публикации, при таком режиме сам не появится — нужна повторная публикация.
Для файловой базы есть ещё одно условие. Пользователь, от которого работает веб-сервер (для IIS — группа IIS_IUSRS), должен иметь права на чтение и запись каталога базы. Иначе база не откроется, и в ответ придёт ошибка 500.
Из чего складывается адрес HTTP-сервиса 1С
Половина «не работающих» сервисов на деле работает, просто адрес набран неверно. Адрес собирается из пяти частей:
| Часть | Пример | Откуда берётся |
|---|---|---|
| Протокол и сервер | http://srv-1c | Имя или IP машины с веб-сервером |
| Имя публикации | /trade | Указано при публикации, атрибут base в default.vrd |
| Служебный префикс | /hs | Постоянный, для всех HTTP-сервисов |
| Корневой URL | /api | Свойство «Корневой URL» сервиса |
| Шаблон URL | /orders/{id} | Шаблон внутри сервиса |
Итоговый адрес: http://srv-1c/trade/hs/api/orders/125.
Частые промахи при наборе адреса:
- ❌ пропущен
/hs/— самая распространённая ошибка; - ❌ вместо корневого URL написано имя сервиса из дерева конфигурации;
- ❌ лишний или пропущенный слеш в конце, если шаблон задан как
/ping, а набрано/ping/; - ❌ параметр шаблона
{id}передан как?id=125.
Параметры шаблона и параметры запроса
Это два разных механизма. Параметр шаблона — часть пути: шаблон /orders/{id}, адрес .../orders/125. В модуле его читают через Запрос.ПараметрыURL.Получить("id").
Параметры запроса идут после знака вопроса: .../orders?from=2026-01-01&limit=50. Шаблону они не мешают, а в коде доступны через Запрос.ПараметрыЗапроса.Получить("from"). Если параметра нет, Получить вернёт Неопределено — проверяйте это, иначе обработчик упадёт.
Первая проверка в браузере: тестовый метод ping
Не начинайте проверку с боевого метода, который читает документы и строит JSON. Заведите простой шаблон /ping с методом GET. Он отделит проблемы инфраструктуры от ошибок в коде.
Функция PingGET(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("Сервис работает. Пользователь: " + ИмяПользователя()
+ ". Время сервера: " + Формат(ТекущаяДатаСеанса(), "ДФ='dd.MM.yyyy HH:mm:ss'"));
Возврат Ответ;
КонецФункции
Откройте http://localhost/trade/hs/api/ping. Правильный результат — строка с именем пользователя и временем. Имя пользователя заодно показывает, под кем выполнился запрос.
Заголовок charset=utf-8 не формальность. Без него браузер может показать кириллицу «кракозябрами», и вы потратите время на поиск несуществующей ошибки кодировки в базе.
Ping ответил, а боевой метод нет — проблема в коде или правах обработчика. Ping тоже не ответил — ищите причину в публикации, веб-сервере или адресе.
Проверяйте и с другого компьютера сети. Ответ на localhost и тишина с соседней машины почти всегда означают брандмауэр: порт 80 или 443 закрыт для входящих подключений.
Авторизация: логин и пароль пользователя 1С
HTTP-сервис выполняется в сеансе конкретного пользователя информационной базы. По умолчанию используется Basic-аутентификация: браузер видит ответ 401 и показывает окно ввода логина и пароля. Вводите имя пользователя 1С, а не учётную запись Windows.
Что проверить, если браузер снова и снова спрашивает пароль:
- Пользователь существует в
Администрирование → Пользователиконфигуратора и у него включена аутентификация 1С:Предприятия. - Логин содержит кириллицу. Basic-аутентификация с кириллическими именами ведёт себя нестабильно, для интеграций заводят пользователя с латинским именем, например
api_user. - Пароль не пустой. Пустой пароль в окне браузера срабатывает не всегда.
- В конфигураторе пользователю даны роли, которые открывают данные, нужные обработчику.
Вход без окна логина
Для отладки удобно, чтобы сервис отвечал без ввода пароля. Для этого строку подключения в default.vrd дополняют учётными данными:
ib="File="D:\Bases\Trade";Usr=api_user;Pwd=Secret123;"
Пароль в default.vrd хранится открытым текстом. Такой приём допустим на тестовом стенде. На рабочем сервере любой, кто откроет адрес, получит права этого пользователя, поэтому там учётные данные в файле не оставляют.
Права обработчика
Сам вход прошёл, а метод отвечает ошибкой 500 с текстом «Недостаточно прав»? Значит, пользователю не хватает ролей на объекты, которые читает или пишет код. Решения два: дать служебному пользователю отдельную роль с минимальным набором прав или выполнить нужный фрагмент в привилегированном режиме в общем модуле. Второй путь требует аккуратности: привилегированный код не проверяет права вообще.
Разбор ответа сервера и отладка обработчика
Окно браузера показывает только тело ответа. Код статуса и заголовки видны в инструментах разработчика:
- Нажмите F12 и перейдите на вкладку
Network(«Сеть»). - Обновите страницу с адресом сервиса.
- Щёлкните по строке запроса: справа будут
Status Code, заголовки ответа и тело.
Firefox показывает JSON-ответ в виде дерева, Chrome — сырым текстом. Для быстрой проверки структуры этого хватает.
Текст ошибки и журнал регистрации
При исключении в обработчике сервер вернёт 500 и обычно — текст ошибки встроенного языка с номером строки модуля. Если текста нет, смотрите журнал регистрации: Администрирование → Журнал регистрации в пользовательском режиме или в конфигураторе. Отберите события за последние минуты и по пользователю api_user.
В рабочем коде не полагайтесь на системный текст ошибки. Оборачивайте тело метода в Попытка … Исключение и возвращайте свой понятный ответ:
Функция OrdersGET(Запрос)
Попытка
Ид = Запрос.ПараметрыURL.Получить("id");
Данные = Новый Структура("id, status", Ид, "ok");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
Исключение
ЗаписьЖурналаРегистрации("HTTP-сервис.Заказы", УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки("Ошибка обработки запроса, подробности в журнале регистрации");
КонецПопытки;
Возврат Ответ;
КонецФункции
Пошаговая отладка
В HTTP-сервис можно зайти отладчиком конфигуратора. Для этого в default.vrd включают отладку элементом <debug enable="true" …/> с протоколом и адресом отладчика, а в конфигураторе в настройках автоматического подключения (Отладка → Подключение) отмечают HTTP-сервисы. Точка останова в методе сработает, когда вы обновите страницу в браузере. Отладку на рабочей публикации после работы выключайте.
Проверка POST и передача тела запроса
Адресная строка браузера умеет только GET. Если в шаблоне есть лишь метод POST, браузер получит 405 — это не поломка, а честный ответ «такой метод здесь не обслуживается».
Для POST есть три удобных способа.
curl. В Windows 10 и новее curl.exe уже встроен:
curl.exe -u api_user:Secret123 -X POST ^
-H "Content-Type: application/json; charset=utf-8" ^
-d "{\"number\":\"A-15\",\"sum\":1500}" ^
http://localhost/trade/hs/api/orders
Ключ -i добавит в вывод код статуса и заголовки ответа.
Консоль браузера. На вкладке Console в инструментах разработчика, открытых на странице сервиса:
fetch('/trade/hs/api/orders', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({number: 'A-15', sum: 1500})
}).then(r => r.text()).then(console.log);
Если вы уже вошли на этой странице через окно логина, браузер повторит учётные данные сам.
Postman или Insomnia. Удобны, когда запросов много: сохраняют коллекции, авторизацию и историю.
Чтение тела в обработчике
Тело забирают через Запрос.ПолучитьТелоКакСтроку(), а JSON разбирают так:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
ПрочитатьJSON без второго параметра вернёт структуру. Подвох в ключах: свойства структуры не могут начинаться с цифры или содержать дефис, поэтому JSON с ключом order-id так не прочитается. Для таких данных передайте вторым параметром Истина — получите соответствие.
Коды ответа при проверке HTTP-сервиса и как их устранить
Отдельная ситуация — сервис работал и перестал после обновления платформы. Модуль расширения веб-сервера ставится вместе с конкретной версией платформы. После перехода на новую версию переопубликуйте базу из конфигуратора новой версии или поправьте путь к модулю в настройках веб-сервера, затем перезапустите IIS или Apache.
Перезапуск веб-сервера оборвёт сеансы всех, кто работает через веб-клиент и HTTP-сервисы этой машины. Делайте его вне рабочих часов или предупредите пользователей.
Как закрыть HTTP-сервис от посторонних
Проверка в браузере показывает и обратную сторону: если вы открыли сервис с соседнего компьютера, то же может сделать любой, у кого есть сетевой доступ. Минимальный набор защиты:
- 🔒 HTTPS. При Basic-аутентификации логин и пароль идут в каждом запросе почти открыто (в кодировке Base64). Через интернет — только HTTPS с сертификатом на веб-сервере.
- 👤 Отдельный пользователь. Служебный пользователь интеграции с ролью только на нужные объекты. Не под администратором и не под учётной записью сотрудника.
- 🧱 Ограничение по IP. В IIS — «Ограничения IP-адресов и доменов», в Apache — директивы
Require ip. Сервис для склада не должен быть виден из всего интернета. - 📴 Только нужное в публикации. Снимите флажки публикации тонкого и веб-клиента, если они не используются, и переведите
publishByDefaultвfalse, перечислив разрешённые сервисы явно. - 🧹 Чистый
default.vrd. НикакихUsrиPwdв строке подключения на рабочем сервере, никакой включённой отладки.
Ограничьте и объём ответа. Метод, который по GET без параметров выгружает все заказы за пять лет, — это и риск утечки, и нагрузка на сервер. Задайте обязательный период или лимит записей через параметры запроса.
Повторное использование сеансов
У HTTP-сервиса есть свойство «Повторное использование сеансов» и время жизни сеанса. Без повторного использования каждый запрос открывает новый сеанс, что при частых вызовах заметно нагружает сервер. При включённом режиме сеанс живёт между вызовами, но тогда не храните в нём данные одного клиента, которые может увидеть следующий запрос.