Разработка и поддержка сложных систем на платформе 1С:Предприятие 8.3 часто сталкивает нас с необходимостью отладки фоновых заданий. Ситуация осложняется, когда на рабочем сервере одновременно запускаются десятки системных процессов в секунду. В таком потоке стандартное «автоподключение» превращается в кошмар: конфигуратор постоянно прерывается на чужие процессы, а окно выбора предметов отладки не позволяет оперативно найти нужное задание. В этой статье мы разберем по шагам, как изолировать именно ваши фоновые задачи и эффективно провести отладку даже в условиях высокой нагрузки.
Когда мы включаем в настройках отладки флажок Фоновые задания, платформа начинает перехватывать абсолютно все процессы, запускаемые на сервере. Если база активна, в ней могут ежесекундно работать задания по сбору метрик, обновлению полнотекстового индекса, рассылке уведомлений и другие системные механизмы. Попытка «поймать» ошибку через глобальную остановку приводит к тому, что отладчик постоянно «вылетает» на коде, который нас не интересует. Разберем, как с этим бороться.
Проанализируем самый простой и быстрый способ — установку точки останова с логическим условием. Вместо того чтобы полагаться на автоматическую остановку по ошибке, мы установим точку в том месте кода, где начинается работа интересующего нас задания, и ограничим её срабатывание.
Рассмотрим пример. Допустим, ваше фоновое задание запускается от имени конкретного пользователя или имеет уникальный параметр. Щелкните правой кнопкой мыши на точке останова и выберите «Условие». Пропишем там проверку:
// Пример условия по имени пользователя
ИмяПользователя() = "АдминистраторОтладки"
// Или проверка по конкретному параметру (если он доступен в контексте)
ПараметрыСеанса.ТекущийПользователь.Наименование = "Иванов И.И."
Важный нюанс: точка останова должна стоять в общем модуле, который вызывается внутри фонового задания. Таким образом, конфигуратор проигнорирует все сеансы, которые не соответствуют условию, и остановится только на вашем процессе.
Начиная с версии платформы 8.3.20, у разработчиков появился мощный инструмент — метод ФоновыеЗадания.ЖдатьПодключенияОтладчика(). Это «цивилизованный» способ приостановить выполнение кода до тех пор, пока программист вручную не подключится к конкретному сеансу.
Разберем, как это реализовать. В самое начало процедуры, которая выполняется в фоне, добавим следующий блок:
Процедура МоеФоновоеЗадание(Параметры) Экспорт
#Если Сервер Тогда
// Метод приостановит выполнение на указанное количество секунд (например, 60),
// давая вам время найти этот сеанс в списке подключений.
ФоновыеЗадания.ЖдатьПодключенияОтладчика(60);
#КонецЕсли
// Далее идет основной код задания...
ВыполнитьОбменДанными(Параметры);
КонецПроцедуры
Когда задание запустится, оно перейдет в состояние ожидания. В этот момент вы открываете окно Отладка -> Подключение, находите там нужный процесс (его будет легко узнать по длительному времени работы) и подключаетесь к нему вручную. Как только отладчик подключен, выполнение продолжится с первой же строки вашего кода.
Если автоподключение в конфигураторе не дает работать из-за обилия мусора, его следует отключить. Посмотрим, как в таком случае найти свой сеанс:
BackgroundJob, в описании которой будет фигурировать ваш идентификатор или хотя бы имя метаданных задания.Этот метод требует сноровки, но он незаменим на «живых» базах, где нельзя менять код для вставки условий.
Выясним причину, по которой мы вообще используем фоновое задание в момент отладки. Если ошибка кроется в логике алгоритма (например, неверно формируется XML-сообщение), мы можем временно отказаться от фонового режима.
Найдем в коде место, где вызывается ФоновыеЗадания.Выполнить(), и временно заменим его прямым вызовом процедуры. Проанализируем пример:
// Было:
// ФоновыеЗадания.Выполнить("МойМодуль.МояПроцедура", Параметры);
// Стало для отладки:
МойМодуль.МояПроцедура(Параметры);
Теперь код выполнится в контексте вашего текущего клиентского сеанса. Вы сможете использовать обычные точки останова без необходимости настраивать отладку фоновых заданий на сервере. Внимание: этот метод подходит только если процедура не использует специфические серверные механизмы, недоступные в обычном сеансе (хотя для серверных вызовов это редкость).
Проанализируем техническую сторону вопроса. Если ваша платформа настроена на работу через TCP-протокол отладки, она часто «захлебывается» при большом количестве сеансов. Перевод сервера на HTTP-отладку (через запуск службы с ключом -http или настройку в conf.cfg) делает процесс обнаружения новых сеансов более стабильным.
В режиме HTTP-отладки в конфигураторе появляется возможность более гибко управлять списком автоматического подключения через настройки «Предметы отладки». Мы можем настроить фильтр так, чтобы отладчик игнорировал определенные типы приложений, оставляя только нужные нам сеансы.
Отладка на работающей базе — это всегда риск. Чтобы минимизировать влияние на пользователей, придерживайтесь следующих правил:
Подведем итог: наиболее современным и надежным способом является использование метода ЖдатьПодключенияОтладчика. Если же версия платформы ниже 8.3.20, вашим основным инструментом становятся условные точки останова в сочетании с ручным подключением через список предметов отладки.