При разработке и отладке в 1С мы часто сталкиваемся с ситуацией, когда код корректно доходит до строки вызова фонового задания, но внутрь вызываемой процедуры отладчик категорически отказывается заходить. Рассмотрим типичный пример вызова, при котором возникает проблема:
Вход = Новый Структура("Номер,Дата,СтатусДокумента,ДокументСсылка,Ответственный,ПолеДокумента",Номер,Дата,Ссылка.СтатусЗаявки,Ссылка,Инициатор,"Инициатор");
Если Найти(Врег(СтрокаСоединенияИнформационнойБазы()), "FILE=")=0 Тогда
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Вход);
ФоновыеЗадания.Выполнить("ДоработкиСервер.ОповеститьПользователяПоПочтеОСменеСтатусаДокумента", МассивПараметров, Новый УникальныйИдентификатор, "Оповещение по почте");
КонецЕсли;
Разберем по шагам все возможные причины такого поведения и проанализируем, как заставить отладку работать корректно.
Очень часто разработчики путают общие настройки отладки с настройками автоматического подключения. Если включен только флаг отладки на сервере, этого недостаточно для перехвата фоновых заданий.
Проверим настройки:
Отладчик не остановится на точке останова, если фоновое задание "падает" с ошибкой еще до того, как была выполнена первая строчка его кода. Разберем ситуацию с передачей параметров.
В метод ФоновыеЗадания.Выполнить() передается массив параметров. Все значения внутри переданных структур или массивов должны быть строго сериализуемыми. Если в параметрах передается битая ссылка, несериализуемый объект или метод отсутствует/не имеет директивы Экспорт, задание мгновенно завершится с ошибкой.
Убедимся, что:
ОповеститьПользователяПоПочтеОСменеСтатусаДокумента объявлена с ключевым словом Экспорт.ДоработкиСервер стоит галочка Сервер.Фоновое задание выполняется в отдельном сеансе. Кластер серверов 1С может запустить этот сеанс в другом рабочем процессе rphost. По умолчанию отладка работает по протоколу TCP. Новому процессу операционная система выдает динамический порт, который может быть закрыт брандмауэром (Firewall).
Посмотрим, что происходит: сервер 1С работает в режиме отладки, но Конфигуратор физически не может подключиться к новому порту. Чтобы решить эту проблему, переведем отладку на HTTP. HTTP-отладка работает через единый порт и намного устойчивее при нестабильных сетевых настройках.
Иногда фоновое задание отрабатывает (или падает) настолько быстро, что Конфигуратор просто не успевает "зацепиться" за новый сеанс. Проанализируем это поведение с помощью искусственной паузы.
Добавим в самое начало процедуры фонового задания следующий код:
// Временный код для перехвата отладчиком
Для Сч = 1 По 100000 Цикл
// Пустой цикл для задержки на пару секунд
КонецЦикла;
Это даст отладчику несколько драгоценных секунд на обнаружение нового сеанса и подключение к нему.
Если информационная база развернута на кластере серверов 1С, состоящем из нескольких физических машин, диспетчер кластера может отправить фоновое задание на другой сервер (на котором в данный момент не запущен ваш Конфигуратор с отладкой). В таких случаях необходимо настраивать предметы отладки централизованно или временно ограничить выполнение фоновых заданий одним конкретным рабочим сервером.
Процедура может быть переопределена в расширении конфигурации с аннотациями &Вместо или &Перед. В таком случае отладчик может пропустить точку останова в основной конфигурации, так как реальное выполнение начинается в модуле расширения. Проверим, не перекрыт ли наш общий модуль в подключенных расширениях.
Часто можно встретить совет добавить ключ запуска /РежимОтладки для базы. Выясним, почему в нашем случае это не поможет. Данный ключ работает только если запуск реализован через Библиотеку стандартных подсистем (БСП) методом ДлительныеОперации.ВыполнитьВФоне() — тогда БСП перехватывает вызов и выполняет код синхронно, а не в фоне.
В рассматриваемом примере используется прямой вызов платформы ФоновыеЗадания.Выполнить(). На этот платформенный метод ключ запуска никак не влияет, и задание в любом случае уйдет в отдельный фоновый поток.
Чтобы окончательно понять, видит ли Конфигуратор фоновое задание, выполним ручную диагностику:
ФоновыеЗадания.Выполнить(...).Если сеанс фонового задания появляется на долю секунды и сразу исчезает — значит, внутри происходит фатальная ошибка вызова или инициализации параметров. Если не появляется вообще — проблема в портах (rphost), брандмауэре или отключенной галочке автоподключения.