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

07.04.25

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

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

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

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

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

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

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

 

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3318    Abysswalker    7    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6169    DeerCven    15    

57

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

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

21.05.2024    48208    dimanich70    83    

169

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

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

1 стартмани

18.03.2024    7257    6    John_d    13    

59

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

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

12.02.2024    60141    atdonya    31    

69

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

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

30.11.2023    9034    ke.92@mail.ru    17    

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

СтрокаСтека = "";
Попытка
	ВызватьИсключение "ФормированиеСтекаВызовов";
Исключение
	МассивСтека = СтрРазделить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Символы.ПС);
	Для Сч = 2 По МассивСтека.ВГраница() Цикл 
		СтрокаСтека = СтрокаСтека + МассивСтека[Сч] + Символы.ПС;
	КонецЦикла;
КонецПопытки;
Показать
8. SerVer1C 997 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 64 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 64 17.04.25 15:10 Сейчас в теме
(5) В моей ситуации это было нужно чтобы отправить сообщение в мессенджер и понять в каких ситуациях такое может случаться. Т.е. я как-бы сделал ловушку и мне нужно раскрутить стек, чтобы понять из какой функции такая ситуация могла быть вызвана. Так как это логическая ошибка, а не ошибка платформы и не ошибка типовых механизмов (например, отказ записи), то обычный журнал не поможет.
6. aleksey2 91 09.04.25 07:06 Сейчас в теме
10. victor_goodwill 64 17.04.25 15:11 Сейчас в теме
(6)
Не вижу причин, чтобы не работало. Должно
12. aleksey2 91 17.04.25 15:51 Сейчас в теме
(10) Как минимум стрРазделить, и у стек пустой.
14. Angel_19 6 23.04.25 11:19 Сейчас в теме
Начиная с платформы 8.3.15 в Журнал регистрации базы 1С и в операторе "Попытка ... Исключение ... КонецПопытки" возможно увидеть полный стек вызовов всех процедур, а не только вызов последней строки как было раньше.
В старых платформах там только последняя строка вызова и получить таким образом стэк вызовов невозможно.
aleksey2; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация