При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда код, выполняемый в фоновом режиме, отказывается «останавливаться» на точках останова. Мы видим, что команда запуска задания отрабатывает, данные меняются (или не меняются), но зайти внутрь процедуры для анализа значений переменных невозможно. Давайте вместе разберемся в причинах этого поведения и изучим пошаговый алгоритм настройки окружения для полноценной отладки.
Прежде всего, проанализируем, как происходит вызов процедуры, указанной в вопросе. Код выглядит следующим образом:
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ПараметрыОповещения);
ФоновыеЗадания.Выполнить("ДоработкиСервер.ОповеститьПользователяПоПочтеОСменеСтатусаДокумента", МассивПараметров, Новый УникальныйИдентификатор, "Оповещение по почте");
Когда мы используем метод ФоновыеЗадания.Выполнить, система создает отдельный сеанс на сервере. Это ключевой момент: основной сеанс пользователя, в котором вы нажимаете кнопку, и сеанс фонового задания — это разные сущности. Именно поэтому обычная точка останова, которая работает в форме документа, «игнорируется» сервером при выполнении кода в фоновом потоке.
Первым делом выясним, разрешена ли отладка на самом сервере приложений. По умолчанию в клиент-серверном варианте она выключена для экономии ресурсов. Чтобы включить её, необходимо отредактировать параметры запуска службы 1С:Предприятия.
Выполним следующие действия:
regedit) на сервере, где установлена служба 1С.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent....ImagePath.-debug.Важно помнить: после изменения реестра необходимо перезапустить службу 1С:Предприятия. Без этого сервер не начнет транслировать отладочную информацию конфигуратору.
В современных версиях платформы (начиная с 8.3.7) доступны два протокола. Проанализируем их различия, так как это часто становится камнем преткновения при отладке фоновых процессов.
Протокол TCP: Традиционный метод. Он требует, чтобы сервер мог «достучаться» до вашего компьютера по динамическим портам (диапазон 1560–1591). Если между вашим ПК и сервером стоит брандмауэр или вы работаете через VPN, отладка фоновых заданий часто не работает именно из-за блокировки этих портов.
Протокол HTTP: Более надежный вариант для сложных сетевых структур. Он работает через стандартные веб-порты. Для его включения сервер должен быть запущен с параметром -http. В самом Конфигураторе необходимо зайти в меню Сервис — Параметры — Отладка и выбрать «Протокол HTTP».
Даже если сервер настроен правильно, Конфигуратор по умолчанию «слушает» только текущий сеанс пользователя. Фоновое задание — это новый сеанс, который появляется и исчезает. Чтобы Конфигуратор автоматически перехватывал его, выполним следующую настройку:
Теперь при каждом запуске метода ФоновыеЗадания.Выполнить отладчик будет автоматически пытаться подключиться к новому серверному процессу.
Рассмотрим ситуацию: фоновое задание выполняется очень быстро (например, менее одной секунды). Отладчик может просто не успеть инициализировать соединение с новым сеансом до того, как задание завершится. Чтобы гарантированно «поймать» момент, добавим в начало вызываемой процедуры небольшую задержку.
Посмотрим на пример реализации такой паузы в общем модуле ДоработкиСервер:
Процедура ОповеститьПользователяПоПочтеОСменеСтатусаДокумента(Параметры) Экспорт
// Искусственная пауза для подключения отладчика (только на время разработки!)
ТекущаяДатаНачала = ТекущаяДата();
Пока ТекущаяДата() - ТекущаяДатаНачала < 10 Цикл
// Просто ждем 10 секунд
КонецЦикла;
// Далее идет основной код процедуры
// Установите точку останова здесь
РегистрыСведений.ЛогСобытий.Записать("Начало выполнения оповещения");
// ... логика отправки почты ...
КонецПроцедуры
Этот десятисекундный цикл даст вам достаточно времени, чтобы система успела зарегистрировать новый сеанс в списке подключений отладки.
Если точки останова все равно не срабатывают, нам нужно выяснить: а запускается ли вообще код? Возможно, ошибка происходит на этапе передачи параметров или из-за отсутствия прав доступа, и управление даже не доходит до вашей процедуры.
Проанализируем ситуацию с помощью ЗаписиЖурналаРегистрации. Добавьте в самое начало серверной процедуры следующий код:
ЗаписьЖурналаРегистрации("ОтладкаФоновогоЗадания", УровеньЖурналаРегистрации.Примечание, , , "Процедура запущена успешно");
Если после вызова задания в Журнале регистрации (Сервис — Журнал регистрации) не появилось соответствующей записи, значит, проблема не в отладке, а в самом вызове. Проверьте права пользователя, под которым запускается фоновое задание, и корректность передаваемого массива параметров.
Выясним еще несколько неочевидных причин, которые могут мешать процессу:
rphost некорректно кэшируют отладочную информацию. В случае странного поведения поможет перезапуск службы 1С и очистка локального кэша пользователя.Подводя итог, можно сказать, что успешная отладка фоновых заданий — это всегда сочетание трех факторов: включенный флаг -debug на сервере, правильно выбранный протокол (рекомендуется HTTP) и настроенное автоматическое подключение в меню отладки. Следуя этим шагам, вы сможете детально проанализировать работу любого фонового процесса в системе.