Как найти откуда вызывается процедура

Очень часто начинающие 1С программисты сталкиваются с такой проблема, когда не знают как узнать откуда была вызвана та или иная процедура или функция. Допустим во время работы программы вываливается ошибка, при переходе в конфигуратор открывается общий модуль и функция, в которую передаются не правильные параметры, в результате чего появляется ошибка. Соответственно что бы Вам устранить ошибку нужно найти место откуда она была вызвана. На самом деле тут все достаточно просто, сегодня на примере Демонстрационной версии конфигурации «Управление торговлей редакции 11» расскажу как узнать откуда была вызвана функция или процедура.

Как найти место в коде откуда была вызвана функция

Чаще всего такая проблема возникает когда функция или процедура расположенная в общем модуле. И так допустим 1С во время работы выдает ошибку и при переходе в конфигуратор открывает вот эту функцию (Скрин ниже). Для того чтобы узнать откуда она была вызвана необходимо поставить точку останова и запускаем 1С в режиме отладки.

Вызов функций и процедур

Выполняем действия которые приводят к появлению ошибки.

Как узнать откуда была вызвана функция 1С

После того как сработала точка останова, выделяем название функции, и на панели инструментов нажимаем на значок «Стек вызовов» если не можете его найти нажимайте сочетание клавиш «Ctrl+Alt+C».

Как узнать откуда была вызвана функция или процедура в 1С

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

Как узнать откуда была вызвана  процедура в 1С

В результате откроется то место программы откуда была вызвана искомая функция. Для того чтобы убедиться наверняка, можно выделить имя функции нажать «Shift+F9» и мы увидим объект перехода.

1С Как узнать откуда была вызвана функция/процедура

Как видите все достаточно просто, самое главное в этом деле никуда не торопиться и быть внимательными.

Так как я не являюсь гуру 1С программирования, могу в чем-то ошибаться, если нашли в статье не точность или ошибку сообщите, так же можете поделиться и свои опытом!

conf 

Подсветка текущего идентификатора

1tekId

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

Выделяются все идентикаторы у которых такое же имя.

Очень удобно для поиска идентификатора по тексту кода.

 Отладка под определенным пользователем

2otladkaPodPolz

 Позволяет запускать отладку под определенным пользователем.

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

 Работа с открытыми окнами в конфигураторе

3okna

Позволяет расположить окна в удобном виде.

Выделить их все и закрыть.

 И т.д.

 Форматирование текста кода

Выделить нужный фрагмент кода и нажать Alt+Shift+F

либо через меню:

4format p2

До

4format do

После

4format p

Предположим, вы дорабатываете незнакомую конфигурацию и в каком-то модуле вам попался неотформатированный текст. Вам трудно в нем разобраться и вы хотите улучшить его читаемость, да и вообще сделать более «приличным».
В этом случае вам не нужно вручную двигать строки текста с помощью клавиши Tab, так как это гораздо удобнее и быстрее сделать с помощью форматирования блока текста.
Для этого выделите этот фрагмент текста (или сразу весь модуль – Ctrl + A) и нажмите кнопку Форматировать (Alt + Shift + F) в командной панели Текст.

 Вывод списка всех процедур модуля + заготовки предопределенных процедур

5proc

 Вернуться в исходное место после команды “Перейти к определению”.

Во время анализа кода мы хотим посмотреть что за процедура или функция вызывается. Жмем ПКМ и выбираем перейти к определению и переходим к нужной процедуре/функции.

6perehod1 1

Но после просмотра функции мы хотим вернуться обратно. Для этого жмем “CTRL” + “-“:

6perehod2 2

Посмотреть где используется выделенная процедура/функция

6perehod3

 Откуда была вызвана процедура/функция? Стек вызовов.

Допустим что в этой процедуре у нас ошибка мы ставим точку останова, но видим что в процедуру уже поступают неверные параметры. 

7steck1

Нужно узнать откуда была вызвана данная процедура. Вызываем стек вызовов:

7steck2

 Видим все процедуры из которорых мы перешли к текущей:

7steck3

Вырезать часть кода в отдельную процедуру/функцию

У нас есть код:

8 1

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

Для этого выделим нужную часть, вызовем контекстное меню и сделаем так:

8 2

Результат:

8 3

 Закладки и перейти к строке.

Бывает что код достаточно большой и нужно “прыгать” от одного места к другому.

Искать место глазами совсем неудобно.

Лучше воспользоваться следующими инструментами.

1 Переход к строке.

Запоминаем номер строки, он написан в правой нижней части экрана

9 0

Жмем в любом месте этого модуля кнопку или сочетание клавиш

9

2 Закладки

В нужной строке жмем Alt+F2 либо через меню

9 1

Переход по закладкам горячие клавиши:

F2 – Следующая закладка

Shift+F2 – Предыдущая закладка

Остановить отладчик до наступления ошибки.

Отладчик будет остановлен на строке на которой будет ошибка.

10 1

10 2

наш код:

10

Проверим что скажет отладчик.

10 3

и остановит процедуру на нужной строке

10 4

Вычислять выражение не меняя код.

В контекстном меню при остановке отладчика есть команда “Вычислить выражение”. Shift+F9

11 1

Появившиеся окно

11 2

В поле “Выражение” мы можем написать любой код и тут же получить ответ. Например:

11 3

Контекстная подсказка по параметрам

podskParam

Принудительно вызвать обычную контекстную подсказку: CTRL+Пробел

При изменении объекта метаданных отключить автоматический поиск ссылок на него.

Инструмент безусловно полезный, но нужен он не всегда.

refact 1

Отключается в Сервис-Параметры. Убрать галочки в группе “Рефакторинг при изменениях в метаданных и формах”:

refact 2

Подробнее об этом инструменте можно почитать тут.

Перейти от окна к объекту в дереве конфигурации

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

Горячие клавишы CTRL+T позволяют тут же перейти из окна к объекту в дереве конфигурации

ctrl T

Еще рекомендации по работе в конфигураторе от 1С 

Продолжение следует..

1с конфигуратор – это среда разработки и администрирования информационных баз программы 1с Предприятие.

Окно 1с конфигуратора

1с Конфигуратор используется в основном программистами для создания,  корректировки программных модулей и объектов конфигурации, а также системными администраторами для выполнения административных функций, таких как создание и восстановление резервных копий программы, тестирование и исправление базы данных и других. Простые пользователи работают и вносят данные в режиме “1с Предприятие”.

Окно запуска 1с

Как запустить 1с конфигуратор:

  1. Запустить программу 1с: Предприятие
  2. Выбрать нужную информационную базу или создать новую
  3. Нажать кнопку “Конфигуратор”
  4. Ввести логин и пароль пользователя с административными правами (если требуется)

Обзор  возможностей меню 1с конфигуратора:

Меню 1с конфигуратора

Меню “Файл” предназначено для работы с различными файлами поддерживаемыми 1с (внешние отчеты и обработки, текстовые, табличные, графические, HTML документы …), а также просмотра и печати выбранных документов. 


Меню “Правка” предназначено для редактирования, поиска, замены информации в модулях ,формах, свойствах, объектах программы.

меню Правка

Если нужно найти какое-то слово или словосочетание в тестах конфигурации используем команду Глобальный поиск

Вводим нужное словосочетание, выбираем область, настройки поиска и нажимаем кнопку “Искать”.

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


Если Вы работаете с программным модулем  то становится доступно Меню “Текст” программы 1с конфигуратор, которое позволяет настраивать и форматировать текстовые модули, добавлять запросы к объекта информационной базы итд.

меню Текст

Например, чтобы сделать код встроенного языка 1с удобно читаемым –  его можно отформатировать через меню Текст-Блок-Форматировать.

Вот пример кода до форматирования:

1с код до форматирования

Выделяем нужный участок кода, выбираем команду “Форматировать”

форматировать код 1с

Вот результат форматирования:

отформатированный код 1с


При помощи команд Меню “Конфигурация” Вы можете производить различные манипуляции с текущей конфигурацией .

меню Конфигурация

Что такое Конфигурация

– по сути это программа созданная при помощи 1с конфигуратора, содержащая описание структуры таблиц базы данных и алгоритмы работы с этими данными.

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

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

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

Основные команды меню Конфигурация:

  • Открыть конфигурацию, для дальнейшей работы с объектами информационной базы
  • Сохранить конфигурацию  и  Обновить конфигурацию– сохранение и обновление Конфигурации БД из основной конфигурации 
  • Поддержка – Обновление – обновлении конфигурации из конфигурации поставщика из интернета или из файлов cf, cfu
  • Сохранение конфигурации в файл cf
  • Загрузка конфигурации из файла cf с заменой текущей конфигурации
  • Сравнение , объединение конфигурации из файла – сравнение конфигураций и добавление изменений из файла cf
  • Проверка конфигурации на ошибки

Если вы работаете с обычными формами, то при их разработке доступно меню Форма.

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


Меню Отладка содержит команды для работы со встроенным отладчиком 1с.

меню отладка

Отладчик 1с нужен для тестирования программного кода 1с. Для его работы необходимо запустить 1с в режиме отладки. После этого можно останавливаться в произвольном месте программного кода (установить точку останова) и проверять значения которые принимают различные переменные или объекты.

Как посмотреть значения объектов в режиме отладки

  • Если это переменная то система выдает значение в подсказке при наведении курсора на переменную

Установить точку останова можно:

  • в конкретном месте ( кликнуть дважды на поле, слева от поля ввода кода (или нажать кнопку F9).Отображается как красный кружок слева от кода.
  • по условию ( когда будет выполнено определенное условие,например переменная  Номер равно 10) . Отображается как синий кружок с вопросом слева от кодаУсловие остановки
  • по ошибке (в случае возникновения ошибки, текст ошибки можно указать)Остановка по ошибке

Как узнать откуда вызвана процедура или функция ?

Чтобы узнать откуда была вызвана та или иная процедура или функция  в 1С предусмотрена специальная функция — «Стек вызовов». Для запуска Стека вызовов необходимо нажать горячие клавиши — Ctrl + Alt + C или через меню (Отладка — Стек вызовов).

С помощью него Вы можете узнать, откуда была вызвана процедура или функция  и с какими параметрами:

Стек вызовов

В процессе отладки можно двигаться и отслеживать изменения по строкам (по шагам) после активации точки останова.Для того чтобы сделать шаг к следующей строке, необходимо нажать кнопку «F11″(Шагнуть в). Когда Вы находитесь в режиме пошаговой отладки слева от кода появляется стрелка:

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


Рассмотрим основные команды меню Администрирование

меню Администрирование

Поделиться ссылкой:

Похожие записи

Я
   qazokm

15.04.15 – 07:49

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

   alexmobile

1 – 15.04.15 – 07:52

Запускать отладчик табу не позволяет?

   lxndr

2 – 15.04.15 – 08:13

контрл+альт+цэ!

   Aleksandr N

3 – 15.04.15 – 08:36

(0) Поиск по конфигурации, наверно.

   qazokm

4 – 15.04.15 – 08:45

спасибо

   dmpl

5 – 15.04.15 – 08:46

(0) Элемент в параметрах вызова указывает, какой элемент вызвал обработчик.

   dmpl

6 – 15.04.15 – 08:47

+(5) А вообще, есть проверка конфигурации на отсутствующие обработчики.

   vde69

7 – 15.04.15 – 08:54

в отладчике стек вызова….

но работает не всегда, например можно увидеть “неизвестный модуль”, или если вызов системный (например в бизнес процесах) вообще ничего не увидишь…

   DES

8 – 15.04.15 – 08:56

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

   vde69

9 – 15.04.15 – 09:03

(8) ты не прав…

открываем форму, сначало выполнится обработчик “передоткрытием” а по выходу из него ты попадешь “приОткрытии”..

   vde69

10 – 15.04.15 – 09:06

в целях отладки я себе добавлял подобный код…

// это только для отладки, для понимания с каким именно объектом “задача” мы работаем

НоваяЗадачаОбьект.ДополнительныеСвойства.Вставить(“ID_ОбъектаВПамяти”, “Источник обьекта – бизнесс процесс “”Согласование”””);

  

Defender aka LINN

11 – 15.04.15 – 09:08

(0) “запускать дебугер, тоже не вариант” – Батюшка не велит?

Есть громоздкий код, выполняю его отладку. Есть метод, который часто вызывается из разных мест. Можно ли по точке останова узнать, откуда он был вызван? Или может можно вернуться назад по шагам?

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 8 сен 2015 в 10:29

iRumba's user avatar

3

Посмотреть откуда был вызван метод можно в окне Debug → Windows → Call Stack

В нем же можно просмотреть значения локальных переменных в вызывающих методах. И даже поставить брекпойнт на момент возврата в вызывающий метод – например, выбрав Main на скриншоте и нажав F9 (прямо в этом окне, а не в исходнике Main).

введите сюда описание изображения

“Отмотать назад” тоже можно.

Но только в Visual Studio Enterprise 2015 при заранее влюченной опции сборки информации о вызовах (Tools/Options/IntelliTrace/events and call information)

Debug → Windows → IntelliTrace Calls:

введите сюда описание изображения

ответ дан 8 сен 2015 в 10:36

Дополнение к другим ответам: Если вы не хотите каждый раз останавливать программу, попробуйте просто залогировать строку

new System.Diagnostics.StackTrace().ToString();

Например,

System.Diagnostics.Debug.WriteLine(new System.Diagnostics.StackTrace().ToString());

распечатает текущий стек в окно отладки Output.

ответ дан 8 сен 2015 в 10:39

VladD's user avatar

VladDVladD

206k27 золотых знаков289 серебряных знаков521 бронзовый знак

1

В дополнение к сказанному, можно создать специальный метод для трассировки, вложить его во все диагностируемые методы. Атрибут CallerMemberName (.NET 4.5) поможет определить вызывающий метод.

Пример с MSDN:

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:UsersusernameDocumentsVisual Studio 2012ProjectsCallerInfoCSCallerInfoCSForm1.cs
//  source line number: 31

p.s. так же можно просто добавить нужные атрибуты в параметры диагностируемого метода, и передавать их в метод трассирови, либо сразу выводить через System.Diagnostics.Debug или System.Diagnostics.Trace.

ответ дан 8 сен 2015 в 11:23

Alexis's user avatar

AlexisAlexis

3,4664 золотых знака31 серебряный знак56 бронзовых знаков

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