При работе с современными конфигурациями на платформе 1С:Предприятие 8.3 (такими как ERP 2.5, КА 2.5 или БП 3.0) разработчики часто сталкиваются с аномальным поведением отладчика. Типичная ситуация: вы устанавливаете точку останова в коде, который выполняется фоновым заданием, отладчик срабатывает, но через мгновение фокус перемещается на совершенно другую строку в другом модуле, либо отладка просто прекращается. Проанализируем причины этого явления и разберем по шагам проверенные способы решения проблемы.
Основная причина «прыгающего» отладчика заключается в особенностях работы механизма перехвата фоновых заданий в версиях платформы 8.3.18, 8.3.19 и 8.3.20. Когда включена опция автоматического подключения к фоновым заданиям, конфигуратор пытается «захватить» абсолютно все процессы, запускаемые на сервере. В современных конфигурациях одновременно может выполняться множество системных заданий (извлечение текста, обновление индексов, регламентные задания БСП). Конфигуратор не всегда корректно удерживает фокус на нужном нам потоке и начинает переключаться между ними, создавая иллюзию хаотичного перемещения по коду.
Если стандартное автоматическое подключение приводит к прыжкам, воспользуемся методикой принудительного ограничения области отладки. Рассмотрим этот алгоритм подробнее:
После этих действий конфигуратор физически не сможет переключиться на другой поток, так как в его распоряжении останется только один активный сеанс отладки.
В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), предусмотрен специальный механизм упрощения отладки фоновых процессов. Выясним, как им воспользоваться.
Попробуем запустить клиентское приложение с параметром РежимОтладки. Для этого в дополнительных параметрах запуска (в окне выбора информационных баз) укажем:
/C РежимОтладка
Этот параметр сообщает механизмам БСП (в частности, модулю ДлительныеОперации), что фоновые задания следует запускать особым образом, что значительно облегчает их перехват отладчиком. В некоторых случаях это позволяет избежать «прыжков» без ручной манипуляции сеансами.
Проанализируем техническую сторону вопроса: традиционная отладка по протоколу TCP/IP (использующая динамические порты в диапазоне 1560–1591) часто дает сбои при нестабильном сетевом соединении или блокировках брандмауэра. Платформа 8.3 позволяет перейти на более современный протокол HTTP.
Для настройки HTTP-отладки выполним следующие шаги:
-http в строке запуска (например: "C:\Program Files\1cv8\8.3.19.1351\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug -http).HTTP-отладка работает через фиксированный порт и гораздо стабильнее удерживает соединение с фоновыми заданиями, минимизируя риск самопроизвольных переключений.
Иногда самый эффективный способ отладить фоновое задание — это временно запретить его выполнение в фоне. Рассмотрим, как это сделать программно. Большинство фоновых процессов в ERP вызывается через метод ДлительныеОперации.Выполнить(). Найдем место вызова этого метода в коде и изменим параметры запуска.
Пример изменения параметров:
// В структуре параметров выполнения установим флаг
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполнения(ИдентификаторФормы);
ПараметрыВыполнения.ЗапуститьВФоне = Ложь; // Заставляем код выполняться синхронно
// Теперь вызов выполнится в текущем сеансе, и отладчик сработает штатно
Результат = ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, "ИмяМодуля.ИмяПроцедуры", СтруктураАргументов);
Установив ЗапуститьВФоне = Ложь, мы заставляем систему выполнить код «здесь и сейчас». В этом случае отладчик гарантированно остановится на точке останова, так как нового сеанса фонового задания просто не будет создано.
Если отладчик все же подключается к лишним заданиям, попробуем использовать фильтры. В окне Подключение нажмите кнопку Настройка. Там можно указать конкретные имена фоновых заданий, которые вы хотите отлаживать. Например, укажите Проведение документа, и конфигуратор будет игнорировать системные задачи обновления почты или полнотекстового поиска.
Также эффективно использование точек останова с условием. Вместо обычной остановки нажмите правой кнопкой на точку и выберите Условие.... Пропишите выражение, специфичное для вашего контекста, например:
ИмяПользователя() = "Администратор" ИЛИ ТекущаяДата() > '20230101'
Это заставляет платформу более тщательно проверять контекст перед передачей управления отладчику, что иногда помогает «зацепиться» за нужный сеанс.
Проблема «прыгающего» отладчика чаще всего решается либо ручной фильтрацией сеансов в окне подключения, либо использованием HTTP-протокола отладки. Если же вам необходимо гарантированно изучить поведение алгоритма, самым надежным способом остается временный перевод выполнения операции из фонового режима в синхронный путем модификации параметров вызова.