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