Как правильно настроить отладку HTTP-сервисов в 1С и почему не срабатывают точки останова?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем подробно причины такого поведения платформы и пошагово настроим стабильную отладку HTTP-сервисов.

Почему сеанс определяется как «Сервер», а не «HTTP-сервис»

Проанализируем, почему Конфигуратор может не определять сеанс веб-вызова как специализированный HTTP-сервис:

  1. Особенности версий платформы: В некоторых релизах платформы линейки 8.3 (в частности, 8.3.7–8.3.8) присутствовала ошибка, из-за которой сеансы Web- и HTTP-сервисов регистрировались в списке предметов отладки с общим типом Сервер. В этом случае специализированный флаг HTTP-сервисы на сервере не может перехватить входящий поток, и отладка становится возможной только при включении общего флага Клиентские и внешние соединения на сервере.
  2. Использование классического протокола TCP/IP: При стандартной отладке по протоколу TCP/IP входящий HTTP-запрос обрабатывается рабочим процессом rphost как внешнее серверное подключение под пользователем, указанным в файле публикации, без явной детализации типа сервиса.

Настройка файла публикации default.vrd

Для корректного подключения отладчика к опубликованной информационной базе необходимо убедиться, что в файле default.vrd присутствует и правильно заполнена секция debug.

Посмотрим на пример конфигурации файла default.vrd для протокола TCP/IP:


<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="/my_service"
       ib="Srvr=&quot;test1c:1641&quot;;Ref=&quot;alf&quot;;Usr=Backup;">
    <debug enable="true"
           protocol="tcp"
           url="tcp://localhost"/>
    <httpService name="МойСервис"
                 rootUrl="api"
                 enable="true"/>
</point>

Разберем ключевые параметры настройки:

  1. Атрибут enable: должен иметь значение true.
  2. Параметр url: при отладке на локальной машине можно указывать tcp://localhost или сетевое имя сервера с портом отладчика, например tcp://MyServerName:1561 (порт можно уточнить в меню Конфигуратора Отладка → Подключение → Настройка).
  3. Регистр строки подключения: обратите внимание на параметр ib. Имена сервера и информационной базы (Srvr, Ref) строго чувствительны к регистру символов и должны точно совпадать с параметрами кластера 1С.
  4. Перезапуск веб-сервера: после любого изменения файла default.vrd обязательно перезапускаем пул приложений или службу веб-сервера IIS / Apache.

Переход на современный протокол отладки по HTTP

Протокол отладки по HTTP обеспечивает значительно более стабильную работу с серверными вызовами, фоновыми заданиями и веб-сервисами по сравнению с TCP/IP. Выполним настройку по шагам:

  1. Запуск сервера 1С с поддержкой HTTP-отладки: в свойствах службы ragent (в ветке реестра ImagePath) добавим ключи запуска -debug -http.
  2. Настройка Конфигуратора: перейдем в меню Сервис → Параметры → Отладка, переключим протокол отладки на HTTP и перезапустим Конфигуратор. Проверим адрес сервера отладки (по умолчанию выделяется порт из диапазона 1560–1591).
  3. Изменение default.vrd: изменим секцию отладки, указав протокол http и соответствующий URL:

<debug enable="true"
       protocol="http"
       url="http://localhost:1560"/>

Решение проблемы пропуска первых точек останова

Выясним причину, по которой точка останова в начале метода HTTP-сервиса часто не срабатывает. При поступлении запроса веб-сервер создает рабочий поток. Отладчику требуется некоторое время (от нескольких сотен миллисекунд до пары секунд) на инициализацию контекста, отправку рукопожатия (handshake) и передачу информации о точках останова в рабочий процесс rphost.

Если код в начале функции отрабатывает мгновенно, поток успевает выполниться до того, как отладчик активирует точку останова. Для решения этой проблемы применим несколько подходов:

  1. Временная задержка для отладки: на этапе тестирования можно вставить искусственную паузу в начале метода сервиса, чтобы дать отладчику время на перехват потока:

Функция ОбработатьЗапросGET(Запрос)
    
    // Временная задержка для подключения отладчика
    ТекущееВремя = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ТекущееВремя < 2000 Цикл
        // Ожидание 2 секунды
    КонецЦикла;
    
    // Основная логика сервиса
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("OK");
    Возврат Ответ;
    
КонецФункции
  1. Использование протокола HTTP вместо TCP/IP: при отладке по протоколу HTTP сервер отладки регистрирует точки останова централизованно, что существенно уменьшает задержку при первом подключении.

Настройка пула приложений IIS

Для корректной передачи отладочной информации необходимо правильно сконфигурировать веб-сервер:

  1. Количество рабочих процессов: в диспетчере IIS откроем параметры пула приложений, в котором работает 1С, перейдем в Дополнительные параметры (Advanced Settings) и убедимся, что параметр Максимум рабочих процессов (Maximum Worker Processes) установлен строго в 1. При значении больше единицы запросы распределяются между разными процессами, к которым Конфигуратор может не успеть подключиться.
  2. Таймаут простоя: увеличим параметр Таймаут простоя (Idle Time-out), чтобы пул приложений не выгружался между вызовами сервиса, избегая повторной длительной инициализации сеанса 1С.

Альтернативные способы отладки логики сервиса

Чтобы не зависеть от сетевых задержек веб-сервера при отладке сложной бизнес-логики, рекомендуется использовать архитектурное разделение кода:

  1. Вынесение логики в общий модуль: модуль HTTP-сервиса должен содержать только распаковку входящего запроса HTTPСервисЗапрос и упаковку результата в HTTPСервисОтвет. Вся обработка данных выносится в серверный общий модуль.
  2. Тестирование через внешнюю обработку: вызов общего модуля можно выполнять из внешней обработки в обычном сеансе тонкого или толстого клиента, передавая сформированную структуру параметров. Это позволяет выполнять пошаговую отладку алгоритма без участия веб-сервера.
← На главную