Как настроить отладчик 1С, чтобы он не останавливался в системных блоках Попытка-Исключение

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

При отладке сложных механизмов, таких как синхронизация данных через универсальный формат или работа с БСП (Библиотека стандартных подсистем), разработчики часто сталкиваются с проблемой "шумной" отладки. Когда мы включаем режим "Остановка по ошибке", конфигуратор начинает прерывать исполнение на каждом системном блоке Попытка — Исключение. Особенно это раздражает в общих модулях типа ДлительныеОперации, где исключения являются штатным способом проверки готовности фонового задания.

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

Решение 1. Отключение фонового выполнения через параметры запуска

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

Разберем по шагам, как это настроить:

  1. Откроем конфигуратор и перейдем в меню Сервис — Параметры.
  2. Перейдем на закладку Запуск 1С:Предприятия, далее на подпункт Дополнительные.
  3. В поле Параметр запуска введем строку: /C РежимОтладки.

Проанализируем, что это дает. В модуле ДлительныеОперации (или аналогичных механизмах синхронизации) часто встречается код проверки:


// Если приложение запущено с параметром /C РежимОтладки, 
// запуск выполняется не в фоне, а сразу в основном потоке.
Если ПараметрыСеанса.ПараметрыКлиентаНаСервере.Свойство("РежимОтладки") Тогда
    // Прямой вызов процедуры вместо запуска фонового задания
КонецЕсли;

Использование этого флага позволяет избежать попадания в блок Задание.ОжидатьЗавершения(), который постоянно генерирует исключения при превышении таймаута ожидания.

Решение 2. Фильтрация остановок по тексту ошибки

Если нам все же необходимо использовать режим "Остановка по ошибке", мы можем ограничить список исключений, на которых должен реагировать отладчик. В платформе 1С нельзя напрямую указать "не останавливайся здесь", но можно составить "белый список" разрешенных текстов ошибок.

Рассмотрим, как это работает:

  1. В конфигураторе зайдем в меню Отладка — Настройка остановки по ошибке.
  2. Убедимся, что установлен флаг Останавливаться по ошибке.
  3. В нижней части окна найдем поле для добавления текстов ошибок.

Важный нюанс: если этот список пуст, отладчик прерывается на любом исключении. Как только вы добавите туда хотя бы одну строку, отладчик будет игнорировать все ошибки, текст которых не совпадает с вашим фильтром. Если вы знаете, что ваша ошибка содержит фразу "Ошибка при записи объекта" или "Поле объекта не обнаружено", добавьте эти фразы в список. Все системные "попытошники" из БСП (например, проверка версии формата или ожидание задания) будут проигнорированы.

Решение 3. Временная модификация кода («Проброс» исключения)

Иногда ошибка происходит глубоко в коде, и она "проглатывается" пустым блоком Исключение, из-за чего объект (например, контрагент при синхронизации) просто не создается, не оставляя следов в Журнале регистрации. Чтобы найти это место, не останавливаясь в каждом модуле, мы можем временно изменить код в "шумных" местах.

Если мы видим, что отладка постоянно "валится" в определенном месте БСП, которое нам не интересно, мы можем временно закомментировать там блок Попытка или добавить принудительную генерацию ошибки, чтобы понять контекст. Рассмотрим пример модификации:


Попытка
    КомпонентыОбмена.Вставить("ВерсияФормата", МенеджерОбмена.ВерсияФормата());
Исключение
    // Вместо стандартного замалчивания, пишем это, чтобы пройти мимо при отладке:
    // Или временно комментируем Попытку, чтобы увидеть реальный стек, если ошибка тут.
    КомпонентыОбмена.Вставить("ВерсияФормата", "1");
КонецПопытки;

Однако более эффективным будет использование метода ВызватьИсключение с передачей текущей информации об ошибке, если вы хотите, чтобы отладчик остановился только тогда, когда ошибка "настоящая".

Решение 4. Точки останова с условием против "тихого удаления"

Выясним причину ситуации, когда объект "бесшумно удаляется" или создается битая ссылка. Часто это происходит из-за того, что какой-то механизм внутри Попытки выполняет Отказ = Истина или вызывает Удалить().

Вместо глобальной остановки по ошибке, разберем метод установки условной точки останова:

  1. Найдем процедуру ПередЗаписью или ПриЗаписи интересующего нас объекта.
  2. Поставим точку останова.
  3. Нажмем на нее правой кнопкой мыши и выберем Условие.
  4. Пропишем условие, например: ОбменДанными.Загрузка = Истина И Наименование = "НужныйКонтрагент".

Это позволит нам не отвлекаться на системные ошибки и остановиться ровно в тот момент, когда данные начинают обрабатываться механизмом синхронизации.

Решение 5. Использование 1C:Enterprise Development Tools (EDT)

Если стандартный конфигуратор не справляется с вашими задачами по фильтрации, рассмотрим возможность использования EDT. В этой среде разработки на базе Eclipse механизмы отладки значительно мощнее.

В EDT можно настраивать точки останова на исключения (Exception Breakpoints) с гораздо большей гибкостью:

Резюме

Для эффективной отладки синхронизации и других механизмов БСП придерживайтесь следующего алгоритма:

  1. Всегда используйте /C РежимОтладки в параметрах запуска, чтобы "вытащить" код из фоновых заданий.
  2. Если используете "Остановку по ошибке", добавьте в список фильтров хотя бы одну строку, специфичную для вашей проблемы, чтобы отсечь системный "мусор".
  3. Если объект пропадает бесследно, используйте точки останова с условием в методах записи объектов, а не глобальный перехват ошибок.
← На главную