HTTP-сервис опубликован, а ответа нет: проверяем адрес, права и методы

· 10 мин

Содержание

Чтобы проверить 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:

  1. Откройте Администрирование → Публикация на веб-сервере.
  2. Укажите имя публикации латиницей, например trade. Оно станет частью адреса.
  3. Выберите веб-сервер и каталог публикации.
  4. На вкладке HTTP-сервисов отметьте публикацию сервисов по умолчанию или флажок у нужного сервиса.
  5. Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.

В каталоге публикации появится файл default.vrd. По нему видно, что именно опубликовано:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       base="/trade"
       ib="File=&quot;D:\Bases\Trade&quot;;">
  <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. Пользователь существует в Администрирование → Пользователи конфигуратора и у него включена аутентификация 1С:Предприятия.
  2. Логин содержит кириллицу. Basic-аутентификация с кириллическими именами ведёт себя нестабильно, для интеграций заводят пользователя с латинским именем, например api_user.
  3. Пароль не пустой. Пустой пароль в окне браузера срабатывает не всегда.
  4. В конфигураторе пользователю даны роли, которые открывают данные, нужные обработчику.

Вход без окна логина

Для отладки удобно, чтобы сервис отвечал без ввода пароля. Для этого строку подключения в default.vrd дополняют учётными данными:

ib="File=&quot;D:\Bases\Trade&quot;;Usr=api_user;Pwd=Secret123;"

Пароль в default.vrd хранится открытым текстом. Такой приём допустим на тестовом стенде. На рабочем сервере любой, кто откроет адрес, получит права этого пользователя, поэтому там учётные данные в файле не оставляют.

Права обработчика

Сам вход прошёл, а метод отвечает ошибкой 500 с текстом «Недостаточно прав»? Значит, пользователю не хватает ролей на объекты, которые читает или пишет код. Решения два: дать служебному пользователю отдельную роль с минимальным набором прав или выполнить нужный фрагмент в привилегированном режиме в общем модуле. Второй путь требует аккуратности: привилегированный код не проверяет права вообще.

Разбор ответа сервера и отладка обработчика

Окно браузера показывает только тело ответа. Код статуса и заголовки видны в инструментах разработчика:

  1. Нажмите F12 и перейдите на вкладку Network («Сеть»).
  2. Обновите страницу с адресом сервиса.
  3. Щёлкните по строке запроса: справа будут 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-сервиса есть свойство «Повторное использование сеансов» и время жизни сеанса. Без повторного использования каждый запрос открывает новый сеанс, что при частых вызовах заметно нагружает сервер. При включённом режиме сеанс живёт между вызовами, но тогда не храните в нём данные одного клиента, которые может увидеть следующий запрос.

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

Можно ли проверить HTTP-сервис без IIS и Apache?
В платформе 8.3.14 и новее есть автономный сервер ibsrv, который сам принимает HTTP-запросы. В остальных случаях нужен веб-сервер с модулем расширения 1С.
Как вызвать HTTP-сервис одной базы 1С из другой?
Через объекты HTTPСоединение и HTTPЗапрос встроенного языка. Адрес собирается так же: имя публикации, /hs/, корневой URL и шаблон.
Почему в браузере всё работает, а внешняя система получает 401?
Браузер запомнил ваш вход, а внешняя система не передаёт заголовок авторизации или передаёт другого пользователя. Проверьте запрос системы через curl с теми же логином и паролем.
Нужно ли переопубликовывать базу после правки кода метода?
Нет. Изменённый модуль начинает работать после обновления конфигурации БД. Публикацию повторяют при добавлении сервиса в режиме без публикации по умолчанию и при смене версии платформы.
Как вернуть из сервиса файл, а не текст?
Задайте тело ответа через УстановитьТелоИзДвоичныхДанных и укажите подходящий Content-Type, например application/pdf. Браузер откроет файл или предложит сохранить его.