Работа с крупными типовыми или сильно кастомизированными конфигурациями часто подкидывает задачи, в которых поиск одной-единственной строки кода превращается в многочасовое приключение. Ситуация, когда реквизит формы заполняется «непонятно где» при открытии, знакома каждому разработчику. Пролистывание тысяч строк кода с помощью клавиши F11 — занятие неблагодарное и крайне неэффективное. В этой статье мы разберем комплексный подход к отладке, который позволит вам находить причины изменения данных за считанные минуты.
Рассмотрим ситуацию, когда в процедурах ПриСозданииНаСервере или ПриОткрытии выполняется огромный объем кода. Вместо того чтобы идти по шагам с самого начала, мы применим метод отсечения. Разберем этот алгоритм по шагам:
ПриСозданииНаСервере) и в самом конце.Повторяя эти действия, мы очень быстро сузим диапазон поиска до нескольких строк. Этот метод гораздо надежнее, чем простое чтение кода глазами, так как вы опираетесь на фактическое состояние данных в памяти 1С.
Проанализируем более продвинутый инструмент — точку останова с условием. Это незаменимый механизм, если вы точно знаете, какое значение должен принять реквизит, или хотите поймать момент, когда оно перестанет быть пустым.
Для настройки такой точки выполните следующие действия:
F9).Например, если мы ищем, где Объект.Сумма становится больше нуля, условие будет выглядеть так:
Объект.Сумма > 0
Важный нюанс: точка останова с условием сильно замедляет работу системы, так как платформе приходится вычислять выражение на каждой строке. Поэтому старайтесь ставить такие точки в местах, где вероятность изменения данных наиболее высока, а не на каждой строке модуля.
Выясним, как использовать Табло для мониторинга. Вы можете добавить интересующий вас реквизит в окно табло и просто нажимать F10 (переход через процедуру). Как только значение в строке табло изменится (оно подсветится синим или красным цветом в зависимости от версии платформы), вы поймете, что последняя выполненная строка и была причиной изменений.
Иногда прямой поиск по тексту Реквизит = не дает результатов. Разберем причины, почему так происходит:
ЗаполнитьЗначенияСвойств(). В этом случае имя вашего реквизита в коде может вообще не фигурировать как левая часть выражения присваивания.ЭтотОбъект["ИмяРеквизита"] = Значение.В таких ситуациях мы рекомендуем использовать глобальный поиск (Ctrl+Shift+F) не по точному совпадению, а по части имени метаданных, а также проверять все вызовы ЗаполнитьЗначенияСвойств, где ваша форма или объект выступают в роли приемника.
Рассмотрим ситуацию, описанную в сообщении №19: данные в форме есть, но запрос, скопированный из ДинамическийСписок, в консоли запросов ничего не возвращает. Это классическая проблема окружения.
Чтобы понять, как заполняется ДинамическийСписок, проанализируем следующие объекты:
Список.Параметры. Часто там программно устанавливаются границы периодов или ссылки на связанные объекты.Список.КомпоновщикНастроек.Настройки.Отбор. Там могут быть установлены фиксированные отборы, которые не видны в пользовательском интерфейсе, но жестко ограничивают выборку.ОсновнаяТаблица, платформа сама накладывает ограничения прав доступа (RLS). Попробуйте выполнить запрос под полными правами, чтобы исключить влияние безопасности.Когда кода слишком много, мы можем использовать «Замер производительности». Это «хитрый» способ увидеть карту выполненного кода:
В открывшемся окне вы увидите список всех процедур и функций, которые были реально вызваны. Отсортировав их по количеству вызовов, вы сможете быстро понять, в какие модули «заходила» программа, и исключить из анализа те ветки кода, которые вообще не исполнялись.
Проанализируем проблему отладки фоновых заданий, упомянутую в теме. Если при каждом останове у вас открываются новые окна конфигуратора, это признак включенного автоматического подключения.
Совет: используйте HTTP-отладку (доступна в современных версиях платформы 8.3). Она работает стабильнее. Если же вам нужно поймать конкретное фоновое задание, установите галочку «Фоновые задания» в настройках подключения, дождитесь остановки в нужном месте и сразу снимите её, чтобы не плодить лишние сессии отладки.
Подводя итог, можно сказать, что эффективная отладка — это не скорость нажатия на клавиши, а правильное сочетание инструментов: от дихотомии и условных точек до анализа компоновщика настроек и замера производительности. Используя эти методы в комплексе, вы сократите время поиска ошибки с нескольких часов до нескольких минут.