Как поймать запрос к HTTP-сервису в отладчике: сервер 1С, публикация и точки останова
Содержание
Чтобы отлаживать 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
- Откройте
regeditи перейдите вHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. - Найдите службу агента сервера 1С (имя вида
1C:Enterprise 8.3 Server Agent (x86-64)). - Откройте параметр
ImagePathи добавьте в конец строки ключи-debug -http. - Перезапустите службу агента.
Строка запуска после правки выглядит примерно так:
"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 в каталоге публикации.
- Откройте
default.vrdв текстовом редакторе с правами администратора. - Внутри корневого элемента
<point …>добавьте строку с элементомdebug. - Сохраните файл и перезапустите пул приложений 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="srv1c";Ref="trade_test";">
<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С:Предприятия. - В поле «Отладка в данной информационной базе» выберите отладку по протоколу HTTP.
- В поле адреса сервера отладки укажите тот же адрес, что в
default.vrd, напримерhttp://srv1c:1550. - Перезапустите Конфигуратор, чтобы параметр применился.
- Откройте
Отладка → Подключение. Откроется окно предметов отладки. - Нажмите
Автоматическое подключениеи отметьте тип «HTTP-сервис». Остальные типы можно не трогать. - Закройте окно настройки.
Автоподключение нужно потому, что предмет отладки 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 разработчика |
| Замедление | режим отладки нагружает рабочие процессы | включать на время работы и выключать сразу после |
Порядок действий на проде:
- Согласуйте окно работ: включение и выключение
-debugтребует перезапуска службы, а это обрыв сеансов. - Ограничьте порт 1550 правилом брандмауэра только для своего компьютера.
- Используйте точки останова с условием, чтобы не останавливать запросы реальных клиентов.
- Если сервис пишет в базу, не останавливайтесь внутри
НачатьТранзакцию() … ЗафиксироватьТранзакцию(): другие пользователи упрутся в блокировку. - После работы уберите элемент
debugизdefault.vrd, ключи-debug -httpиз строки запуска агента и перезапустите службы.
Не оставляйте режим отладки включённым на рабочем сервере «на всякий случай». Это лишняя нагрузка и открытая дверь в код, который работает с данными.