Почему отладчик 1С не заходит в общий модуль при вызове фонового задания?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и отладке в 1С мы часто сталкиваемся с ситуацией, когда код корректно доходит до строки вызова фонового задания, но внутрь вызываемой процедуры отладчик категорически отказывается заходить. Рассмотрим типичный пример вызова, при котором возникает проблема:


Вход = Новый Структура("Номер,Дата,СтатусДокумента,ДокументСсылка,Ответственный,ПолеДокумента",Номер,Дата,Ссылка.СтатусЗаявки,Ссылка,Инициатор,"Инициатор");
Если Найти(Врег(СтрокаСоединенияИнформационнойБазы()), "FILE=")=0 Тогда
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Вход);
    ФоновыеЗадания.Выполнить("ДоработкиСервер.ОповеститьПользователяПоПочтеОСменеСтатусаДокумента", МассивПараметров, Новый УникальныйИдентификатор, "Оповещение по почте");
КонецЕсли;

Разберем по шагам все возможные причины такого поведения и проанализируем, как заставить отладку работать корректно.

1. Настройки автоматического подключения в Конфигураторе

Очень часто разработчики путают общие настройки отладки с настройками автоматического подключения. Если включен только флаг отладки на сервере, этого недостаточно для перехвата фоновых заданий.

Проверим настройки:

  1. Откроем Конфигуратор и перейдем в меню Сервис -> Параметры -> Отладка.
  2. Перейдем на вкладку Автоматическое подключение.
  3. Убедимся, что установлена галочка именно напротив пункта Фоновые задания. Без нее новые сеансы заданий будут игнорироваться отладчиком.

2. Ошибки сериализации и падение до входа в процедуру

Отладчик не остановится на точке останова, если фоновое задание "падает" с ошибкой еще до того, как была выполнена первая строчка его кода. Разберем ситуацию с передачей параметров.

В метод ФоновыеЗадания.Выполнить() передается массив параметров. Все значения внутри переданных структур или массивов должны быть строго сериализуемыми. Если в параметрах передается битая ссылка, несериализуемый объект или метод отсутствует/не имеет директивы Экспорт, задание мгновенно завершится с ошибкой.

Убедимся, что:

3. Разные процессы (rphost) и протоколы отладки (TCP против HTTP)

Фоновое задание выполняется в отдельном сеансе. Кластер серверов 1С может запустить этот сеанс в другом рабочем процессе rphost. По умолчанию отладка работает по протоколу TCP. Новому процессу операционная система выдает динамический порт, который может быть закрыт брандмауэром (Firewall).

Посмотрим, что происходит: сервер 1С работает в режиме отладки, но Конфигуратор физически не может подключиться к новому порту. Чтобы решить эту проблему, переведем отладку на HTTP. HTTP-отладка работает через единый порт и намного устойчивее при нестабильных сетевых настройках.

4. Отладчик не успевает подключиться (Трюк с задержкой)

Иногда фоновое задание отрабатывает (или падает) настолько быстро, что Конфигуратор просто не успевает "зацепиться" за новый сеанс. Проанализируем это поведение с помощью искусственной паузы.

Добавим в самое начало процедуры фонового задания следующий код:


// Временный код для перехвата отладчиком
Для Сч = 1 По 100000 Цикл
    // Пустой цикл для задержки на пару секунд
КонецЦикла;

Это даст отладчику несколько драгоценных секунд на обнаружение нового сеанса и подключение к нему.

5. Многосерверный кластер 1С

Если информационная база развернута на кластере серверов 1С, состоящем из нескольких физических машин, диспетчер кластера может отправить фоновое задание на другой сервер (на котором в данный момент не запущен ваш Конфигуратор с отладкой). В таких случаях необходимо настраивать предметы отладки централизованно или временно ограничить выполнение фоновых заданий одним конкретным рабочим сервером.

6. Влияние расширений конфигурации

Процедура может быть переопределена в расширении конфигурации с аннотациями &Вместо или &Перед. В таком случае отладчик может пропустить точку останова в основной конфигурации, так как реальное выполнение начинается в модуле расширения. Проверим, не перекрыт ли наш общий модуль в подключенных расширениях.

7. Заблуждение о ключе /РежимОтладки

Часто можно встретить совет добавить ключ запуска /РежимОтладки для базы. Выясним, почему в нашем случае это не поможет. Данный ключ работает только если запуск реализован через Библиотеку стандартных подсистем (БСП) методом ДлительныеОперации.ВыполнитьВФоне() — тогда БСП перехватывает вызов и выполняет код синхронно, а не в фоне.

В рассматриваемом примере используется прямой вызов платформы ФоновыеЗадания.Выполнить(). На этот платформенный метод ключ запуска никак не влияет, и задание в любом случае уйдет в отдельный фоновый поток.

8. Ручная диагностика подключения

Чтобы окончательно понять, видит ли Конфигуратор фоновое задание, выполним ручную диагностику:

  1. Поставим точку останова на строке с кодом ФоновыеЗадания.Выполнить(...).
  2. Когда выполнение остановится, откроем в меню Конфигуратора Отладка -> Подключение.
  3. Поставим фильтр на отображение фоновых заданий.
  4. Сделаем шаг вперед (клавиша F10) и посмотрим на окно доступных предметов отладки.

Если сеанс фонового задания появляется на долю секунды и сразу исчезает — значит, внутри происходит фатальная ошибка вызова или инициализации параметров. Если не появляется вообще — проблема в портах (rphost), брандмауэре или отключенной галочке автоподключения.

← На главную