При отладке сложных конфигураций разработчики часто сталкиваются с ситуацией, когда значение определенного реквизита объекта или переменной непредвиденно меняется в неизвестном месте конфигурации. Возникает логичный вопрос: можно ли настроить отладчик так, чтобы выполнение программы останавливалось в момент, когда реквизит принимает заданное значение, без привязки к конкретной строке модуля?
Разберем архитектурные особенности платформы 1С:Предприятие, выясним, почему глобальная точка останова по данным не поддерживается напрямую, и рассмотрим практические способы решения этой задачи.
В некоторых низкоуровневых средах разработки существует концепция точек останова по данным (watchpoints или data breakpoints). Они отслеживают обращения к конкретной области оперативной памяти на уровне процессора или виртуальной машины. В платформе 1С:Предприятие архитектура устроена иначе:
Если вам известен примерный участок кода, процедура или алгоритм, в котором модифицируются данные, стандартным решением является использование точки останова с условием. Этот механизм поддерживается платформой с ранних версий.
Разберем по шагам, как настроить такую точку останова:
Объект.Статус = Перечисления.СтатусыЗаказов.Отменен.Отладчик остановит исполнение кода на этой строке только тогда, когда заданное выражение примет значение Истина.
Если код выполняется в цикле или вызывается из множества вспомогательных процедур, можно применить подход с программной проверкой и генерацией исключения.
Рассмотрим пример вспомогательного кода, который можно временно разместить в подозрительных местах алгоритма:
Если Объект.Реквизит = НужноеЗначение Тогда
ВызватьИсключение "Чекпоинт: обнаружено изменение реквизита";
КонецЕсли;
Для перехвата этого момента выполним следующие действия:
Когда реквизит принадлежит прикладному объекту (документу, справочнику) и требуется выяснить, откуда именно он сохраняется с некорректным значением во всей конфигурации, наиболее универсальным решением является использование подписки на событие.
Проанализируем порядок действий:
ДокументОбъект.ЗаказКлиента).ПередЗаписью.
Процедура ПроверитьЗначениеРеквизитаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.НужныйРеквизит = ЗначениеПроверки Тогда
// Ставим обычную точку останова на следующую строку
ТестоваяПеременная = Истина;
КонецЕсли;
КонецПроцедуры
Этот способ гарантированно перехватывает запись объекта из любого места конфигурации: интерактивные действия пользователя, внешние обработки, веб-сервисы или регламентные задания. При срабатывании точки останова внутри условия окно Стек вызовов покажет исходную точку инициации записи.
Если поведение воспроизводится исключительно под рабочей нагрузкой, в многопоточной среде или в фоновых заданиях, где подключение отладчика затруднено, используем Технологический журнал (ТЖ).
Настроим сбор событий с флагом контекста в конфигурационном файле logcfg.xml:
Context.