Использование исключений для определения стека выполнения кода

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

Мне нужно было вывести в печатную форму акта к требованию накладной суммы:

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

Но я не был уверен, что эта функция вызывается только из процедуры печати, поэтому добавил контроль стека:

&Вместо("ТаблицаСуммСписанияПоДокументу")
Функция дор_ТаблицаСуммСписанияПоДокументу(Знач ТаблицаСуммСписанияПоДокументам, Регистратор, ТаблицаМатериалы)
	Результат = ПродолжитьВызов(ТаблицаСуммСписанияПоДокументам, Регистратор, ТаблицаМатериалы);
	
	//Проверяем что процедура вызывается для печати акта на списание...
	Попытка
		ВызватьИсключение "";
	Исключение
		ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());  
		Если 
			Не Найти(ИнформацияОбОшибке, "УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию") ИЛИ 
			НЕ Найти(ИнформацияОбОшибке, """АктНаСписаниеМатериалов""") 
			Тогда
			Возврат Результат;
		КонецЕсли;
	КонецПопытки;     

	//Тут получаем суммы...	
	
	Результат.Очистить();
	
	Выборка = З.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		НСтр = Результат.Добавить();
		НСтр.Номенклатура = Выборка.Номенклатура;
		НСтр.Количество = Выборка.Количество;
		НСтр.Сумма = Выборка.Сумма;
	КонецЦикла;
	
	
	Возврат Результат;
	
КонецФункции

При этом в моем случае ИнформацияОбОшибке содержала текст:


{Доработки Документ.ТребованиеНакладная.МодульМенеджера(68)}:ВызватьИсключение "";
{Документ.ТребованиеНакладная.МодульМенеджера(1910)}:ТаблицаСуммСписанияПоДокументу = ТаблицаСуммСписанияПоДокументу(ТаблицаСуммСписанияПоДокументам, ВыборкаДокумент.Ссылка, Материалы);
{Доработки Документ.ТребованиеНакладная.МодульМенеджера(17)}:ДокументРезультат = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
{Документ.ТребованиеНакладная.МодульМенеджера(1317)}:УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "АктНаСписаниеМатериалов", "Акт на списание материалов",
{ОбщийМодуль.УправлениеПечатью.Модуль(3382)}:МенеджерПечати.Печать(ОбъектыСоответствующиеПечатнойФорме, ПараметрыПечати, ВременнаяКоллекцияДляОднойПечатнойФормы,
{ОбщаяФорма.ПечатьДокументов.Форма(797)}:ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов,
{ОбщаяФорма.ПечатьДокументов.Форма(56)}:КоллекцияПечатныхФорм = СформироватьПечатныеФормы(Параметры.ИменаМакетов, Отказ);

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ИсключениеВызванноеИзВстроенногоЯзыка]

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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *