В процессе разработки и доработки типовых конфигураций 1С (таких как «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация») разработчики нередко сталкиваются с ситуацией: точка останова установлена в процедуре, пользователь выполняет целевое действие (например, проводит или записывает документ), однако отладчик не перехватывает управление, а глобальный поиск по конфигурации не находит вызовов этого метода. Разберем по шагам, почему это происходит и как локализовать исполняемый код.
Прежде чем искать проблемы в сетевых портах или механизмах отладки, проанализируем саму процедуру. Очень часто фрагмент логики с подходящим по смыслу названием входит в состав подсистемы обновления версии программы (механизмы БСП), а не в обработчики проведения или записи.
Посмотрим на пример: экспортная процедура ЗаполнитьВариантОбеспеченияОтгрузитьВАктивныхЗаказах() располагается в общем модуле ОбеспечениеСервер. По названию может показаться, что она выполняется при оперативном обеспечении или перезаписи заказа. Однако данный метод предназначен исключительно для однократной обработки данных при обновлении конфигурации до определенного релиза. Поскольку при обычной интерактивной записи документа процедура не вызывается платформой, точка останова закономерно игнорируется.
Чтобы убедиться, что код действительно участвует в рабочем сценарии, выясним причину отсутствия прямых вызовов с помощью штатных инструментов платформы.
Если код все же выполняется, но текстовый глобальный поиск по имени процедуры дает нулевой результат, разберем типовые архитектурные причины неявного вызова:
ПередЗаписью, ПриЗаписи, ОбработкаПроведения) в современных конфигурациях почти всегда выносится из модулей объектов и модулей менеджеров в общие модули через объект метаданных ПодпискаНаСобытие. При поиске по модулю самого документа прямых ссылок на эти методы не будет.
// Вызов метода через менеджер объекта по динамическому имени
ИмяМенеджера = "ЗаказКлиента";
Документы[ИмяМенеджера].ВыполнитьСпецифическуюОбработку();
// Использование универсальных исполняемых конструкций
Выполнить(СтрокаПроцедуры + "(Параметры);");
РегламентноеЗадание или вызываться фоновым заданием через метод ФоновыеЗадания.Выполнить().В платформе «1С:Предприятие 8.3» даже в файловом режиме регламентные и фоновые процессы исполняются в отдельном программном потоке. Если процедура отрабатывает в фоне, отладчик по умолчанию не подключится к этому потоку.
Настроим конфигуратор для перехвата таких вызовов:
Если в процессе разработки применялось обновление конфигурации базы данных без перезапуска сеансов («демоническое» или динамическое обновление), скомпилированный байт-код в памяти может отличаться от текста, открытого в редакторе конфигуратора. В этом случае смещаются номера строк, и точка останова становится неактивной.
Для исправления ситуации выполним следующие действия:
%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).Если визуальная точка останова не срабатывает, а стек вызовов неизвестен, применим альтернативные инструменты платформы.
1. Использование встроенного замера производительности
Это наиболее надежный способ понять, какой именно код выполняется при нажатии кнопки или проведении документа, без ручного угадывания процедур:
2. Принудительная остановка оператором Остановить
Если графическая точка останова пропускается, временно вставим в предполагаемое место выполнения безусловный оператор прерывания:
Процедура ОбработатьДанныеПередЗаписью(Параметры) Экспорт
Остановить; // Безусловное прерывание отладки
// Основной алгоритм процедуры
КонецПроцедуры
При выполнении этого кода в сеансе с разрешенной отладкой платформа принудительно активирует окно конфигуратора именно на данной строке.
3. Программная фиксация факта вызова
Когда отладчик заблокирован политиками безопасности или протоколом передачи (HTTP/TCP), зафиксируем исполнение через журнал регистрации:
ЗаписьЖурналаРегистрации(
"Отладка.ВызовМетода",
УровеньЖурналаРегистрации.Информация,
,
,
"Процедура успешно вызвана для объекта: " + Строка(Ссылка)
);
Если запись в журнале регистрации появилась, значит, метод действительно отрабатывает, и причину сбоя точки останова следует искать исключительно в сетевых настройках отладки или фоновых потоках.