Хотелка: имя исполняемого контекса (модуля, функции, процедуры)

Автор Злоп, 13 марта 2024, 10:07

« назад - далее »

Злоп

Хочется получать имя процедуры, типа
АляСписок = Сервис.ПолучитьИмяИсполнения();
возвращается 2 параметра,
- "Функция" или "Процедура" или "Модуль" (если исполняется код вне процедур/функций)
- имя Функции/Процедуры/Модуля (в случае модуля возвращается или пусто или полный путь модуля)
.
в трассировке же как-то получается определить что исполняется...
.
Используется для упрощенного протоколирования, я обычно в начале/конце процедцры для пишу
Сообщить("Процедура Тармпапамапам() НАЧАЛО тут чтото")
Сообщить("Процедура Тармпапамапам() КОНЕЦ тут чтото")

АЛьФ

Можно получить из Сервис::ПолучитьСтекВызова()

ПолучитьСтекВызова()
Синтаксис:
ПолучитьСтекВызова()
Назначение:
Возращает таблицу значений с текущим стеком вызова процедур. Таблица имеет колонки:
ПолноеИмяМодуля
ВнутреннееИмяМодуля
ИДМодуля
ИмяПроцедуры
НомерИсполняемойСтроки

АЛьФ

Могу добавить в возвращаемую ТЗ тип Функция/Процедура/Модуль.

Злоп

Цитата: АЛьФ от 13 марта 2024, 13:11Могу добавить в возвращаемую ТЗ тип Функция/Процедура/Модуль.
.
да, было бы самое оно.
А возвращается весь стек вызова (он может быть здоровый, и не всегд анадо весь стек, иногда - вот как мне - только верхнюю строку одну, иногда пару верхних)? возможно для ускорения (если это имеет смысл) - регулировать параметром? Типа
ПолучитьСтекВызова(0); // по уморлчанию = 0, весь стек
ПолучитьСтекВызова(1);
ПолучитьСтекВызова(10); // если стек меньше указанного получается - возвращается меньше...
.
если это конечно имеет смысл

АЛьФ

Цитата: Злоп от 13 марта 2024, 14:07А возвращается весь стек вызова (он может быть здоровый, и не всегд анадо весь стек, иногда - вот как мне - только верхнюю строку одну, иногда пару верхних)? возможно для ускорения (если это имеет смысл) - регулировать параметром? Типа
ПолучитьСтекВызова(0); // по уморлчанию = 0, весь стек
ПолучитьСтекВызова(1);
ПолучитьСтекВызова(10); // если стек меньше указанного получается - возвращается меньше...
.
если это конечно имеет смысл

Это не даст какого-то заметного выигрыша.

Злоп

Проверил. Есть непонятки. Картинки прикладываю.
.


.
Идентификатор модуля - что это такое? = -1 у меня... (отсутствует расшифровка/пояснение в ALS по значениям этой колонки)
.
Также есть колонка "Тип" (упоминание в ALS отсутствует) -с непонятными числовыми значениями, что это?
Ожидалось (в "постановке хотелки"), что будет колонка где для колонки "ИмяПроцедуры" будет выводиться соответственно что-то типа "Процедура" или "Функция" или "Модуль"
.
В самый конец модуля формы (внешняя обработка) поставил
ЯСервис = СоздатьОбъект("Сервис");
ТЗСтек = ЯСервис.ПолучитьСтекВызова();
ТЗСтек.ВыбратьСтроку(,"ТЗСТЕК модуль формы");
- ТЗ получается пустой, без строк - это ожидаемое поведение?

АЛьФ

Идентификатор модуля - это идентификатор внутреннего объекта конфигурации, которому принадлежит модуль. -1 - внешняя обработка.

Тип - это числовой тип функция или процедура. С вызовом из тела модуля ещё посмотрю.

Злоп

Цитата: АЛьФ от 16 марта 2024, 15:15Тип - это числовой тип функция или процедура.
Совсем непохоже. Если бы так было - то на картинке, где стек из трех ПРОЦЕДУР - "Тип" везде ожидается одинаковый..?

Дополнительные изыскания, проведенные "Во глубине сибирских руд Не пропадет ваш скорбный труд" ;-)
показывают, что в "Тип" скорее всего пихается сквозной номер строки кода модуля формы,
а "Номер исполняемой строки" - это как раз числовое значение "Тип" (1 = процедура, 2 = функция, ??=Модуль - ДОБАВИТЬ В ALS), т.е. перепутаны параметры просто.
.
Подумать - м.б. "правильнее" не числовые значения, а строковые? типа "Процедура", "Функция", "Модуль"...?
или ввести параметр
Сервис.ПолучитьСтекВызова(Параметр), где Параметр = 0 (ПО УМОЛЧАНИЮ) - числовые значения "Тип", Параметр = 1 - строковые значения "Тип"

АЛьФ

Да, там были перепутаны колонки. Переработал немного метод получения стека. Посмотри тестовую сборку.

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

Текстовый тип делать нет смысла. Это ж отладочный метод. В документацию постараюсь дописать про типы.

Злоп

Цитата: АЛьФ от 16 марта 2024, 15:15Идентификатор модуля - это идентификатор внутреннего объекта конфигурации, которому принадлежит модуль. -1 - внешняя обработка.
тоже бы неплохо включить в ALS
а интересно, если внешн.. обработку подгрузитьв МД (методом из формекса) - будет давать тоже -1,или будет давать внутренний ид?

АЛьФ

Цитата: Злоп от 16 марта 2024, 16:57
Цитата: АЛьФ от 16 марта 2024, 15:15Идентификатор модуля - это идентификатор внутреннего объекта конфигурации, которому принадлежит модуль. -1 - внешняя обработка.
тоже бы неплохо включить в ALS
а интересно, если внешн.. обработку подгрузитьв МД (методом из формекса) - будет давать тоже -1,или будет давать внутренний ид?
Будет давать внутренний ИД.

Злоп

Цитата: АЛьФ от 16 марта 2024, 16:40Переработал немного метод получения стека. Посмотри тестовую сборку.
Порядок колонок/параметры в возвращаемой ТЗ - норм.
ТЗ в модуле формы - так и осталась пустая.

АЛьФ

Цитата: Злоп от 16 марта 2024, 17:00ТЗ в модуле формы - так и осталась пустая.
Тьфу! Пока в одном месте чинил, в другом сломал.

АЛьФ


Злоп

Цитата: АЛьФ от 16 марта 2024, 17:14Посмотри сейчас.
Проверил - Процедура/Функция/Основной текст модуля = НОРМ