Профессия — 1С

Рукопашный бой Карташ

Категории

Трассировка кода

рубрики: Фишки | Дата: 13 Январь, 2019

Сегодня поговорим о трассировке кода в отладчике 1С:Предприятия 8 и о способах, которые могут нам в этом помочь в этом нелегком деле.




Если взять любую из современных типовых конфигураций 1С, то мы обнаружим в ней десятки тысяч строк кода разбросанных по общим модулям, модулям справочников, документов, их форм и т.д. Конечно весь этот код сгруппирован по процедурам и функциям, но если мы возьмем, например, такое событие как проведение документа, то обнаружим с десяток, а может быть и пару десятков процедур и функций задействованных в этом процессе. И человеческая голова просто физически не в состоянии вместить в себя весь этот калейдоскоп. И вполне естественно, что существуют инструменты, которые позволяют облегчить отслеживание пути выполнения кода.

Пошаговая отладка

После того как мы поставили точку останова и код на ней остановился, нам как правило бывает необходимо продолжить его выполнение до какого то момента.




Либо построчно, либо пропуская какие-то блоки. И здесь нам поможет блок команд из меню Отладка
меню отладка
Но как правило меню в работе не используется поскольку гораздо удобней пользоваться горячими клавишами. Давайте коротко рассмотрим список этих команд и сочетания горячих клавиш их вызывающих.

  • <F11> — Пошаговое выполнение кода

    Эта команда выполняет строчку кода на которой установлен курсор и переходит к следующей строке. Если на пути встречается вызов функции, то при очередном нажатии на F11 мы проваливаемся в эту функцию где можем также продолжить построчное выполнение кода.

  • <F10> — Пошаговое выполнение кода в пределах функции

    Эта команда также как и F11 выполняет код построчно, но не проваливается внутрь функций и процедур. То есть код вызываемой функции выполняется, а курсор переходит на следующую строчку в текущей функции. При этом внутрь условий и циклов эта команда заходит.

  • <Shift> + <F11> — Выход из текущей процедуры

    Допустим, что мы зашли в функцию по F11 и увидели, что ничего интересного в ней нет. Тогда можно спокойно нажать <Shift> + <F11> и выйти из этой функции в предыдущую.

  • <Shift> + <F10> — Выполнить код до курсора

    Эта команда позволяет выполнить код от текущего положения указателя до места где установлен курсор. То есть если мы прокрутили вниз пару страниц кода от текущего положения указателя и увидели долгожданную строку кода и соответственно хотим дойти до нее, то просто кликаем мышью по этой строчке, чтобы установить на нее курсор и жмем <Shift> + <F10>.

  • <Ctrl> + <-> — Переход назад по истории окон

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




    И эта команда позволяет просмотреть в обратном порядке последовательность выполнения процедур и функций.

  • <Shift> + <Ctrl> + <-> — Переход вперед по истории окон

    Это сочетание клавиш позволяет перемещаться вперед по истории процедур и функций. То есть команда обратная предыдущей.

Стек вызовов

Нажав сочетание клавиш <Ctrl> + <Alt> + <C> или соответствующую кнопку в меню
Кнопка стека вызовов
мы можем открыть окно со стеком вызовов процедур и функций в котором отображается последовательность их выполнения.
Окно стека процедур
По двойному щелчку на строчке в окне стека открывается соответствующий модуль и курсор позиционируется на строке из которой происходил вызов следующей процедуры (которая в окне стека вызовов стоит на строчку выше)

Замер производительности для просмотра вызываемых процедур

Зачастую возникает ситуация когда стек вызовов не отображает всех процедур и функций через которые прошло выполнение кода.




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

Дойдем до последней точки останова и посмотрим в окне стека вызовов какие процедуры и функции у нас вызывались.
Стек вызова процедур формы
Мы видим в окне стека всего лишь две процедуры модуля формы.

А теперь сделаем замер производительности. После остановки на первой точке останова начинаем замер производительности нажав на кнопку в меню
Начало замера производительности
А на второй точке останова снова нажмем на кнопку с часами в результате чего у нас откроется окно замера производительности в котором будут видны функции и время их выполнения. И тут мы с удивлением можем обнаружить, что у нас выполнялась еще какая-то процедура из общего модуля.

А происходит это потому, что у нас для справочника Склады установлена подписка на событие ПриУстановкеНовогоКода
Подписка на событие

Таким образом, такой трюк позволяет в некоторых случаях выявить процедуры и функции, которые не отображаются в окне стека, но тем не менее выполняются. Конечно при этом мы используем замер производительности не по его прямому назначению. И минусом здесь является то, что замер производительности упорядочивает процедуры и функции не в порядке их выполнения, а по времени выполнения. Но в некоторых случаях такой нестандартный способ может здорово выручить.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2019г. Профессия — 1С. Обмен опытом по программированию в 1С