Как поймать запрос к HTTP-сервису в отладчике: сервер 1С, публикация и точки останова

· 9 мин

Содержание

Чтобы отлаживать HTTP-сервис на сервере 1С 8.3, нужны три вещи: агент сервера запущен с ключами -debug -http, в файле публикации default.vrd прописан элемент <debug enable="true" protocol="http" url="http://адрес:1550"/>, а в Конфигураторе в окне Отладка → Подключение включено автоматическое подключение предметов типа «HTTP-сервис». После этого первый же запрос к сервису остановится на вашей точке останова.

Пропустите любое из трёх — и отладчик молчит: запрос приходит, сервис отвечает кодом 500, а в Конфигураторе пусто. Чаще всего забывают про default.vrd: его перезаписывает каждая повторная публикация.

Как устроена отладка HTTP-сервиса и что подготовить

Код HTTP-сервиса выполняется не у вас на компьютере, а в рабочем процессе кластера (rphost). Путь запроса такой: клиент (curl, Postman, другая база) → веб-сервер (IIS или Apache) с модулем расширения 1С → кластер серверов → рабочий процесс. Отладчик Конфигуратора подключается к этому рабочему процессу через сервер отладки dbgs.

Начиная с платформы 8.3.7 есть отладка по протоколу HTTP. Для HTTP-сервисов используйте именно её: старый протокол TCP для веб-публикаций неудобен и требует больше открытых портов.

Что проверить до начала:

  • 🖥️ версия платформы на сервере, веб-сервере и у Конфигуратора совпадает до последней цифры;
  • 🔑 у вас есть права администратора на сервере 1С (нужно править параметры службы);
  • 🌐 есть доступ к каталогу публикации на веб-сервере, где лежит default.vrd;
  • 🔥 между компьютером разработчика и сервером открыт порт сервера отладки (по умолчанию 1550);
  • 🧪 есть копия рабочей базы — отлаживать лучше на ней (подробнее в разделе про безопасность).

Если веб-сервер, кластер и Конфигуратор стоят на одной машине (типичная тестовая сборка), сетевых проблем почти не бывает. На разнесённых серверах половина времени уходит на брандмауэр.

Шаг 1. Включаем режим отладки на сервере 1С

По умолчанию кластер запрещает отладку. Разрешение задаётся ключами в строке запуска агента ragent.

Windows

  1. Откройте regedit и перейдите в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
  2. Найдите службу агента сервера 1С (имя вида 1C:Enterprise 8.3 Server Agent (x86-64)).
  3. Откройте параметр ImagePath и добавьте в конец строки ключи -debug -http.
  4. Перезапустите службу агента.

Строка запуска после правки выглядит примерно так:

"C:\Program Files\1cv8\8.3.24.1691\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug -http

Номер платформы, порты и каталог srvinfo у вас свои — меняйте только хвост строки.

Перезапуск службы агента обрывает все сеансы пользователей на этом сервере. На рабочем сервере делайте это вне рабочего времени и предупредите людей заранее.

Linux

На Linux ключи -debug -http добавляются в строку запуска ragent в unit-файле службы systemd (или в конфигурационном файле службы, если у вас старая схема запуска). После правки выполните systemctl daemon-reload и перезапустите службу. Где именно лежит unit, зависит от версии платформы: найдите его командой systemctl status по имени службы 1С.

Как проверить, что режим включился

  • в диспетчере задач (или ps aux | grep dbgs на Linux) появился процесс dbgs — сервер отладки, его запускает сам кластер;
  • в консоли администрирования кластера у рабочего сервера и процессов нет ошибок после перезапуска.

Если dbgs не появился, ключи не подхватились: проверьте, что правили ImagePath нужной службы, а не второй установленной версии.

Шаг 2. Публикация HTTP-сервиса с разрешённой отладкой

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

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

  1. Откройте default.vrd в текстовом редакторе с правами администратора.
  2. Внутри корневого элемента <point …> добавьте строку с элементом debug.
  3. Сохраните файл и перезапустите пул приложений IIS или службу Apache.

Фрагмент файла после правки:

<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;srv1c&quot;;Ref=&quot;trade_test&quot;;">
    <debug enable="true" protocol="http" url="http://srv1c:1550"/>
    <httpServices publishByDefault="false">
        <service name="API" rootUrl="api" enable="true"/>
    </httpServices>
</point>

В атрибуте url указывайте адрес сервера отладки — того, к которому подключается ваш Конфигуратор. Если Конфигуратор запущен на той же машине, что и веб-сервер, подойдёт http://localhost:1550.

Повторная публикация из Конфигуратора перезаписывает default.vrd. Элемент debug пропадёт, и отладка «сломается» без видимой причины. После каждой переопубликации проверяйте файл.

Шаг 3. Подключаем Конфигуратор как клиент отладки

Теперь настраиваем сторону разработчика.

  1. В Конфигураторе откройте Сервис → Параметры, закладку Запуск 1С:Предприятия.
  2. В поле «Отладка в данной информационной базе» выберите отладку по протоколу HTTP.
  3. В поле адреса сервера отладки укажите тот же адрес, что в default.vrd, например http://srv1c:1550.
  4. Перезапустите Конфигуратор, чтобы параметр применился.
  5. Откройте Отладка → Подключение. Откроется окно предметов отладки.
  6. Нажмите Автоматическое подключение и отметьте тип «HTTP-сервис». Остальные типы можно не трогать.
  7. Закройте окно настройки.

Автоподключение нужно потому, что предмет отладки HTTP-сервиса живёт секунды: сеанс создаётся под запрос и завершается вместе с ним. Подключить его вручную из списка вы просто не успеете.

Если вы параллельно отлаживаете фоновые задания, которые сервис запускает, отметьте в автоподключении и «Фоновое задание». Иначе код в фоне пройдёт мимо отладчика.

Шаг 4. Точки останова, пошаговое выполнение и замер

Откройте модуль HTTP-сервиса (Общие → HTTP-сервисы → ваш сервис → Модуль) и поставьте точку останова на первой строке обработчика метода клавишей F9.

Отправьте тестовый запрос. Самый простой способ — curl с компьютера разработчика:

curl -v -u "Admin:пароль" -X POST \
  -H "Content-Type: application/json" \
  -d "{\"nomenclature\":\"00-00000123\",\"qty\":5}" \
  http://web-server/trade/hs/api/orders

Здесь trade — имя публикации, hs — постоянная часть адреса HTTP-сервисов, api — корневой URL сервиса, orders — шаблон URL.

Когда выполнение остановится, работают обычные команды отладчика:

КлавишаДействие
F5продолжить до следующей точки останова
F10шаг с обходом (не заходить в вызываемую процедуру)
F11шаг с заходом в процедуру
Shift+F11выйти из текущей процедуры
Shift+F9вычислить выражение
F9поставить или снять точку останова

Полезные приёмы для сервисов:

  • 🎯 Точка останова с условием. Если сервис дёргают сотни раз в минуту, остановка на каждом вызове мешает. Поставьте условие, например Запрос.ПараметрыURL.Получить("id") = "123", — отладчик остановится только на нужном запросе.
  • ⏸️ Остановка по ошибке. В меню Отладка включите остановку по ошибке. Отладчик встанет на строке, где возникло исключение, даже если оно перехвачено в Попытка … Исключение.
  • ⏱️ Замер производительности. Включите его в меню Отладка перед запросом и выключите после. Покажет, какие строки съели время: часто это запрос к базе без индекса или цикл с обращением к реквизитам через точку.

Шаг 5. Разбор входящего запроса и формируемого ответа

В обработчике метода доступен объект HTTPСервисЗапрос — обычно параметр называется Запрос. Остановившись в обработчике, вычислите (Shift+F9) нужные поля:

Что смотретьВыражение
HTTP-методЗапрос.HTTPМетод
Базовый адресЗапрос.БазовыйURL
Относительный адресЗапрос.ОтносительныйURL
Параметры из шаблона URLЗапрос.ПараметрыURL
Параметры после «?»Запрос.ПараметрыЗапроса
ЗаголовкиЗапрос.Заголовки
Тело запросаЗапрос.ПолучитьТелоКакСтроку()

Ответ собирается через HTTPСервисОтвет. Проверьте перед возвратом код состояния, заголовок Content-Type и тело:

Функция ЗаказыPOST(Запрос)

    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

    Если ПустаяСтрока(ТелоЗапроса) Тогда
        Ответ.КодСостояния = 400;
        Ответ.УстановитьТелоИзСтроки("{""error"":""empty body""}");
        Возврат Ответ;
    КонецЕсли;

    // разбор JSON и запись заказа
    Ответ.УстановитьТелоИзСтроки("{""status"":""ok""}");
    Возврат Ответ;

КонецФункции

Когда отладчиком подключиться нельзя (например, ошибка плавающая), пишите вход и выход в журнал регистрации:

ЗаписьЖурналаРегистрации("API.Заказы", УровеньЖурналаРегистрации.Информация, , ,
    "Метод: " + Запрос.HTTPМетод + "; тело: " + Лев(ТелоЗапроса, 2000));

Ограничение Лев(…, 2000) не даёт журналу распухнуть от больших тел. Записи ищите в Администрирование → Журнал регистрации с отбором по имени события.

Ключ -v у curl показывает заголовки запроса и ответа целиком. По ним сразу видно, дошёл ли запрос до 1С (ответ с кодом от сервиса) или застрял на веб-сервере (страница ошибки IIS или Apache).

Диагностика: выберите симптом

Почему точка останова не срабатывает: разбор частых сбоев

Отдельно о ситуациях, которые не очевидны из сообщений об ошибках.

Версии не совпадают. Конфигуратор 8.3.24.1691 не подключится к кластеру 8.3.24.1586. Отладка требует полного совпадения номера платформы. Обновите клиент до версии сервера.

Отладка идёт не в той базе. В default.vrd строка ib указывает на trade_test, а Конфигуратор открыт на trade. Предмет отладки не появится, потому что запрос выполняется в другой информационной базе.

Конфигурация не обновлена. Вы поставили точку останова в модуле, но не нажали F7 («Обновить конфигурацию базы данных»). Сервер выполняет старый код, строки не совпадают, остановки нет.

Сеансы переиспользуются. Если в default.vrd для сервиса задано повторное использование сеансов (атрибут reuseSessions), запрос может попасть в сеанс, созданный до того, как вы включили автоподключение. Выставьте на время отладки reuseSessions="dontuse" и перезапустите веб-сервер.

Код выполняется в фоновом задании. Обработчик запускает фоновое задание и сразу отвечает 200. Точка останова в процедуре задания сработает, только если в автоподключении отмечены фоновые задания.

Безопасная отладка на рабочем сервере

Лучшее правило — не отлаживать на рабочей базе. Сделайте копию (выгрузка .dt или копия СУБД), опубликуйте её отдельной публикацией и отлаживайте там. Если ошибка воспроизводится только на проде, соблюдайте ограничения ниже.

РискЧто происходитКак снизить
Повисший запроспока вы стоите на точке, сеанс держит блокировки и транзакциюточки останова только вне транзакций, короткие остановки
Чужие запросы ловятся отладчикомреальные клиенты получают таймаутыточка останова с условием на тестовый параметр
Открытый порт отладкик серверу отладки может подключиться постороннийдоступ к порту 1550 только с IP разработчика
Замедлениережим отладки нагружает рабочие процессывключать на время работы и выключать сразу после

Порядок действий на проде:

  1. Согласуйте окно работ: включение и выключение -debug требует перезапуска службы, а это обрыв сеансов.
  2. Ограничьте порт 1550 правилом брандмауэра только для своего компьютера.
  3. Используйте точки останова с условием, чтобы не останавливать запросы реальных клиентов.
  4. Если сервис пишет в базу, не останавливайтесь внутри НачатьТранзакцию() … ЗафиксироватьТранзакцию(): другие пользователи упрутся в блокировку.
  5. После работы уберите элемент debug из default.vrd, ключи -debug -http из строки запуска агента и перезапустите службы.

Не оставляйте режим отладки включённым на рабочем сервере «на всякий случай». Это лишняя нагрузка и открытая дверь в код, который работает с данными.

Можно ли отлаживать HTTP-сервис в файловой базе?
Да. Код выполняется в процессе веб-сервера, поэтому ключи агента не нужны: достаточно элемента debug в default.vrd и HTTP-отладки в параметрах Конфигуратора.
Нужен ли отдельный сервер отладки, если кластер сам запускает dbgs?
Нет. При ключах -debug -http кластер поднимает dbgs сам. Конфигуратору нужно лишь указать его адрес.
Как отлаживать вызов HTTP-сервиса из другой базы 1С?
Подключите к отладке вызывающую базу и сервис-приёмник одновременно, увеличьте таймаут у HTTPСоединение. Тогда можно пройти код с обеих сторон.
Работает ли такая отладка для веб-сервисов SOAP?
Да, схема та же. В автоподключении отметьте тип «Web-сервис» вместо «HTTP-сервис».
Почему после отладки сервис стал медленнее?
Скорее всего, ключи -debug -http остались в строке запуска агента или в default.vrd остался элемент debug. Уберите их и перезапустите службы.