Как узнать, откуда и каким фоновым заданием вызывается процедура в 1С?

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

В процессе разработки и сопровождения конфигураций 1С нередко возникает ситуация, когда определенная процедура общего модуля периодически выполняется в фоновом режиме, но сразу не очевидно, какой именно процесс или регламентное задание инициирует этот вызов. Разберем основные способы решения этой задачи: от стандартной интерактивной отладки до программной фиксации цепочки вызовов.

Способ 1. Использование окна «Стек вызовов» в отладчике

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

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

  1. Проверяем режим отладки сервера. Фоновые задания выполняются исключительно в серверном контексте. Убедимся, что служба сервера 1С:Предприятия запущена с ключом -debug (или с включенной HTTP-отладкой).
  2. Включаем автоматическое подключение. В конфигураторе перейдем в главное меню: Отладка — Подключение... — Кнопка «Настройка...». В открывшемся окне установим флаг Фоновые задания. Это позволит отладчику автоматически перехватывать новые потоки фоновых заданий.
  3. Устанавливаем точку останова. Откроем нужный модуль и установим точку останова внутри исследуемой процедуры.
  4. Анализируем стек. Когда платформа остановится на точке останова, откроем окно Стек вызовов через меню Отладка — Стек вызовов (или комбинацией клавиш Ctrl + Alt + C). В списке отобразится вся иерархия вызовов от самой первой точки входа фонового задания до текущей строки. Двойной клик по любой строке выше в стеке позволяет перейти в вызывающий метод и просмотреть значения переданных параметров.

Способ 2. Программное получение стека вызовов без точки останова

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

Посмотрим на пример кода, который фиксирует цепочку вызовов и записывает ее в журнал регистрации:


Попытка
    ВызватьИсключение "";
Исключение
    ТекстСтека = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписьЖурналаРегистрации(
        "АнализВызоваПроцедуры",
        УровеньЖурналаРегистрации.Информация,,,
        ТекстСтека
    );
КонецПопытки;

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

Способ 3. Определение параметров активного фонового задания из контекста

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

Рассмотрим подробнее следующий пример:


ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();

Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);

Для Каждого Задание Из МассивЗаданий Цикл
    ИмяМетода = Задание.ИмяМетода;
    Наименование = Задание.Наименование;
    Ключ = Задание.Ключ;
    
    // Если задание запущено планировщиком, доступна ссылка на регламентное задание
    Регламентное = Задание.РегламентноеЗадание;
    Если Регламентное <> Неопределено Тогда
        ИмяРегламентного = Регламентное.Имя;
    КонецЕсли;
КонецЦикла;

Объект ПолучитьТекущийСеансИнформационнойБазы() возвращает свойства НомерСеанса и ИмяПриложения, по которым можно точно сопоставить текущий поток с процессами в консоли кластера серверов или журнале регистрации.

Способ 4. Мониторинг через журнал регистрации и консоль заданий

Если модификация конфигурации нежелательна, выясним причину с помощью средств администрирования:

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