Как правильно отловить нажатие кнопки в документе при отладке в 1С?

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

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

Почему отладчик останавливается в неожиданных местах?

Проанализируем архитектуру современных типовых конфигураций. При использовании команды «Остановить» платформа прерывает выполнение на текущем активном операторе. Проблема заключается в том, что отладчик не умеет фильтровать события пользовательского интерфейса от системных процессов, а команда действует глобально на первый попавшийся активный контекст выполнения. С наибольшей вероятностью перехватывается один из следующих процессов:

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

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

Магия точек останова: поиск обработчика через свойства

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

  1. В конфигураторе откройте форму нужного документа.
  2. В окне «Элементы» найдите интересующую вас кнопку и откройте её палитру свойств.
  3. Найдите свойство Действие и нажмите на значок лупы рядом с ним.
  4. Платформа автоматически перенесет вас к нужной процедуре (обработчику нажатия) в модуле формы.
  5. Установите точку останова (нажав клавишу F9) на первой строке этой процедуры.

Теперь перейдите в пользовательский режим и спокойно нажмите кнопку. Отладка остановится ровно там, где необходимо.

Поиск кода через замер производительности

Посмотрим на пример, когда кнопка генерируется программно, и найти её в палитре свойств формы не получается. В этом случае применим инструмент «Замер производительности»:

  1. Запустите режим предприятия и подготовьте документ для тестирования (откройте форму, заполните нужные реквизиты).
  2. Перейдите в конфигуратор и включите «Замер производительности».
  3. Быстро переключитесь обратно в предприятие, нажмите нужную кнопку в документе и сразу же вернитесь в конфигуратор, чтобы выключить замер.
  4. В открывшемся окне с результатами замера проанализируем список выполненных процедур и функций. Вы увидите код, который был вызван вашим нажатием.
  5. Двойной клик по нужной строке перенесет вас к исходному коду, где можно будет установить точечный останов.

Альтернативные варианты и полезные настройки отладки

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

  1. Фильтрация предметов отладки. В конфигураторе перейдите в меню «Отладка» — «Подключение...». В настройках автоматического подключения снимите флажок с пункта Фоновые задания. Это исключит прерывание отладки на серверных фоновых процессах.
  2. Запуск без регламентных заданий. При работе с файловой информационной базой можно запускать клиентское приложение с параметром командной строки /AllowExecuteScheduledJobs -Off. В клиент-серверном варианте регламентные задания можно временно заблокировать в свойствах базы через консоль администрирования кластера серверов.
  3. Остановка по ошибке. Если нажатие кнопки приводит к программному сбою (исключению), не пытайтесь поймать его вручную. Используйте встроенный инструмент конфигуратора «Остановка по ошибке». Платформа сама прервет выполнение кода и откроет модуль в момент возникновения исключительной ситуации.
  4. Стек вызовов. Если отладчик остановился в незнакомом коде, обязательно откройте окно «Стек вызовов». Проанализируем последовательность вызванных процедур снизу вверх: это поможет мгновенно понять, находитесь ли вы в фоновом задании или в цепочке обработки пользовательского интерфейса.
← На главную