При разработке и доработке типовых конфигураций (таких как ЗУП 3, ERP, КА или УТ) разработчики часто сталкиваются с ситуацией: при нажатии кнопки на форме (например, «Заполнить») выполнение уходит в общий модуль ДлительныеОперации и метод ФоновыеЗадания.Выполнить(). Однако точка останова, установленная в целевой экспортной процедуре модуля менеджера или общего модуля, не срабатывает, и программа продолжает работу без остановки.
Разберем подробно, почему это происходит, как правильно настроить Конфигуратор для отладки фоновых потоков и какие альтернативные приемы можно применить для быстрой диагностики кода.
Фоновое задание представляет собой отдельный независимый сеанс, запускаемый платформой на сервере (или в отдельном потоке в файловой базе). Когда мы запускаем сеанс «1С:Предприятия» в режиме отладки из Конфигуратора, отладчик по умолчанию отслеживает только текущий клиентский и серверный контекст этого конкретного сеанса. Новый фоновый сеанс запускается параллельно, и отладчик к нему изначально не подключен, из-за чего все установленные точки останова игнорируются.
Запуск длительных операций в фоне реализован для того, чтобы не блокировать интерфейс пользователя: пока тяжелый документ рассчитывается, пользователь может продолжать работу с другими объектами системы.
Штатный и наиболее удобный способ отладки фоновых процедур — включение механизма автоматического перехвата фоновых сеансов отладчиком.
Выполним следующую последовательность действий:
ПодготовитьДанныеДляЗаполнения модуля менеджера документа).Важное замечание: на некоторых версиях платформы 1С:Предприятие 8.3 при изменении настроек автоматического подключения отладчик может не сразу начать перехватывать потоки. В этом случае достаточно перезапустить Конфигуратор и пользовательский сеанс «1С:Предприятия».
В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), длительные операции вызываются через модуль ДлительныеОперации. Чтобы не тратить время на ожидание и перехват фонового сеанса, можно временно переключить выполнение метода в синхронный режим прямо в текущем сеансе.
Рассмотрим, как это сделать без изменения конфигурации:
ДлительныеОперации перед строкой вызова фонового задания:
Задание = ФоновыеЗадания.Выполнить("РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации", ПараметрыЗадания,, НаименованиеЗадания);
В этом случае БСП выполнит целевой метод напрямую в текущем серверном вызове, и отладчик гарантированно остановится на точке останова внутри процедуры.
Если фоновое задание выполняется в рабочей базе, где включение отладки на сервере ограничено, либо фоновый процесс успевает завершиться слишком быстро, эффективным решением является вызов логики через внешнюю обработку.
Для этого создадим внешнюю обработку, на форму которой вынесем кнопку со следующим кодом:
&НаСервере
Процедура ВыполнитьМетодНаСервере()
ПараметрыЗаполнения = Новый Структура;
// Формируем необходимые параметры для процедуры
Документы.НачислениеЗарплаты.ПодготовитьДанныеДляЗаполнения(ПараметрыЗаполнения);
КонецПроцедуры
Такой подход позволяет изолированно отладить проблемный алгоритм, пошагово передавая нужные входные данные и отслеживая результат.
Проанализируем типовые причины, по которым автоматическое подключение к фоновым заданиям может не срабатывать:
-debug: в клиент-серверном варианте информационной базы служба сервера ragent обязательно должна быть запущена с параметром отладки. Если отладка на сервере выключена, фоновые задания будут выполняться сервером скрытно для Конфигуратора.ФоновыеЗадания.Выполнить(), обязательно должен быть объявлен с ключевым словом Экспорт. Если метод не экспортный, фоновый сеанс аварийно завершится с ошибкой до входа в тело процедуры.1cv8.exe, 1cv8c.exe и ragent.exe.