рубрики: Фишки | Дата: 13 января, 2019
Сегодня поговорим о трассировке кода в отладчике 1С:Предприятия 8 и о способах, которые могут нам в этом помочь в этом нелегком деле.
Если взять любую из современных типовых конфигураций 1С, то мы обнаружим в ней десятки тысяч строк кода разбросанных по общим модулям, модулям справочников, документов, их форм и т.д. Конечно весь этот код сгруппирован по процедурам и функциям, но если мы возьмем, например, такое событие как проведение документа, то обнаружим с десяток, а может быть и пару десятков процедур и функций задействованных в этом процессе. И человеческая голова просто физически не в состоянии вместить в себя весь этот калейдоскоп. И вполне естественно, что существуют инструменты, которые позволяют облегчить отслеживание пути выполнения кода.
После того как мы поставили точку останова и код на ней остановился, нам как правило бывает необходимо продолжить его выполнение до какого то момента.
Либо построчно, либо пропуская какие-то блоки. И здесь нам поможет блок команд из меню Отладка
Но как правило меню в работе не используется поскольку гораздо удобней пользоваться горячими клавишами. Давайте коротко рассмотрим список этих команд и сочетания горячих клавиш их вызывающих.
Эта команда выполняет строчку кода на которой установлен курсор и переходит к следующей строке. Если на пути встречается вызов функции, то при очередном нажатии на F11 мы проваливаемся в эту функцию где можем также продолжить построчное выполнение кода.
Эта команда также как и F11 выполняет код построчно, но не проваливается внутрь функций и процедур. То есть код вызываемой функции выполняется, а курсор переходит на следующую строчку в текущей функции. При этом внутрь условий и циклов эта команда заходит.
Допустим, что мы зашли в функцию по F11 и увидели, что ничего интересного в ней нет. Тогда можно спокойно нажать <Shift> + <F11> и выйти из этой функции в предыдущую.
Эта команда позволяет выполнить код от текущего положения указателя до места где установлен курсор. То есть если мы прокрутили вниз пару страниц кода от текущего положения указателя и увидели долгожданную строку кода и соответственно хотим дойти до нее, то просто кликаем мышью по этой строчке, чтобы установить на нее курсор и жмем <Shift> + <F10>.
Это сочетание клавиш позволяет перемещаться назад по истории процедур и функций. Когда в отладчике открыто около десятка закладок с различными модулями через которые пришлось пройти в процессе поиска необходимой строки, то очень трудно восстановить последовательность выполнения кода.
И эта команда позволяет просмотреть в обратном порядке последовательность выполнения процедур и функций.
Это сочетание клавиш позволяет перемещаться вперед по истории процедур и функций. То есть команда обратная предыдущей.
Нажав сочетание клавиш <Ctrl> + <Alt> + <C> или соответствующую кнопку в меню
мы можем открыть окно со стеком вызовов процедур и функций в котором отображается последовательность их выполнения.
По двойному щелчку на строчке в окне стека открывается соответствующий модуль и курсор позиционируется на строке из которой происходил вызов следующей процедуры (которая в окне стека вызовов стоит на строчку выше)
Зачастую возникает ситуация когда стек вызовов не отображает всех процедур и функций через которые прошло выполнение кода.
В частности это может происходить при наличии подписок на события. Давайте рассмотрим это на простейшем примере. Создадим простейшую обработку в которой будем выполнять установку нового кода для элемента справочника склады. В модуле формы у нас буде всего лишь две простых процедуры. Поставим точку останова на первой и последней строчке кода как показано на рисунке.
Дойдем до последней точки останова и посмотрим в окне стека вызовов какие процедуры и функции у нас вызывались.
Мы видим в окне стека всего лишь две процедуры модуля формы.
А теперь сделаем замер производительности. После остановки на первой точке останова начинаем замер производительности нажав на кнопку в меню
А на второй точке останова снова нажмем на кнопку с часами в результате чего у нас откроется окно замера производительности в котором будут видны функции и время их выполнения. И тут мы с удивлением можем обнаружить, что у нас выполнялась еще какая-то процедура из общего модуля.
А происходит это потому, что у нас для справочника Склады установлена подписка на событие ПриУстановкеНовогоКода
Таким образом, такой трюк позволяет в некоторых случаях выявить процедуры и функции, которые не отображаются в окне стека, но тем не менее выполняются. Конечно при этом мы используем замер производительности не по его прямому назначению. И минусом здесь является то, что замер производительности упорядочивает процедуры и функции не в порядке их выполнения, а по времени выполнения. Но в некоторых случаях такой нестандартный способ может здорово выручить.
Перепробовал многое и EI и ИР, но реально полезно, трассировка замером. Благодарю