Почему отладчик 1С 8.3 не останавливается на точке останова и процедура не находится глобальным поиском?

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

В процессе разработки и доработки типовых конфигураций 1С (таких как «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация») разработчики нередко сталкиваются с ситуацией: точка останова установлена в процедуре, пользователь выполняет целевое действие (например, проводит или записывает документ), однако отладчик не перехватывает управление, а глобальный поиск по конфигурации не находит вызовов этого метода. Разберем по шагам, почему это происходит и как локализовать исполняемый код.

Анализ назначения процедуры: выполняется ли код в действительности

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

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

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

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

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

  1. Подписки на события. Логика обработки событий объектов (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) в современных конфигурациях почти всегда выносится из модулей объектов и модулей менеджеров в общие модули через объект метаданных ПодпискаНаСобытие. При поиске по модулю самого документа прямых ссылок на эти методы не будет.
  2. Неявный динамический вызов по строке. В библиотеке стандартных подсистем (БСП) широко применяются механизмы вызова через метаданные и строковые переменные. Например:
    
    // Вызов метода через менеджер объекта по динамическому имени
    ИмяМенеджера = "ЗаказКлиента";
    Документы[ИмяМенеджера].ВыполнитьСпецифическуюОбработку();
    
    // Использование универсальных исполняемых конструкций
    Выполнить(СтрокаПроцедуры + "(Параметры);");
    
    Поскольку имя процедуры формируется динамически или передается в структуре параметров, прямой поиск точного текста метода не срабатывает.
  3. Регламентные и фоновые задания. Процедура может быть назначена обработчиком в свойствах объекта РегламентноеЗадание или вызываться фоновым заданием через метод ФоновыеЗадания.Выполнить().

Настройка отладки фоновых заданий в файловой базе

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

Настроим конфигуратор для перехвата таких вызовов:

  1. В главном меню конфигуратора откроем пункт Отладка → Подключение....
  2. В открывшемся окне нажмем кнопку Настройка автоматического подключения.
  3. Установим флаг Фоновые задания (а также при необходимости «Сеансы на сервере»).
  4. Нажмем ОК и повторим целевое действие в пользовательском сеансе.

Рассинхронизация кэша конфигурации после динамического обновления

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

Для исправления ситуации выполним следующие действия:

  1. Полностью закроем сеансы всех пользователей и конфигуратор.
  2. Очистим временные каталоги кэша 1С на локальном компьютере (каталоги по путям %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).
  3. Запустим конфигуратор и выполним обычное (не динамическое) сохранение конфигурации.

Практические способы гарантированного перехвата управления

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

1. Использование встроенного замера производительности

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

  1. В конфигураторе выберем пункт меню Отладка → Замер производительности.
  2. В пользовательском сеансе нажмем кнопку записи или проведения документа.
  3. Снова перейдем в конфигуратор и нажмем Отладка → Замер производительности для остановки замера.
  4. В открывшейся табличной форме увидим абсолютно все модули, процедуры и номера строк, которые были фактически выполнены платформой за этот интервал, отсортированные по времени и числу вызовов. Дважды щелкнув по нужной строке, можно мгновенно перейти в реальный модуль обработчика.

2. Принудительная остановка оператором Остановить

Если графическая точка останова пропускается, временно вставим в предполагаемое место выполнения безусловный оператор прерывания:


Процедура ОбработатьДанныеПередЗаписью(Параметры) Экспорт
    
    Остановить; // Безусловное прерывание отладки
    // Основной алгоритм процедуры
    
КонецПроцедуры

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

3. Программная фиксация факта вызова

Когда отладчик заблокирован политиками безопасности или протоколом передачи (HTTP/TCP), зафиксируем исполнение через журнал регистрации:


ЗаписьЖурналаРегистрации(
    "Отладка.ВызовМетода",
    УровеньЖурналаРегистрации.Информация,
    ,
    ,
    "Процедура успешно вызвана для объекта: " + Строка(Ссылка)
);

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

← На главную