Почему отладчик в 1С пропускает вызов функции при пошаговой отладке?

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

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


Функция1();
Функция2();
Функция3();

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

1. Отладка на сервере 1С:Предприятия отключена

В клиент-серверном варианте работы базы вызовы методов могут выполняться в разных контекстах. Если Функция1() и Функция3() выполняются на стороне клиента, а Функция2() имеет директиву компиляции &НаСервере, &НаСервереБезКонтекста или расположена в серверном общем модуле, отладчик не сможет войти внутрь функции, если служба сервера 1С запущена без специального параметра отладки.

Разберем по шагам, как проверить и включить отладку на сервере 1С:

  1. Откроем реестр Windows на сервере приложений через утилиту regedit.
  2. Перейдем в ветку реестра, отвечающую за службы: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent (название службы может отличаться в зависимости от версии платформы).
  3. Найдем строковый параметр ImagePath.
  4. Добавим в конец строки запуска ключ -debug (для протокола отладки TCP) или -http -debug (для отладки по протоколу HTTP).
  5. Перезапустим службу Агент сервера 1С:Предприятия 8.3 через консоль services.msc.

2. Модуль с повторным использованием возвращаемых значений

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

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

3. Очистка кэша и последствия динамического обновления

Несоответствие исполняемого кода и открытого в Конфигураторе текста модуля часто возникает из-за повреждения локального кэша конфигурации или применения «динамического обновления» конфигурации базы данных.

Выясним порядок действий для устранения этой проблемы:

  1. Завершим все активные сеансы работы в Конфигураторе и в режиме предприятия.
  2. Выполним очистку локального кэша 1С на клиентской машине. Для этого удалим временные папки с идентификаторами баз в каталогах: %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.
  3. В Конфигураторе выполним полное обновление конфигурации базы данных (клавиша F7).
  4. При постоянных сбоях перезапустим рабочие процессы сервера 1С:Предприятия для сброса серверного контекста сеансов.

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

Если вызываемый метод запускает фоновое задание через объект ФоновыеЗадания.Выполнить или исполняется в контексте веб-сервисов и HTTP-сервисов, Конфигуратор должен быть явно настроен на отслеживание этих потоков.

Проверим настройки подключения отладчика:

  1. В главном меню Конфигуратора перейдем в раздел Отладка → Подключение....
  2. Нажмем кнопку Настройка автоматического подключения.
  3. Установим флаги напротив пунктов Фоновые задания, Сервер, Web-сервисы и HTTP-сервисы.
  4. Нажмем ОК и повторим выполнение проблемного сценария.

5. Перехват функции в расширении конфигурации (&Вместо)

Проанализируем структуру подключенных расширений. Если для вызываемого метода в расширении создана процедура-перехватчик с аннотацией &Вместо, исходный код метода в основной конфигурации полностью замещается кодом из расширения.

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

6. Директивы препроцессора и защита модулей

Рассмотрим ещё две технические причины пропуска строк отладчиком:

  1. Условия препроцессора: Проверим, не обернут ли вызов или тело функции в конструкции вида #Если Сервер Тогда, #Если ТолстыйКлиентОбычноеПриложение Тогда или #Если ВнешнееСоединение Тогда. Если текущий контекст сеанса не совпадает с условием, блок кода вырезается на этапе компиляции.
  2. Закрытый исходный код: Если модуль зашифрован паролем, поставлен без исходных текстов или защищен механизмом поставки конфигурации, платформа выполняет скомпилированный байт-код, но скрывает пошаговую трассировку строк от пользователя.

7. Клавиши пошагового выполнения

Обратим внимание на комбинацию клавиш, используемую при отладке:

  1. Клавиша F11 (Шагнуть в) осуществляет вход внутрь тела вызываемой функции.
  2. Клавиша F10 (Шагнуть через) выполняет весь метод целиком за один шаг и переводит курсор на следующую строку текущей процедуры без демонстрации внутренних вызовов.
  3. Комбинация Shift+F11 (Шагнуть из) мгновенно завершает выполнение текущего метода и возвращает управление в вызывающий контекст.
← На главную