К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как отлаживать HTTP-сервис в 1С

Как отлаживать HTTP-сервис в 1С: настройка отладки на сервере, точки останова, тестирование запросов через Postman и браузер, типичные ошибки и их решение.

HTTP-сервис в 1С — это механизм, позволяющий принимать и обрабатывать HTTP-запросы от внешних систем: сайтов, мобильных приложений, других учётных программ. Когда сервис работает не так, как ожидалось, разработчику нужно быстро попасть внутрь его кода и посмотреть, что происходит с параметрами запроса, телом сообщения и логикой обработки.

Главная сложность отладки HTTP-сервисов в том, что код выполняется не в клиентском сеансе разработчика, а в отдельном сеансе на сервере 1С (или в файловой базе — в сеансе веб-сервера). Поэтому обычная установка точки останова не сработает, пока не подключён нужный предмет отладки. Ниже разобраны все шаги: от публикации сервиса до проверки результата внешним инструментом.

Материал подходит для платформы 8.3.x. Описанные приёмы работают как в клиент-серверном, так и в файловом варианте, но есть различия в настройке, которые отдельно отмечены в соответствующих разделах.

Почему точка останова в HTTP-сервисе не срабатывает

Самая частая жалоба разработчика: точка останова установлена в модуле HTTP-сервиса, запрос отправлен, а конфигуратор молчит. Причина почти всегда одна — код HTTP-сервиса исполняется в отдельном сеансе, который не подключён к отладчику. Конфигуратор по умолчанию отлаживает только сеансы, запущенные из него же, либо те типы соединений, которые явно разрешены в настройках.

Вторая типичная причина — отладка на сервере вообще выключена. В клиент-серверном варианте сервер 1С должен быть запущен в режиме отладки (ключ -debug при запуске агента), иначе серверный код не останавливается ни при каких настройках конфигуратора. В файловом варианте при работе через веб-сервер отладка включается отдельным параметром публикации.

Третья причина — запрос обрабатывается, но падает раньше точки останова: например, на этапе маршрутизации URL-шаблона или из-за ошибки аутентификации. В этом случае полезно временно поставить точку останова на самую первую строку обработчика и включить остановку по ошибке.

Точка останова не срабатываетСеанс HTTP-сервиса не подключён к отладчику

Проверить настройки автоматического подключения предметов отладки

Ошибка 404 при запросеСервис не опубликован или неверный URL

Проверить публикацию на веб-сервере и шаблон URL

Ошибка 401 или 403Проблема с аутентификацией

Проверить пользователя, под которым выполняется запрос, и его права

Ошибка 500Исключение в коде обработчика

Смотреть технологический журнал или включить остановку по ошибке

Включение отладки на сервере и в файловой базе

В клиент-серверном варианте агент сервера 1С должен быть запущен с ключом отладки. На Windows это делается через реестр в параметре ImagePath службы «Агент сервера 1С:Предприятия» — в строку запуска добавляется -debug. На Linux ключ добавляется в скрипт запуска или unit-файл systemd. После изменения службу необходимо перезапустить, иначе режим не применится.

В файловом варианте при работе через веб-сервер (IIS или Apache) отладка включается параметром публикации. При публикации из конфигуратора (Администрирование → Публикация на веб-сервере) в файле default.vrd задаётся атрибут debug="true" в элементе point для http-сервисов. Альтернативный способ — запустить отладку прямо из конфигуратора: тогда платформа поднимает встроенный механизм отладки файловой базы без внешнего веб-сервера, но это подходит только для проверки логики, а не реальной публикации.

Настройка автоматического подключения предмета отладки

Ключевой шаг — разрешить конфигуратору автоматически подключать сеансы HTTP-сервисов. Откройте в конфигураторе: Отладка → Подключение → кнопка «Автоматическое подключение». В списке типов предметов отладки отметьте «HTTP-сервисы» (в новых версиях платформы пункт может называться «Сервисы http»). Без этой настройки сеанс обработки запроса не появится в списке доступных для подключения.

После включения автоматического подключения установите точку останова в модуле HTTP-сервиса внутри функции-обработчика шаблона URL — например, в функции ПолучитьДанныеGET или аналогичной. Теперь при поступлении запроса платформа создаст сеанс, конфигуратор подключит его как предмет отладки, и выполнение остановится на вашей точке.

Если автоподключение не срабатывает, можно подключить сеанс вручную: Отладка → Подключение, в списке найти сеанс с типом «HTTP-сервис» и подключить его. Это удобно, когда запрос обрабатывается долго (фоновая выгрузка) и сеанс живёт достаточно долго, чтобы успеть подключиться.

Порядок действий
  1. 1
    Убедитесь, что сервер запущен в режиме отладки или в публикации файловой базы включён debug
  2. 2
    В конфигураторе откройте Отладка → Подключение → Автоматическое подключение и отметьте «HTTP-сервисы»
  3. 3
    Поставьте точку останова в первой строке функции-обработчика шаблона URL
  4. 4
    Отправьте HTTP-запрос из браузера, Postman или curl на адрес публикации
  5. 5
    Дождитесь остановки в конфигураторе, проверьте параметры запроса через табло и стек вызовов
  6. 6
    Снимите точку останова и отпустите выполнение, чтобы клиент получил ответ

Как отправить тестовый запрос к сервису

Для GET-запросов без тела проще всего использовать браузер: достаточно открыть адрес вида http://server/base/hs/api/data?param=1. Однако браузер не подходит для методов POST, PUT, DELETE и для запросов с телом в формате JSON — здесь нужен специальный инструмент.

Наиболее распространённые варианты — Postman, Insomnia или консольная утилита curl. В них можно задать метод, заголовки (например, Content-Type: application/json), тело запроса и базовую аутентификацию. Curl удобен для быстрых проверок из командной строки и для автоматизации тестовых прогонов в скриптах.

bash
curl -X POST "http://server/base/hs/orders/create" -H "Content-Type: application/json" -u user:password -d "{\"number\":\"0001\",\"sum\":1500}" -i

При отправке запроса обращайте внимание на аутентификацию. Если в публикации настроена базовая аутентификация, указывайте логин и пароль пользователя информационной базы, у которого есть право на использование HTTP-сервиса. Запрос без корректных учётных данных завершится ошибкой 401 ещё до входа в ваш код — и точка останова не сработает, что часто вводит в заблуждение.

Что смотреть в отладчике при остановке

Когда выполнение остановилось, первым делом проверьте объект Запрос — параметр функции-обработчика. Разыменуйте его в табло: Запрос.ПараметрыURL содержит значения, извлечённые из шаблона URL, Запрос.ПараметрыЗапроса — параметры строки запроса после знака вопроса, Запрос.Заголовки — HTTP-заголовки. Тело запроса читается через Запрос.ПолучитьТелоКакСтроку() или ПолучитьТелоКакПоток().

Частая ошибка — чтение тела дважды. Тело HTTP-запроса в 1С можно прочитать только один раз: если вы уже вызвали ПолучитьТелоКакСтроку() в отладочном табло, повторный вызов в коде вернёт пустую строку. Поэтому при отладке лучше сохранять тело в локальную переменную в начале обработчика и работать дальше с ней.

Для формирования ответа используйте объект HTTPСервисОтвет: задавайте код состояния, заголовки и тело. В отладчике удобно проверять объект ответа перед возвратом из функции — так видно, какой именно JSON или текст уйдёт клиенту, и корректен ли код состояния (200, 201, 400, 500).

Типичные ошибки
01
Отладка на продуктивном сервере — точка останова блокирует запрос, внешняя система получает таймаут и может повторить запрос, создавая дубли данных
02
Двойное чтение тела запроса — после первого ПолучитьТелоКакСтроку() тело пустое, и код «не видит» данные
03
Неправильный Content-Type у ответа — клиент не может распарсить JSON, хотя данные корректны
04
Отсутствие обработки исключений — любая ошибка превращается в ответ 500 без диагностической информации
05
Проверка только в браузере — GET работает, а POST с телом падает, и это обнаруживается слишком поздно

Диагностика ошибок без точек останова

Не всегда есть возможность остановить выполнение: например, ошибка воспроизводится только на сервере заказчика или только под нагрузкой. В таких случаях помогает технологический журнал. Включите в logcfg.xml события EXCP (исключения) и, при необходимости, HTTP-события — в журнале будут видны тексты ошибок с контекстом сеанса HTTP-сервиса.

Второй приём — собственное логирование внутри обработчика. Записывайте в журнал регистрации или в отдельный регистр сведений входящие параметры, тело запроса и результат обработки. Обязательно оборачивайте основную логику в попытку-исключение и в блоке исключения фиксируйте ОписаниеОшибки() вместе с идентификатором запроса — это позволит сопоставить ошибку с конкретным обращением.

Полезно также включить остановку по ошибке в конфигураторе (Отладка → Остановка по ошибке) с фильтром по тексту. Тогда отладчик остановится именно в момент исключения, даже если оно возникает глубоко в общих модулях, вызванных из обработчика сервиса.

Контрольные точки

Как проверить результат

Ответ сервиса в Postman или curl
Норма

Корректный код состояния (200/201) и ожидаемое тело ответа

Тревожный признак

Код 500, пустое тело или HTML-страница ошибки веб-сервера

Данные в базе после запроса
Норма

Созданные или изменённые объекты соответствуют переданным параметрам

Тревожный признак

Данных нет или записались дубли при повторном запросе

Журнал регистрации
Норма

Нет необработанных ошибок по сеансам HTTP-сервиса

Тревожный признак

Записи об исключениях с текстом ошибки

Повторный запрос
Норма

Сервис отрабатывает стабильно и идемпотентно там, где это требуется

Тревожный признак

Повтор вызывает ошибки уникальности или дубли документов

Ограничения и альтернативные подходы

Отладка HTTP-сервиса имеет ограничения. Сеанс обработки запроса живёт недолго, и если веб-сервер или клиент разрывает соединение по таймауту, сеанс завершается вместе с отладкой. Поэтому на время отладки имеет смысл увеличить таймауты на стороне клиента или уменьшить объём обрабатываемых данных. Также помните, что в клиент-серверном варианте код выполняется на сервере — недоступны интерактивные вызовы, модальные окна и всё, что требует клиентского контекста.

Альтернативой прямой отладке служит юнит-подход: вынести бизнес-логику обработчика в отдельный общий модуль и вызывать его из обычной процедуры, которую можно отладить в толстом клиенте с заранее подготовленными параметрами. Обработчик HTTP-сервиса при этом остаётся тонкой обёрткой: разобрать запрос, вызвать логику, сформировать ответ. Такой приём закрывает большинство ошибок ещё до публикации.

Для комплексной проверки интеграции полезно вести набор готовых запросов в Postman-коллекции: успешный сценарий, запрос с ошибкой валидации, запрос без аутентификации, запрос с некорректным JSON. Прогон коллекции после каждого изменения кода сервиса позволяет быстро убедиться, что ничего не сломалось.

Итог

Что важно запомнить

Отладка HTTP-сервиса сводится к трём условиям: сервер (или публикация файловой базы) запущен в режиме отладки, в конфигураторе включено автоподключение предмета «HTTP-сервисы», а запрос отправлен с корректной аутентификацией и адресом. Тело запроса читается один раз, исключения оборачиваются в попытку-исключение с логированием, а отладку на продуктивном сервере проводить нельзя.

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

Почему точка останова не срабатывает, хотя всё настроено?

Чаще всего запрос не доходит до обработчика: неверный URL-шаблон, ошибка аутентификации (401) или сервис не опубликован. Проверьте адрес запроса, учётные данные и то, что публикация обновлена после изменения конфигурации. Также убедитесь, что конфигурация базы данных обновлена — старая версия кода не содержит вашей точки останова.

Можно ли отладить HTTP-сервис без веб-сервера?

Да, в файловом варианте можно запустить отладку непосредственно из конфигуратора — платформа сама обработает запрос. Также можно вынести логику в общий модуль и вызывать её из тестовой обработки в толстом клиенте. Но финальную проверку всё равно нужно делать через реальную публикацию, потому что поведение веб-сервера (кодировки, заголовки, таймауты) отличается.

Как отладить сервис, если ошибка возникает только у заказчика?

Используйте технологический журнал с событием EXCP и собственное логирование в обработчике: фиксируйте входящие параметры, тело запроса и текст ошибки в журнале регистрации. Затем воспроизведите ситуацию на тестовой копии с теми же входными данными.

Почему ПолучитьТелоКакСтроку() возвращает пустую строку?

Тело HTTP-запроса читается только один раз. Если оно уже было прочитано ранее — в коде или даже вами в табло отладчика — повторный вызов вернёт пустоту. Сохраняйте тело в переменную при первом чтении и дальше работайте с переменной.

Опасно ли оставлять включённый режим отладки на сервере?

Да. Режим отладки снижает производительность сервера и раскрывает дополнительную информацию о сеансах. На продуктивном сервере его следует отключать сразу после завершения диагностики, перезапустив службу агента без ключа -debug.

Чем тестировать POST-запросы с JSON?

Браузер для этого не подходит. Используйте Postman, Insomnia или curl: укажите метод POST, заголовок Content-Type: application/json, тело с JSON и учётные данные для базовой аутентификации. Сохраните набор типовых запросов в коллекцию для повторных проверок после изменений кода.