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

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

Часто при работе с современными конфигурациями 1С мы сталкиваемся с ситуацией, когда при запуске какой-либо тяжелой операции (например, загрузки банковских выписок или закрытия месяца) появляется окно ожидания с анимацией — так называемый «желтый кот». Это сигнализирует о том, что выполнение кода передано на сервер в фоновое задание. Прямая попытка поставить точку останова в коде в этом случае не сработает, так как фоновое задание — это отдельный сеанс на сервере, к которому конфигуратор по умолчанию не подключен. Разберем пошагово, как настроить систему для «поимки» такого кода.

Настройка автоматического подключения в Конфигураторе

Первым делом нам необходимо подготовить сам Конфигуратор, чтобы он автоматически «подхватывал» новые сеансы, создаваемые сервером для фоновых задач. Проанализируем стандартный алгоритм действий:

  1. Откроем Конфигуратор и перейдем в меню Отладка — Подключение....
  2. В открывшемся окне нажмем кнопку Настройка....
  3. В разделе Автоматическое подключение необходимо установить флажки напротив пунктов Серверные вызовы и Фоновые задания.

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

Включение режима отладки на сервере (параметр /debug)

Если сервер 1С:Предприятие запущен в обычном режиме, отладка серверного кода (включая фоновые задания) будет недоступна. Выясним, как это проверить и исправить. Если вы используете сервер на ОС Windows, режим отладки включается в реестре или в параметрах запуска службы. Рассмотрим пример изменения параметров в реестре:

  1. Остановим службу 1C:Enterprise 8.3 Server Agent.
  2. Откроем редактор реестра и найдем ветку службы.
  3. В параметре ImagePath добавим ключ -debug.

Пример строки запуска может выглядеть следующим образом:


"C:\Program Files\1cv8\8.3.XX.XXXX\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug

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

Современная отладка по протоколу HTTP

В новых версиях платформы (начиная с 8.3.7) появился более стабильный протокол отладки — HTTP. Он работает значительно надежнее в сложных сетях и через брандмауэры. Чтобы использовать его, при запуске сервера вместо ключа -debug следует использовать связку параметров.

Проанализируем пример настройки HTTP-отладки:

-debug -http -httpUrl http://server_name:port

В Конфигураторе при этом в меню Сервис — Параметры на закладке Отладка должен быть выбран протокол HTTP, а в поле «Адрес отладки» указан адрес сервера отладки. Это позволяет избежать многих проблем с «отваливающимися» точками останова в фоновых заданиях.

Поиск кода через механизм длительных операций

Если мы видим «желтого кота», значит, разработчики конфигурации использовали Библиотеку стандартных подсистем (БСП) и модуль ДлительныеОперации. Чтобы найти конкретный участок кода, который создает документы (например, при загрузке выписок), нам нужно понять, какая процедура запускается в фоне.

Рассмотрим метод поиска:

  1. Выполним глобальный поиск по конфигурации строки ДлительныеОперации.ЗапуститьВыполнениеВФоне.
  2. В найденных местах проанализируем параметры. Обычно первым или вторым параметром передается имя экспортной процедуры, которая и будет выполняться сервером.
  3. Именно в этой процедуре (она должна располагаться в серверном модуле или модуле менеджера объекта) и нужно ставить точку останова.

Пример типичного вызова:


ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
    "МойОбщийМодульСервер.ВыполнитьЗагрузкуДанных", 
    СтруктураПараметров, 
    ПараметрыВыполнения
);

В данном случае точку останова следует ставить в начале процедуры ВыполнитьЗагрузкуДанных в модуле МойОбщийМодульСервер.

Использование параметра «РежимОтладки»

В некоторых сложных обработках обмена данными разработчики предусматривают специальный флаг РежимОтладки (или ЗапускатьФоново). Если этот флаг доступен в настройках (иногда он скрыт и его можно изменить только программно в отладчике непосредственно перед запуском), система может выполнить код не в фоне, а непосредственно в текущем сеансе клиента.

Это самый простой способ отладки, так как вам не нужно настраивать сервер. Посмотрите на программный код перед вызовом фонового задания:


Если Параметры.РежимОтладки Тогда
    // Выполняем код напрямую в текущем сеансе
    МойОбщийМодульСервер.ВыполнитьЗагрузкуДанных(СтруктураПараметров);
Иначе
    // Запускаем фоновое задание
    ДлительныеОперации.ЗапуститьВыполнениеВФоне(...);
КонецЕсли;

Если вы принудительно установите РежимОтладки = Истина в отладчике, код выполнится синхронно, и вы сразу попадете в нужную процедуру.

Метод принудительной остановки (ВызватьИсключение)

Если настроить отладку на сервере нет возможности (например, на рабочем сервере в разгар рабочего дня), а найти место создания документа жизненно необходимо, можно воспользоваться методом «грубой силы». В предполагаемом месте кода вставьте строку:

ВызватьИсключение "Стоп-код для поиска стека вызовов";

При запуске фоновое задание завершится с ошибкой. После этого откройте Журнал регистрации. В тексте ошибки будет отображен полный стек вызовов — вы увидите все модули и номера строк, которые привели к этому месту. Это позволит точно определить, где именно происходит логика создания документов СписаниеБезналичныхДенежныхСредств или ПоступлениеНаРасчетныйСчет.

Резюме

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

← На главную