В процессе разработки и сопровождения информационных баз 1С мы нередко сталкиваемся с ситуацией, когда одновременно выполняется множество фоновых процессов. При стандартной настройке отладчик в Конфигураторе пытается перехватить абсолютно все фоновые задания подряд. В итоге разработчик останавливается на чужих системных вызовах или других регламентных процедурах, что делает комфортную отладку невозможной. Рассмотрим подробно, почему так происходит, и разберем практические способы подключения к конкретному фоновому заданию.
Проанализируем механику работы отладки фоновых процессов платформы 1С:Предприятие. По умолчанию в настройках отладки может быть активна опция автоматического подключения к фоновым заданиям. Механизм отладчика работает глобально в рамках информационной базы: он перехватывает любые серверные потоки типа Фоновое задание без встроенной фильтрации по имени пользователя или наименованию регламентного задания.
Кроме того, важно помнить о контексте выполнения: регламентное задание запускается сервером от имени того пользователя, который явно указан в его свойствах в дереве метаданных или в форме администрирования регламентных заданий. Фоновое задание запускается под учетной записью текущего пользователя только в том случае, если оно было порождено интерактивно из его сеанса (например, при длительных операциях формирования отчетов или проведении документов).
Разберем по шагам, как локализовать точку останова и избежать перехвата лишних фоновых заданий средствами Конфигуратора:
Фоновое задание и нажмем кнопку Подключить.Если задание стартует автоматически, а отследить его сложно, применим популярный прием: временно включим автоподключение, дождемся первой остановки на точке останова в нашей процедуре, после чего сразу отключим автоподключение в настройках отладки. Текущий сеанс останется подключенным, а новые сторонние задания прерываться перестанут.
Чтобы быстро определить номер нужного сеанса фонового задания среди десятков других, обратимся к консоли администрирования кластера серверов 1С. В списке «Сеансы» отфильтруем тип приложения Фоновое задание, сопоставим время запуска и пользователя, после чего выберем найденный номер сеанса в окне предметов отладки.
Если фоновое задание запускается периодически и отключить автоподключение неудобно, настроим условную точку останова. Платформа позволяет задать логическое выражение на встроенном языке, при вычислении которого отладчик решит, прерывать ли выполнение потока.
Посмотрим на пример настройки. Установим точку останова в нужной процедуре, нажмем по ней правой кнопкой мыши и перейдем в свойства точки останова. В поле «Условие» укажем проверку контекста сеанса:
ИмяПользователя() = "ИвановИИ"
Также мы можем поставить условие на конкретные входные параметры нашей процедуры, например, проверку номера документа или идентификатора организации. В этом случае все фоновые задания, выполняемые другими пользователями или системными службами, будут проходить точку останова без прерывания, а отладчик сработает строго на целевом процессе.
Самый надежный и распространенный подход при отладке логики регламентных процедур — исключить создание фонового задания вовсе. Для этого создадим внешнюю обработку, которая напрямую вызывает процедуру-обработчик регламентного задания в текущем пользовательском сеансе.
Разберем пример кода кнопки на форме обработки:
&НаКлиенте
Процедура ВыполнитьРегламентнуюЛогику(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
// Вызываем процедуру общего модуля, привязанную к регламентному заданию
ИнтеграцияСБанкомСервер.ВыгрузитьПлатежныеПоручения();
КонецПроцедуры
Выполняя этот вызов, мы работаем непосредственно в рамках тонкого или толстого клиента под нашим пользователем. Точка останова сработает гарантированно, а вызовы других фоновых процессов сервера никак не помешают исследованию кода.
В конфигурациях, использующих Библиотеку Стандартных Подсистем (БСП), предусмотрен штатный механизм запуска регламентных заданий без создания фонового потока. Выясним причину, почему это удобно: разработчику не требуется писать вспомогательный код или создавать внешние обработки.
Для активации режима выполним следующие действия:
/C РежимОтладки.e1cib/app/Обработка.РегламентныеИФоновыеЗадания).При нажатии этой кнопки регламентное задание запустится синхронно прямо в контексте текущего сеанса. Мы сможем беспрепятственно отладить весь алгоритм от начала до конца стандартными точками останова без необходимости перехватывать фоновые потоки сервера.
Нередко фоновое задание выполняется доли секунды и завершается раньше, чем мы успеваем найти его в предметах отладки. Для таких ситуаций временно добавим в самое начало процедуры искусственное ожидание, позволяющее успеть подключить нужный предмет отладки вручную.
Посмотрим на пример реализации задержки:
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока (ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала) < 15000 Цикл
// Пауза 15 секунд для подключения отладчика
КонецЦикла;
Если отладка проводится на тестовом контуре, рекомендуется также временно включить опцию Блокировка регламентных заданий включена в свойствах информационной базы через консоль администрирования кластера серверов 1С. Это остановит все регулярные фоновые процессы, оставив сервер свободным для изолированной отладки целевой процедуры.