Почему отладчик 1С скачет между фоновыми заданиями и как это исправить?

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

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

Проанализируем природу этой проблемы и разберем проверенные способы ее решения.

Причины спонтанного переключения отладчика

Выясним причину такого поведения ядра платформы 1С:Предприятие. Основной фактор — параллельное выполнение потоков в клиент-серверной архитектуре:

  1. Параллельная работа регламентных заданий. В рабочей или тестовой базе постоянно стартуют фоновые задания по расписанию (очереди сообщений, регламентные операции БСП, синхронизация данных). Если в конфигураторе включено автоматическое подключение фоновых заданий, среда разработки автоматически цепляется к каждому новому процессу. В момент запуска любого нового фонового задания платформа всегда инициализирует его окружение, вызывая модуль сеанса и системные обработчики, тем самым перехватывая фокус пошагового выполнения.
  2. Особенности пошагового прохода (F10/F11). При шаге через вызов платформа опрашивает все активные подключенные потоки. Если целевой поток ожидает данные или обращается к СУБД, а параллельный поток только что стартовал и передал управление, фокус отладки смещается на параллельный поток.
  3. Остановка по ошибке. Если включена опция перехвата исключений, возникновение ошибки внутри любого фонового процесса (даже если она штатно перехватывается конструкцией Попытка ... Исключение) моментально переместит окно редактора на чужой сбойный участок кода.

Способ 1. Использование параметра запуска «РежимОтладки» для конфигураций на БСП

Если конфигурация разработана на базе Библиотеки стандартных подсистем (1С:ERP, 1С:КА, 1С:УТ, 1С:ЗУП, 1С:УНФ и др.), запуск длительных операций обычно управляется подсистемой фонового выполнения БСП. В ней предусмотрен специальный отладочный механизм, который принудительно выполняет алгоритм синхронно в основном потоке сеанса без выделения отдельного фонового задания.

Разберем по шагам, как активировать этот режим:

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

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

Способ 2. Блокировка регламентных заданий в информационной базе

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

Пошагово выполним блокировку:

  1. Откроем консоль администрирования кластера серверов 1С:Предприятия.
  2. Найдем нужную информационную базу и откроем ее свойства.
  3. Установим флаг Блокировка регламентных заданий включена.
  4. Нажмем Применить или ОК.

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

Способ 3. Отключение автоподключения и лишних сеансов в конфигураторе

Когда нет доступа к консоли администрирования кластера, можно отсечь посторонние потоки средствами самого конфигуратора.

Рассмотрим последовательность действий:

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

После этого можно спокойно продолжать отладку по F10, так как среда разработки больше не будет реагировать на параллельные потоки.

Способ 4. Использование команды «Выполнить до текущей строки» и условных точек останова

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

  1. Переход через Shift+F10. Вместо последовательного нажатия F10 установим курсор на нужную строку кода ниже по тексту и нажмем комбинацию Shift+F10 («Выполнить до текущей строки»). В этом случае отладчик отпустит поток на максимальной скорости и прервется только в заданной строке, минуя паразитные переключения.
  2. Условные точки останова. Если фоновое задание обрабатывает несколько элементов или запускается параллельно несколькими пользователями, настроим условие точки останова. В свойствах точки укажем фильтрацию по сеансу или значению обрабатываемых данных: НомерСеанса = 125 или по ключевому реквизиту:
    
    Ссылка.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701001001")
    
  3. Отключение остановки по ошибке. Перейдем в меню Отладка — Остановка по ошибке и снимем все отметки перехвата. Это предотвратит случайный выброс отладчика в блоки Попытка ... Исключение чужих сеансов.

Способ 5. Прямой синхронный запуск кода из внешней обработки

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

← На главную