Отладка процедур, выполняющихся в фоновом режиме, часто вызывает сложности у разработчиков. Фоновые задания запускаются в отдельных серверных сеансах, не имеют визуального интерфейса и при быстром выполнении завершаются раньше, чем отладчик успевает перехватить поток. Разберем по шагам, как определить код фонового задания, настроить конфигуратор и гарантированно остановиться на нужной точке останова.
Перед тем как отлаживать код, выясним, какая именно процедура и с какими параметрами передается на выполнение в фоновый поток. На платформенном уровне запуск фонового задания всегда инициируется методом ФоновыеЗадания.Выполнить(). Первым параметром в этот метод передается имя экспортируемой серверной процедуры в виде строки.
Рассмотрим, как найти место запуска:
ФоновыеЗадания.Выполнить. Это покажет все прямые вызовы фоновых потоков.ДлительныеОперации (функции ВыполнитьВФоне или ЗапуститьВыполнениеВФоне). Найдем вызовы этих функций в интересующем нас модуле.В типовых конфигурациях 1С, использующих БСП, предусмотрен встроенный механизм перевода длительных операций в синхронный режим. Это исключает запуск фонового потока и выполняет алгоритм в текущем серверном вызове, что существенно упрощает отладку.
Разберем, как включить этот режим:
/C РежимОтладки.Если проект разрабатывается без БСП, можно временно вызвать целевую процедуру напрямую в месте инициализации фонового задания:
// Временный прямой вызов для пошаговой отладки
ИмяПроцедуры = "МойМодульСервер.ВыполнитьПечатьВФоне";
МойМодульСервер.ВыполнитьПечатьВФоне(ПараметрыПечати, АдресХранилища);
Если алгоритм необходимо проверить строго в многопоточном фоновом режиме, настроим конфигуратор для перехвата новых серверных потоков. Начиная с платформы 8.3, рекомендуется использовать протокол отладки по HTTP вместо устаревшего TCP, так как HTTP-отладка стабильнее работает через маршрутизаторы и брандмауэры.
Разберем порядок настройки конфигуратора:
-debug или -http в параметрах службы).Часто возникает ситуация: автоматическое подключение включено, флаг отладки активен, но точка останова все равно пропускается. Это происходит, когда объем данных небольшой или процедура отрабатывает за доли секунды — фоновый поток успевает завершить работу до того, как конфигуратор зарегистрирует соединение.
Проанализируем практический прием для обхода этой проблемы:
Приостановить().
Процедура ВыполнитьПечатьВФоне(ПараметрыПечати, АдресХранилища) Экспорт
#Если Сервер И Не ВнешнееСоединение Тогда
Приостановить(15); // Даем отладчику время подключиться к сеансу
#КонецЕсли
// Основной алгоритм обработки данных
СформироватьТабличныйДокумент(ПараметрыПечати);
КонецПроцедуры
После вызова паузы отладчик гарантированно зарегистрирует фоновый сеанс, и выполнение прервется на следующей установленной точке останова. После завершения отладки вызов Приостановить() необходимо удалить из рабочего кода.