В процессе разработки и сопровождения конфигураций 1С нередко возникает ситуация, когда определенная процедура общего модуля периодически выполняется в фоновом режиме, но сразу не очевидно, какой именно процесс или регламентное задание инициирует этот вызов. Разберем основные способы решения этой задачи: от стандартной интерактивной отладки до программной фиксации цепочки вызовов.
Самый быстрый и наглядный способ выяснить, какая цепочка процедур привела к исполнению текущего кода, — воспользоваться возможностями конфигуратора.
Разберем по шагам, как настроить отладчик для перехвата фонового задания:
-debug (или с включенной HTTP-отладкой).Ctrl + Alt + C). В списке отобразится вся иерархия вызовов от самой первой точки входа фонового задания до текущей строки. Двойной клик по любой строке выше в стеке позволяет перейти в вызывающий метод и просмотреть значения переданных параметров.Если сервер работает в продуктивном контуре без включенной отладки или вызов происходит нерегулярно, точку останова поставить не удастся. В платформе 1С отсутствует прямая функция для получения текущего стека исполнения, однако мы можем сгенерировать искусственное исключение и перехватить трассировку программно.
Посмотрим на пример кода, который фиксирует цепочку вызовов и записывает ее в журнал регистрации:
Попытка
ВызватьИсключение "";
Исключение
ТекстСтека = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(
"АнализВызоваПроцедуры",
УровеньЖурналаРегистрации.Информация,,,
ТекстСтека
);
КонецПопытки;
Функция ПодробноеПредставлениеОшибки() возвращает полный путь исполнения с именами общих модулей, названиями методов и номерами строк. Изучив полученную запись в журнале регистрации, можно легко определить, откуда стартовал вызов.
Чтобы понять, какое именно фоновое или регламентное задание выполняется, мы можем запросить информацию о сеансе и запущенных заданиях средствами встроенного языка.
Рассмотрим подробнее следующий пример:
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из МассивЗаданий Цикл
ИмяМетода = Задание.ИмяМетода;
Наименование = Задание.Наименование;
Ключ = Задание.Ключ;
// Если задание запущено планировщиком, доступна ссылка на регламентное задание
Регламентное = Задание.РегламентноеЗадание;
Если Регламентное <> Неопределено Тогда
ИмяРегламентного = Регламентное.Имя;
КонецЕсли;
КонецЦикла;
Объект ПолучитьТекущийСеансИнформационнойБазы() возвращает свойства НомерСеанса и ИмяПриложения, по которым можно точно сопоставить текущий поток с процессами в консоли кластера серверов или журнале регистрации.
Если модификация конфигурации нежелательна, выясним причину с помощью средств администрирования: