При работе с крупными современными конфигурациями (такими как ERP, ЗУП 3 или УТ 11) разработчики часто сталкиваются с проблемой при использовании стандартной функции «Остановить» (пауза) в конфигураторе. Вместо того чтобы замереть на коде, который выполняется в ответ на действия пользователя, отладчик постоянно «вылетает» в общих модулях, обрабатывающих системные фоновые задания, обработчики ожидания или служебные механизмы БСП. Это превращает поиск нужной строки кода в настоящую проверку на терпение. Разберем подробно, почему так происходит и какие технические приемы позволяют эффективно обходить эти препятствия.
Прежде чем переходить к решениям, проанализируем ситуацию. В современных управляемых приложениях 1С постоянно выполняется огромное количество фоновых процессов. К ним относятся:
Когда мы нажимаем кнопку «Остановить», отладчик прерывает выполнение первой же инструкции, которая выполняется в данный момент в подключенных предметах отладки. С вероятностью 99% этой инструкцией окажется какой-нибудь циклический вызов в общем модуле, не имеющий отношения к вашей текущей задаче.
Рассмотрим наиболее надежный альтернативный метод поиска кода — Замер производительности. Если ручная остановка не помогает, замер позволит увидеть полную картину пройденного пути программы. Выполним следующие шаги:
Проанализируем открывшееся окно. Чтобы отсеять «шум» общих модулей, отсортируем таблицу по колонке «Количество раз». Модули, которые вызывались тысячи раз — это те самые фоновые обработчики, которые мешали нам при нажатии паузы. Наш же код будет иметь небольшое количество вызовов. Найдем в списке знакомые названия модулей нашей подсистемы или формы и двойным кликом перейдем к тексту программы. Это самый быстрый способ найти нужную строку, не «ловя» её вручную.
Часто проблема кроется в том, что конфигуратор автоматически подключается ко всем доступным процессам. Разберем, как ограничить область поиска:
-debug). В клиент-серверном варианте поведение отладчика отличается от файлового: в файловом варианте всё выполняется в одном процессе, и «поймать» нужный момент сложнее.Используя этот подход, мы заставляем кнопку «Остановить» игнорировать серверные фоновые процессы, концентрируясь только на текущем сеансе пользователя.
Даже если отладка остановилась в «неудобном» системном модуле, не спешите нажимать «Продолжить». Рассмотрим технику работы со стеком:
В момент остановки откроем окно Стек вызовов (Ctrl + Alt + C). Внимательно проанализируем иерархию вызовов. Часто оказывается, что системная процедура была вызвана из кода, инициированного пользователем. Прокрутим стек вниз до тех пор, пока не увидим знакомую процедуру (например, ПриЗаписи или обработчик команды). Двойной клик по этой строке перенесет нас в контекст нашего кода, даже если физически процессор сейчас выполняет код в общем модуле.
Если мы знаем, что наше действие приводит к записи документа или выводу сообщения, мы можем использовать «хитрые» точки останова. Вместо случайной паузы, установим точку останова в общем модуле, который точно вызывается, но добавим условие.
Например, найдем процедуру ОбщегоНазначения.СообщитьПользователю и установим там точку останова с условием:
ИмяПользователя() = "Иванов" И Найти(ТекстСообщения, "НужнаяФраза") > 0
Это позволит проигнорировать все фоновые вызовы других пользователей и системных процессов, остановившись ровно там, где нам нужно.
Выясним еще одну интересную возможность. Если мы ищем место, где логика программы нарушается, вместо «паузы» эффективнее использовать режим Остановка по ошибке.
В этом режиме 1С проигнорирует все корректно работающие фоновые модули и застынет именно в той строке, где возникает исключительная ситуация. Это часто помогает быстрее, чем попытки «поймать» выполнение вручную.
В некоторых случаях, если в коде предусмотрена возможность прерывания пользователем, мы можем использовать комбинацию клавиш Ctrl + Break. Для того чтобы это работало в нашем коде, полезно вставлять вызов метода ОбработкаПрерыванияПользователя() внутри длительных циклов:
Для Каждого Строка Из ТаблицаЦикла Цикл
ОбработкаПрерыванияПользователя();
// Логика обработки
КонецЦикла;
Если во время выполнения такого цикла нажать Ctrl + Break, система остановится, и если в конфигураторе включена отладка, она предложит перейти к строке кода. Это гораздо точнее, чем использование общей кнопки «Остановить».
Если вы работаете на платформе версии 8.3.20 и выше с использованием HTTP-отладки, у вас есть мощный инструмент — Фильтры объектов отладки. Разберем, как ими пользоваться:
В настройках отладки можно указать конкретные имена модулей или расширений, которые следует игнорировать. Если добавить модули БСП в список исключений, кнопка «Остановить» будет срабатывать только в тех модулях, которые не входят в фильтр. Это кардинально меняет опыт разработки, позволяя полностью игнорировать «шум» типовой конфигурации.
Подведем итог: ручная остановка через «паузу» в больших системах — инструмент ненадежный. Сочетайте использование Замера производительности для первичного поиска, Стека вызовов для навигации из системных модулей и фильтрации предметов отладки для отсечения фоновых задач. Такой комплексный подход позволит вам контролировать процесс выполнения кода в любой, даже самой сложной конфигурации.