← На главную
Разберем частую ситуацию: при работе в конфигураторе 1С (например, в типовой конфигурации «Управление торговлей 11») мы подключаем отладку и хотим отловить момент нажатия кнопки в документе. Для этого мы нажимаем кнопку принудительной остановки в конфигураторе, но не успеваем выполнить нужное действие — отладчик останавливается в совершенно другом месте. Выясним причину такого поведения и рассмотрим правильные способы работы с отладкой.
Почему отладчик останавливается в неожиданных местах?
Проанализируем архитектуру современных типовых конфигураций. При использовании команды «Остановить» платформа прерывает выполнение на текущем активном операторе. Проблема заключается в том, что отладчик не умеет фильтровать события пользовательского интерфейса от системных процессов, а команда действует глобально на первый попавшийся активный контекст выполнения. С наибольшей вероятностью перехватывается один из следующих процессов:
- Фоновые и регламентные задания: На сервере постоянно выполняется множество процессов (синхронизация, проверка почты, обновление статусов).
- Обработчики ожидания: На стороне клиента часто работают таймеры, которые периодически опрашивают систему в фоновом режиме.
Кроме того, после нажатия кнопки остановки клиентское приложение «замораживается», и нажать нужную кнопку в документе становится физически невозможно.
Магия точек останова: поиск обработчика через свойства
Для решения этой задачи откажемся от принудительной паузы и рассмотрим использование точек останова. Это самый надежный способ. Разберем по шагам, как найти нужный обработчик:
- В конфигураторе откройте форму нужного документа.
- В окне «Элементы» найдите интересующую вас кнопку и откройте её палитру свойств.
- Найдите свойство
Действие и нажмите на значок лупы рядом с ним.
- Платформа автоматически перенесет вас к нужной процедуре (обработчику нажатия) в модуле формы.
- Установите точку останова (нажав клавишу
F9) на первой строке этой процедуры.
Теперь перейдите в пользовательский режим и спокойно нажмите кнопку. Отладка остановится ровно там, где необходимо.
Поиск кода через замер производительности
Посмотрим на пример, когда кнопка генерируется программно, и найти её в палитре свойств формы не получается. В этом случае применим инструмент «Замер производительности»:
- Запустите режим предприятия и подготовьте документ для тестирования (откройте форму, заполните нужные реквизиты).
- Перейдите в конфигуратор и включите «Замер производительности».
- Быстро переключитесь обратно в предприятие, нажмите нужную кнопку в документе и сразу же вернитесь в конфигуратор, чтобы выключить замер.
- В открывшемся окне с результатами замера проанализируем список выполненных процедур и функций. Вы увидите код, который был вызван вашим нажатием.
- Двойной клик по нужной строке перенесет вас к исходному коду, где можно будет установить точечный останов.
Альтернативные варианты и полезные настройки отладки
Если вам все же необходимо минимизировать влияние фоновых процессов при отладке, рассмотрим несколько дополнительных настроек:
- Фильтрация предметов отладки. В конфигураторе перейдите в меню «Отладка» — «Подключение...». В настройках автоматического подключения снимите флажок с пункта
Фоновые задания. Это исключит прерывание отладки на серверных фоновых процессах.
- Запуск без регламентных заданий. При работе с файловой информационной базой можно запускать клиентское приложение с параметром командной строки
/AllowExecuteScheduledJobs -Off. В клиент-серверном варианте регламентные задания можно временно заблокировать в свойствах базы через консоль администрирования кластера серверов.
- Остановка по ошибке. Если нажатие кнопки приводит к программному сбою (исключению), не пытайтесь поймать его вручную. Используйте встроенный инструмент конфигуратора «Остановка по ошибке». Платформа сама прервет выполнение кода и откроет модуль в момент возникновения исключительной ситуации.
- Стек вызовов. Если отладчик остановился в незнакомом коде, обязательно откройте окно «Стек вызовов». Проанализируем последовательность вызванных процедур снизу вверх: это поможет мгновенно понять, находитесь ли вы в фоновом задании или в цепочке обработки пользовательского интерфейса.