Тестирование и отладка HTTP-сервиса в 1С:Предприятие
Содержание
HTTP-сервис считается рабочим, когда по его адресу приходит осмысленный ответ с кодом 200, а не ошибка веб-сервера или 404. Проверка сводится к четырём точкам: опубликован ли сервис, отвечает ли URL, доходит ли запрос до кода обработчика и хватает ли прав вызывающему.
Начинать удобно от простого к сложному: сначала открыть адрес в браузере, затем подключить отладчик, потом слать запросы из Postman или cURL и смотреть журнал регистрации. Ниже — каждый шаг с конкретными путями и примерами.
С чего начать: публикация и сам объект метаданных
Сервис должен существовать в конфигурации и быть опубликован на веб-сервере. Проверьте три вещи по порядку.
- В дереве конфигурации раскройте ветку
Общие → HTTP-сервисы. У сервиса должен быть задан корневой URL, хотя бы один шаблон URL и метод с установленным обработчиком. - Сервис должен быть выгружен на веб-сервер. Публикация делается в Конфигураторе:
Администрирование → Публикация на веб-сервере. В окне публикации на вкладке HTTP-сервисов отметьте нужный сервис галочкой либо включите публикацию всех сервисов по умолчанию. - Веб-сервер (Apache или IIS) должен быть запущен, а каталог публикации — доступен. После изменения состава сервисов публикацию нужно выполнить заново.
Публикация создаёт файл default.vrd в каталоге на веб-сервере. Если сервис не отвечает, а в конфигурации он есть, первым делом загляните в этот файл: там перечислены опубликованные сервисы и их корневые URL.
Адрес HTTP-сервиса собирается по схеме:
http://<веб-сервер>/<имя публикации>/hs/<корневой URL сервиса>/<шаблон>
Префикс hs — обязательный маркер HTTP-сервиса (у SOAP веб-сервисов он другой — ws). Корневой URL задаётся в свойствах самого сервиса, шаблон — в подчинённом объекте «Шаблон URL». Перепутанный префикс или лишний слэш — самая частая причина 404 на ровном месте.
Быстрая проверка адреса из браузера
GET-метод проще всего дёрнуть прямо из адресной строки. Вставьте собранный URL и посмотрите на результат.
- Пришёл ожидаемый ответ (JSON, XML, текст) — сервис работает, можно переходить к логике.
- Браузер спрашивает логин и пароль — публикация требует аутентификации средствами 1С. Это нормально, введите пользователя информационной базы.
404 Not Found— неверный адрес, сервис не опубликован или перепутан префиксhs.500или страница веб-сервера с ошибкой — запрос дошёл до платформы, но код обработчика упал. Это уже повод включать отладку и смотреть журнал.- Ошибка подключения, сайт недоступен — проблема на уровне веб-сервера, а не 1С.
Браузер гоняет только GET-запросы без тела. Для POST, PUT и DELETE, а также для заголовков и тела запроса нужен Postman или cURL — о них ниже.
Если в браузере виден сырой ответ, но с кракозябрами, проверьте, что в ответе проставлена кодировка. В методе возвращайте HTTPСервисОтвет с заголовком Content-Type, например application/json; charset=utf-8.
Отладка метода сервиса в Конфигураторе
Когда адрес отвечает, но результат не тот, нужно поймать выполнение в точке останова. Код HTTP-сервиса выполняется на стороне сервера, поэтому отладка настраивается чуть иначе, чем для клиентского кода.
- Разрешите отладку. В Конфигураторе откройте
Сервис → Параметры, на вкладке отладки включите разрешение подключения. Для серверной базы отладка на сервере тоже должна быть разрешена при его запуске. - Поставьте точку останова в модуле HTTP-сервиса — в теле метода, который обрабатывает нужный шаблон URL.
- Подключитесь к процессу: меню
Отладка → Подключение. В списке предметов отладки выберите тот, в котором выполняется сервис (для серверной базы это рабочий процесс сервера). - Повторите запрос из браузера или Postman. Выполнение остановится на точке останова — дальше идите по шагам клавишей
F11, смотрите значения переменных в окне «Табло».
Удобнее включить автоматическое подключение по новым предметам отладки — тогда не придётся искать процесс в списке вручную при каждом запросе. Настройка там же, в параметрах отладки.
Если точка останова не срабатывает, а ответ при этом приходит, значит, запрос обрабатывает не тот метод или не тот шаблон URL. Сверьте шаблон в конфигурации с хвостом адреса, по которому вы стучитесь.
Перед отладкой на рабочей базе с живыми пользователями помните: точка останова замораживает выполнение процесса. На продуктивном сервере это может подвесить чужие сеансы. Отлаживайте на копии или в технологическое окно.
Запросы из Postman и cURL: методы, заголовки, авторизация
Postman и cURL дают полный контроль над запросом: метод, заголовки, тело, авторизация. Это основной инструмент, когда сервис принимает POST или отдаёт результат в зависимости от входных данных.
Через cURL простой GET с базовой аутентификацией:
curl -u Администратор:пароль \
"http://localhost/base/hs/myservice/data"
POST с телом в формате JSON:
curl -u Администратор:пароль \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"Код":"000123","Количество":5}' \
"http://localhost/base/hs/myservice/orders"
Чтобы увидеть не только тело, но и статус-код с заголовками ответа, добавьте ключ -i, а для полной картины запроса и ответа — -v:
curl -i -u Администратор:пароль \
"http://localhost/base/hs/myservice/data"
Ключ -u логин:пароль отправляет заголовок Authorization: Basic, в котором логин и пароль упакованы в base64. Можно собрать заголовок и вручную:
echo -n "Администратор:пароль" | base64
Полученную строку подставьте в заголовок Authorization: Basic <строка>.
В Postman порядок такой:
- выберите метод (GET, POST, PUT, DELETE) и вставьте полный URL сервиса;
- на вкладке авторизации выберите тип
Basic Authи введите пользователя информационной базы; - для POST на вкладке тела выберите
rawи формат JSON, вставьте полезную нагрузку; - проверьте заголовок
Content-Type— он должен совпадать с тем, что ждёт метод.
Смотрите не только тело ответа, но и его статус-код, и заголовки — они сразу показывают, где сломалось.
| Код ответа | Что означает | Куда смотреть |
|---|---|---|
200 | Запрос обработан успешно | Всё хорошо, проверяйте тело ответа |
401 | Не пройдена аутентификация | Логин/пароль пользователя базы |
403 | Аутентификация прошла, но нет прав | Роль пользователя, право на сервис |
404 | Адрес не найден | Публикация, префикс hs, шаблон URL |
500 | Ошибка в коде обработчика | Отладчик и журнал регистрации |
Диагностика прав доступа и аутентификации
Коды 401 и 403 путают, хотя означают разное. 401 — платформа не поняла, кто вы: не передан логин-пароль или они неверны. 403 — вы опознаны, но вашему пользователю не разрешено дёргать этот сервис.
Проверяйте по цепочке:
- Пользователь базы. Логин и пароль в запросе должны соответствовать существующему пользователю информационной базы. Регистр и раскладка имеют значение.
- Право на сам HTTP-сервис. Откройте роль пользователя в Конфигураторе, на вкладке с HTTP-сервисами должно стоять право «Использование» для нужного сервиса. Нет права — будет
403. - Настройка аутентификации публикации. В файле
default.vrdзадано, как сервис проверяет пользователя: стандартная аутентификация 1С или средствами ОС. Если выбрана аутентификация ОС, базовый логин-пароль из Postman работать не будет. - Доступ к данным внутри метода. Даже при праве на сервис код внутри может обращаться к объектам, на которые у роли нет прав. Тогда ошибка вылезет уже из тела метода — ловится отладчиком.
Для чистоты эксперимента заведите отдельного технического пользователя с минимальной ролью, где открыт только нужный сервис. Так сразу видно, хватает ли выданных прав, и не мешают ли права администратора увидеть реальную картину.
Если сервис задуман открытым, без логина-пароля, в публикации настраивается анонимный доступ: в default.vrd для сервиса указывается пользователь базы, под которым исполняются анонимные вызовы. Тогда из Postman авторизацию можно не передавать — но код метода всё равно отработает под правами этого фиксированного пользователя.
Журнал регистрации: где искать следы запроса
Журнал регистрации показывает, что происходило на стороне платформы, когда пришёл запрос. Это незаменимо для 500-х ошибок, которые наружу отдаются одной строкой без деталей.
Открыть журнал можно двумя способами:
- в Конфигураторе:
Администрирование → Журнал регистрации; - в режиме 1С:Предприятие: раздел
Администрирование, пункт с журналом регистрации (у пользователя должно быть право на его просмотр).
Чтобы не тонуть в тысячах строк, поставьте фильтр:
- по интервалу времени — ровно на момент вашего запроса;
- по важности события — ошибки и предупреждения;
- по приложению — фоновые задания и сеансы, в которых исполняется серверный код.
В строке ошибки раскройте описание: там будет текст исключения с номером строки модуля. Этого обычно хватает, чтобы понять, упал ли код на правах, на разборе входных данных или на обращении к несуществующему объекту.
Обработка ошибок и корректный ответ сервиса
Хорошо проверяемый сервис сам сообщает, что пошло не так. Если метод падает с необработанным исключением, наружу уходит 500 без подробностей — отлаживать такое долго. Правильнее обернуть логику в попытку и вернуть осмысленный код.
Функция ОбработатьЗапрос(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Попытка
Данные = РазобратьТелоЗапроса(Запрос);
Результат = СформироватьОтвет(Данные);
Ответ.УстановитьТелоИзСтроки(Результат);
Ответ.Заголовки["Content-Type"] = "application/json; charset=utf-8";
Исключение
Ответ.КодСостояния = 500;
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
ЗаписьЖурналаРегистрации("HTTPСервис.Ошибка",
УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Ответ;
КонецФункции
Такой обработчик делает три полезные вещи: отдаёт клиенту понятный код состояния, кладёт описание в тело ответа и пишет подробность в журнал регистрации. После этого проверка сервиса превращается в чтение статус-кода и журнала, а не в гадание.
Коды возврата используйте по назначению: 400 — клиент прислал кривые данные, 404 — запрошенного объекта нет, 409 — конфликт (например, дубль), 500 — упал сам сервис. Так тот, кто дёргает сервис снаружи, сразу поймёт, на чьей стороне проблема.
Не возвращайте текст внутренней ошибки с номерами строк и именами объектов во внешний сервис, доступный из интернета. Для публичного API отдавайте обезличенный код и сообщение, а детали пишите только в журнал регистрации.
Сервис работает локально, но недоступен снаружи
Типичная ситуация: с сервера сервис отвечает по localhost, а с другого компьютера или из интернета — нет. Платформа и код тут ни при чём, проблема на сетевом уровне. Проверяйте по порядку.
- Адрес. Снаружи
localhostне работает — нужен реальный IP или доменное имя сервера. Подставьте его в URL вместоlocalhost. - Порт и файрвол. Веб-сервер слушает порт
80(HTTP) или443(HTTPS). Если порт закрыт файрволом или не проброшен на маршрутизаторе, запрос не дойдёт. Проверить доступность порта можно командойtelnet <сервер> 80илиcurl -v. - HTTPS и сертификат. Если публикация переведена на HTTPS, cURL к самоподписанному сертификату будет ругаться на проверку. Для теста это снимается ключом
-k, но в продуктиве сертификат должен быть доверенным. - CORS. Когда сервис дёргают из браузерного JavaScript со стороннего сайта, срабатывает политика источников. Нужно, чтобы метод возвращал заголовки
Access-Control-Allow-Originи сопутствующие, а на предварительныйOPTIONS-запрос сервис отвечал корректно.
Прежде чем открывать порт сервиса в интернет, продумайте аутентификацию и ограничение доступа. Открытый наружу HTTP-сервис с правами на запись — это прямой доступ к вашей базе для всех желающих.
Частые вопросы
Чем отличается префикс `hs` от `ws` в адресе?
hs — это HTTP-сервис (произвольный REST-подобный обмен), ws — SOAP веб-сервис с WSDL-описанием. Для HTTP-сервиса в адресе всегда идёт hs; поставите ws — получите 404.Почему точка останова в модуле не срабатывает, хотя ответ приходит?
Можно ли протестировать POST-запрос без Postman?
-d для тела и -H для заголовков. Браузер для этого не подходит — из адресной строки уходит только GET без тела.В чём разница между кодами `401` и `403`?
401 — платформа не опознала пользователя (нет или неверны логин-пароль). 403 — пользователь опознан, но у его роли нет права «Использование» на этот сервис.Нужно ли переопубликовывать сервис после правки кода метода?
default.vrd.