Получение стека вызовов в 1С

07.04.25

Разработка - Универсальные функции

Метод для получения стека вызовов путем искусственной генерации исключений и перехвата его. Сам стек получается из платформенной функции ПодробноеПредставлениеОшибки(). Стек можно получать как текстом, так и массивом строк.

Периодически требуется к сообщению о той или иной ошибке, не вызванной исключением, а скорее логикой приложения, прикрепить стек вызовов, для того, чтобы можно было понять откуда был вызов той или иной функции (например, можно логировать стек при записи объекта, когда происходит что-то непонятное и нужно отловить, какой процесс это делает)

В самой платформе нет прямого способа получить это (или я не нашел). Я думал, что можно через Причину полученную из ИнформацияОбОшибке() раскрутить стек, но у меня там возвращает неопределено. Если кто-то знает способ все-таки вытащить информацию оттуда (ведь как-то это делает ПодробноеПредставлениеОшибки, то буду рад узнать

Благодаря статье //infostart.ru/1c/articles/1879817/, которая решает немного другую задачу, я написал для себя функцию получения стека - более универсальную.

Функция ПолучитьСтекВызовов() Экспорт 
	
	Стек = "Стек вызовов :" + Символы.ПС; 
	Попытка
		а = 1 / 0;	
	Исключение
		ПодробноеПредставление	= СтрЗаменить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "Деление на 0", "");
		СтекМассив = СтрРазделить(ПодробноеПредставление, Символы.ПС);
		Для Сч = 3 По СтекМассив.Количество() - 1 Цикл 
			Стек = Стек + СтекМассив[Сч] + Символы.ПС;
		КонецЦикла;
	КонецПопытки;
	
	Возврат Стек;
КонецФункции

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

 

Можно также получить и вернуть массив строк стека, не преобразуя его к единой строке, чтобы анализировать построчно. Также можно "выдернуть" из каждой строки отдельные составляющие - имя модуля, номер строки, исходную строку. Это все несложно сделать при желании. У меня пока такой потребности не было. 

Буду надеяться, этот пример будет кому-то полезен.

Платформа Стек вызовов Обработка ошибок Логирование Системные функции

См. также

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    31924    dimanich70    83    

153

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    5109    6    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    36402    atdonya    29    

62

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6717    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    18457    YA_418728146    8    

172

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4950    80    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    20060    192    sapervodichka    113    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. solinik 08.04.25 07:24 Сейчас в теме
Небольшой рефакторинг:

СтрокаСтека = "";
Попытка
	ВызватьИсключение "ФормированиеСтекаВызовов";
Исключение
	МассивСтека = СтрРазделить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Символы.ПС);
	Для Сч = 2 По МассивСтека.ВГраница() Цикл 
		СтрокаСтека = СтрокаСтека + МассивСтека[Сч] + Символы.ПС;
	КонецЦикла;
КонецПопытки;
Показать
8. SerVer1C 886 15.04.25 00:56 Сейчас в теме
(1) Ещё рефакторинг
Попытка
	ВызватьИсключение "";
Исключение
	МассивСтека = СтрРазделить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Символы.ПС);
	МассивСтека.Удалить(0);МассивСтека.Удалить(0);МассивСтека.Удалить(0);
	СтрокаСтека = СтрСоединить(МассивСтека, Символы.ПС);
КонецПопытки;
2. ivrent 08.04.25 07:26 Сейчас в теме
Нельзя искусственно создавать исключительные ситуации. У сервера есть механизм перезапуска rphostов при большом % исключение от общего числа вызовов
Aleskey_K; +1 Ответить
3. YokoYolo 4 08.04.25 17:26 Сейчас в теме
(2) Интересно. А можно где-то об этом почитать?
4. ivrent 08.04.25 18:27 Сейчас в теме
(3) раньше была настройка в кластере "Допустимое отклонение количества ошибок сервера", сейчас оно не настраивается, или жёстко зашито, или рассчитывается. Точно не помню. Думаю, в руководстве по администрированию сервера написано
7. YokoYolo 4 09.04.25 09:10 Сейчас в теме
11. victor_goodwill 62 17.04.25 15:12 Сейчас в теме
(4) Думаю тут речь об ошибках платформы типа нехватка памяти или обращение к неверному адресу памяти или что-то вроде того. А тут происходит обычное исключение. Тем более оно будет вызываться именно в исключительных случаях, а не постоянно. Так что не вижу ничего против использования этого подхода
13. ivrent 21.04.25 13:18 Сейчас в теме
(11)
Работа с памятью - один из показателей.
В руководстве по администрированию говорится о количестве событий ТЖ с типом EXCP. Исключение из статьи как раз будет являться EXCP
5. Jungle Murzik 09.04.25 01:15 Сейчас в теме
Зачем стек вызова выводить пользователю?
А если эта информация нужна только для разработчиков, используйте другие инструменты, например, технологический журнал в копии базы при воспроизведении ошибки
9. victor_goodwill 62 17.04.25 15:10 Сейчас в теме
(5) В моей ситуации это было нужно чтобы отправить сообщение в мессенджер и понять в каких ситуациях такое может случаться. Т.е. я как-бы сделал ловушку и мне нужно раскрутить стек, чтобы понять из какой функции такая ситуация могла быть вызвана. Так как это логическая ошибка, а не ошибка платформы и не ошибка типовых механизмов (например, отказ записи), то обычный журнал не поможет.
6. aleksey2 89 09.04.25 07:06 Сейчас в теме
10. victor_goodwill 62 17.04.25 15:11 Сейчас в теме
(6)
Не вижу причин, чтобы не работало. Должно
12. aleksey2 89 17.04.25 15:51 Сейчас в теме
(10) Как минимум стрРазделить, и у стек пустой.
14. Angel_19 6 23.04.25 11:19 Сейчас в теме
Начиная с платформы 8.3.15 в Журнал регистрации базы 1С и в операторе "Попытка ... Исключение ... КонецПопытки" возможно увидеть полный стек вызовов всех процедур, а не только вызов последней строки как было раньше.
В старых платформах там только последняя строка вызова и получить таким образом стэк вызовов невозможно.
Оставьте свое сообщение