Трассировка выполнения кода

Автор АЛьФ, 16 февраля 2024, 10:31

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

АЛьФ

Всплыла еще одна особенность трассировки.
В качестве исходного кода текущей строки возвращается именно та строка, на которую передается исполнение. Т.е. если, например, условие в Если разбито на несколько строк кода, то в трассировку попадет только первая.

АЛьФ

Мысли вслух.
Завис на получении возвращаемого из функции значения. Как-то хитро 1С хранит это значение. Ну, т.е. понятно, что для возвращаемого значения создается специальная служебная переменная "00<ИмяФункции>Val", но в перехвате OnExitProc мы находимся уже в процедуре, куда вернулись и переменные прошлой функции уже недоступны. Логика подсказывает, что возвращенное значение должно еще где-то быть, ведь в опкоде как-то присваивает локальной переменной возвращенное значение.

По ходу дела подумал, что можно получить прикольный эффект: добавить метод УстановитьВозвращаемоеЗначение, в котором служебной переменной будем присваивать нужное значение. В таком случае и Возврат не нужен.
Вот охренеет другой программист, пытаясь разобраться в таком коде...

Злоп

Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...

АЛьФ

Цитата: Злоп от 19 февраля 2024, 21:51Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...
Штатно вернет пустое значение неопределенного вида. Как если объявить переменную через "Перем", но не присваивать ей значения.

alyuev

Решил потестить трассировку. Сделал простую внешнюю обработку.

Процедура Сформировать()
	ЛокСерв=СоздатьОбъект("Сервис");
	ИмяЛога=ACLog+"Трассировка"+режТрасс+".txt";
	ЛокСерв.УровеньТрассировки(0, ИмяЛога);
	ЛокСерв.УровеньТрассировки(режТрасс, ИмяЛога);
	Стр=контТип(Контекст);
	Сообщить("Стр="+Стр);
	ЛокСерв.УровеньТрассировки(0, ИмяЛога);
КонецПроцедуры

Для режТрасс=3 в лог стало попадать всякие события и до конца заполнения не дождался. Сбросил процесс.

Вот кусок лога:

(OnNextLine)[04/03.2024 15:32:17.518][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][7][Сформировать] 	Стр=контТип(Контекст);
(OnEnterProc)[04/03.2024 15:32:17.518][00000001][Global Module][-1][контТип] 
	Аргументы:
		Конт: ГрупповойКонтекст
(OnNextLine)[04/03.2024 15:32:17.518][00000001][Global Module][728][контТип] 
(OnNextLine)[04/03.2024 15:32:17.518][00000001][Global Module][730][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][732][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][735][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][737][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][740][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][742][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][743][контТип] 
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][744][контТип] 
(OnNextLine)[04/03.2024 15:32:17.520][00000001][Global Module][745][контТип] 
(OnNextLine)[04/03.2024 15:32:17.520][00000001][Global Module][749][контТип] 
(OnEnterProc)[04/03.2024 15:32:18.911][ffffffff][D:\SPEEDFLOW\ACINI\CLASSES\__КЛАССФАБРИКАСОБЫТИЙ__.ERT][-1][СобытиеГМ_ПриНажатииЛевойКнопки] 
	Аргументы:
		Конт: 
		КШ: 0
		_X: 215
		_Y: 95
		ФлСО: 1
(OnNextLine)[04/03.2024 15:32:18.911][ffffffff][D:\SPEEDFLOW\ACINI\CLASSES\__КЛАССФАБРИКАСОБЫТИЙ__.ERT][1443][СобытиеГМ_ПриНажатииЛевойКнопки] 	СообщитьВОтладке("Событие_ПриНажатииЛевойКнопки КШ="+КШ+" _X="+_X+" _Y="+_Y);
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][СообщитьВОтладке] 
	Аргументы:
		Т: Событие_ПриНажатииЛевойКнопки КШ=0 _X=215 _Y=95
		Условие: 
		Маркер: 
(OnNextLine)[04/03.2024 15:32:18.912][00000001][Global Module][1483][СообщитьВОтладке] 	Если Отладка=1 Тогда
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][глКАШ] 
	Аргументы:
(OnNextLine)[04/03.2024 15:32:18.912][00000001][Global Module][1474][глКАШ] 		Возврат 0;
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][глСтатусКлавиши] 
	Аргументы:
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1462][глСтатусКлавиши] 	Перехватчик = СоздатьОбъект("Перехватчик");
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1468][глСтатусКлавиши] 	СообщитьВОтладке("Событие_ПриНажатииПравойКнопки КШ="+КШ+" _X="+_X+" _Y="+_Y);
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1469][глСтатусКлавиши] 	НажатаКнопкаМыши="правая";

При этом режТрасс=1 и 2 отрабатывают корректно, как мне кажется. Во лог для 2:

(OnNextLine)[04/03.2024 15:33:44.319][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][7][Сформировать] 	Стр=контТип(Контекст);
(OnEnterProc)[04/03.2024 15:33:44.320][00000001][Global Module][-1][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][728][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][730][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][732][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][735][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][737][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][740][контТип] 
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][742][контТип] 
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][743][контТип] 
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][744][контТип] 
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][745][контТип] 
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][749][контТип] 
(OnExitProc)[04/03.2024 15:33:44.321][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][-1][Сформировать] 
(OnNextLine)[04/03.2024 15:33:44.321][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][8][Сформировать] 	Сообщить("Стр="+Стр);
(OnNextLine)[04/03.2024 15:33:44.324][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][9][Сформировать] 	ЛокСерв.УровеньТрассировки(0, ИмяЛога);

Вот содержимое функции контТип():

Функция контТип(Конт) Экспорт
	Перем Путь,Имя,Вид;
	Если ТипЗначенияСтр(Конт)<>"ГрупповойКонтекст" Тогда
		Возврат ТипЗначенияСтр(Конт);
	КонецЕсли;
	Попытка
		Вид=Конт.ТекущийДокумент().Вид();
		Возврат "Документ";
	Исключение
	КонецПопытки;
	Попытка
		Вид=Конт.ТекущийЭлемент().Вид();
		Возврат "Справочник";
	Исключение
	КонецПопытки;
	Попытка
		Путь="";
		Имя="";
		Конт.РасположениеФайла(Путь, Имя);
		Возврат "ДФ";
	Исключение
	КонецПопытки;
	Возврат "Форма";
КонецФункции

Вместо контТип() пробовал другие, простые функции. На 1, 2 строки. Они отработали нормально в 3м режиме.

АЛьФ

Цитата: alyuev от 04 марта 2024, 18:46Решил потестить трассировку. Сделал простую внешнюю обработку.

Спасибо. Вроде поправил.