Как подключиться к конкретному фоновому заданию для отладки в 1С

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

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

Почему отладчик перехватывает все задания подряд

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

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

Способ 1. Ручной выбор предмета отладки с отключением автоматического перехвата

Разберем по шагам, как локализовать точку останова и избежать перехвата лишних фоновых заданий средствами Конфигуратора:

  1. Откроем в конфигураторе меню Отладка — Настройка подключения....
  2. В блоке автоматического подключения проверим флаг Фоновые задания. Если он установлен, отладчик будет цеплять все сеансы без разбора. Снимем этот флаг.
  3. Откроем окно Отладка — Подключение... (окно «Предметы отладки»).
  4. В списке доступных предметов отладки найдем нужный серверный сеанс с типом Фоновое задание и нажмем кнопку Подключить.

Если задание стартует автоматически, а отследить его сложно, применим популярный прием: временно включим автоподключение, дождемся первой остановки на точке останова в нашей процедуре, после чего сразу отключим автоподключение в настройках отладки. Текущий сеанс останется подключенным, а новые сторонние задания прерываться перестанут.

Чтобы быстро определить номер нужного сеанса фонового задания среди десятков других, обратимся к консоли администрирования кластера серверов 1С. В списке «Сеансы» отфильтруем тип приложения Фоновое задание, сопоставим время запуска и пользователя, после чего выберем найденный номер сеанса в окне предметов отладки.

Способ 2. Использование условных точек останова

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

Посмотрим на пример настройки. Установим точку останова в нужной процедуре, нажмем по ней правой кнопкой мыши и перейдем в свойства точки останова. В поле «Условие» укажем проверку контекста сеанса:

ИмяПользователя() = "ИвановИИ"

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

Способ 3. Запуск через внешнюю обработку (выполнение в синхронном режиме)

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

Разберем пример кода кнопки на форме обработки:


&НаКлиенте
Процедура ВыполнитьРегламентнуюЛогику(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
    // Вызываем процедуру общего модуля, привязанную к регламентному заданию
    ИнтеграцияСБанкомСервер.ВыгрузитьПлатежныеПоручения();
КонецПроцедуры

Выполняя этот вызов, мы работаем непосредственно в рамках тонкого или толстого клиента под нашим пользователем. Точка останова сработает гарантированно, а вызовы других фоновых процессов сервера никак не помешают исследованию кода.

Способ 4. Запуск с параметром «РежимОтладки» в типовых конфигурациях

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

Для активации режима выполним следующие действия:

  1. Запустим клиентское приложение с параметром командной строки: /C РежимОтладки.
  2. В режиме «1С:Предприятие» откроем типовую обработку управления заданиями (через меню «Функции для технического специалиста» или по навигационной ссылке e1cib/app/Обработка.РегламентныеИФоновыеЗадания).
  3. Благодаря переданному ключу запуска в командной панели формы появится дополнительная кнопка Выполнить не в фоне.

При нажатии этой кнопки регламентное задание запустится синхронно прямо в контексте текущего сеанса. Мы сможем беспрепятственно отладить весь алгоритм от начала до конца стандартными точками останова без необходимости перехватывать фоновые потоки сервера.

Способ 5. Искусственная задержка и блокировка сторонних заданий

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

Посмотрим на пример реализации задержки:


ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока (ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала) < 15000 Цикл
    // Пауза 15 секунд для подключения отладчика
КонецЦикла;

Если отладка проводится на тестовом контуре, рекомендуется также временно включить опцию Блокировка регламентных заданий включена в свойствах информационной базы через консоль администрирования кластера серверов 1С. Это остановит все регулярные фоновые процессы, оставив сервер свободным для изолированной отладки целевой процедуры.

← На главную