При отладке сложных механизмов, таких как синхронизация данных через универсальный формат или работа с БСП (Библиотека стандартных подсистем), разработчики часто сталкиваются с проблемой "шумной" отладки. Когда мы включаем режим "Остановка по ошибке", конфигуратор начинает прерывать исполнение на каждом системном блоке Попытка — Исключение. Особенно это раздражает в общих модулях типа ДлительныеОперации, где исключения являются штатным способом проверки готовности фонового задания.
В этой статье мы разберем несколько стратегий, которые позволят нам "проскочить" ненужные системные остановки и сосредоточиться на поиске реальной ошибки в коде.
Одной из главных причин постоянных остановок является механизм ожидания фоновых заданий. В БСП заложен удобный инструмент: если программа понимает, что она запущена в режиме отладки со специальным ключом, она выполняет код не в фоне, а непосредственно в текущем сеансе. Это избавляет от необходимости перехватывать фоновые задания и убирает лишние системные исключения в модуле ДлительныеОперации.
Разберем по шагам, как это настроить:
/C РежимОтладки.Проанализируем, что это дает. В модуле ДлительныеОперации (или аналогичных механизмах синхронизации) часто встречается код проверки:
// Если приложение запущено с параметром /C РежимОтладки,
// запуск выполняется не в фоне, а сразу в основном потоке.
Если ПараметрыСеанса.ПараметрыКлиентаНаСервере.Свойство("РежимОтладки") Тогда
// Прямой вызов процедуры вместо запуска фонового задания
КонецЕсли;
Использование этого флага позволяет избежать попадания в блок Задание.ОжидатьЗавершения(), который постоянно генерирует исключения при превышении таймаута ожидания.
Если нам все же необходимо использовать режим "Остановка по ошибке", мы можем ограничить список исключений, на которых должен реагировать отладчик. В платформе 1С нельзя напрямую указать "не останавливайся здесь", но можно составить "белый список" разрешенных текстов ошибок.
Рассмотрим, как это работает:
Важный нюанс: если этот список пуст, отладчик прерывается на любом исключении. Как только вы добавите туда хотя бы одну строку, отладчик будет игнорировать все ошибки, текст которых не совпадает с вашим фильтром. Если вы знаете, что ваша ошибка содержит фразу "Ошибка при записи объекта" или "Поле объекта не обнаружено", добавьте эти фразы в список. Все системные "попытошники" из БСП (например, проверка версии формата или ожидание задания) будут проигнорированы.
Иногда ошибка происходит глубоко в коде, и она "проглатывается" пустым блоком Исключение, из-за чего объект (например, контрагент при синхронизации) просто не создается, не оставляя следов в Журнале регистрации. Чтобы найти это место, не останавливаясь в каждом модуле, мы можем временно изменить код в "шумных" местах.
Если мы видим, что отладка постоянно "валится" в определенном месте БСП, которое нам не интересно, мы можем временно закомментировать там блок Попытка или добавить принудительную генерацию ошибки, чтобы понять контекст. Рассмотрим пример модификации:
Попытка
КомпонентыОбмена.Вставить("ВерсияФормата", МенеджерОбмена.ВерсияФормата());
Исключение
// Вместо стандартного замалчивания, пишем это, чтобы пройти мимо при отладке:
// Или временно комментируем Попытку, чтобы увидеть реальный стек, если ошибка тут.
КомпонентыОбмена.Вставить("ВерсияФормата", "1");
КонецПопытки;
Однако более эффективным будет использование метода ВызватьИсключение с передачей текущей информации об ошибке, если вы хотите, чтобы отладчик остановился только тогда, когда ошибка "настоящая".
Выясним причину ситуации, когда объект "бесшумно удаляется" или создается битая ссылка. Часто это происходит из-за того, что какой-то механизм внутри Попытки выполняет Отказ = Истина или вызывает Удалить().
Вместо глобальной остановки по ошибке, разберем метод установки условной точки останова:
ПередЗаписью или ПриЗаписи интересующего нас объекта.ОбменДанными.Загрузка = Истина И Наименование = "НужныйКонтрагент".Это позволит нам не отвлекаться на системные ошибки и остановиться ровно в тот момент, когда данные начинают обрабатываться механизмом синхронизации.
Если стандартный конфигуратор не справляется с вашими задачами по фильтрации, рассмотрим возможность использования EDT. В этой среде разработки на базе Eclipse механизмы отладки значительно мощнее.
В EDT можно настраивать точки останова на исключения (Exception Breakpoints) с гораздо большей гибкостью:
Для эффективной отладки синхронизации и других механизмов БСП придерживайтесь следующего алгоритма:
/C РежимОтладки в параметрах запуска, чтобы "вытащить" код из фоновых заданий.