Не получается обработать исключение внутри транзакции
8.2
В общем модуле есть процедура1, в ней начинается транзакция, в которой вызывается функция1.
В фукнции1 есть цикл, в котором в Попытке создаются документы. И в случае, если при создании и проведении документа возникает ошибка, то я попадаю в Исключение, но обработать его не могу, потому что работа останавливается с сообщением "В данной транзакции уже происходили ошибки", т.о. я не могу ни записать ошибку в лог, ни вывести ее на экран. Более того после обработки исключения по задумке мы возвращаем в процедуру1 ответ, получив который, должны отменить транзакцию и отправить письмо на электронную почту. Но понятно, что до этого момента не доходит из-за "В данной транзакции уже происходили ошибки".
Есть ли в такой ситуации все-таки возможность "красиво" обработать исключение?
В общем модуле есть процедура1, в ней начинается транзакция, в которой вызывается функция1.
В фукнции1 есть цикл, в котором в Попытке создаются документы. И в случае, если при создании и проведении документа возникает ошибка, то я попадаю в Исключение, но обработать его не могу, потому что работа останавливается с сообщением "В данной транзакции уже происходили ошибки", т.о. я не могу ни записать ошибку в лог, ни вывести ее на экран. Более того после обработки исключения по задумке мы возвращаем в процедуру1 ответ, получив который, должны отменить транзакцию и отправить письмо на электронную почту. Но понятно, что до этого момента не доходит из-за "В данной транзакции уже происходили ошибки".
Есть ли в такой ситуации все-таки возможность "красиво" обработать исключение?
По теме из базы знаний
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2/3.0
- Безопасная работа с транзакциями во встроенном языке
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Правила работы с транзакциями 1С
- Загрузи кучу данных и подчисти хвосты
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) Там тысячи строк кода :)
Если в двух словах - то так:
Если в двух словах - то так:
Процедура Процедура1()
НачатьТранзакцию();
...
Если Не Функция1() Тогда
ОтменитьТранзакцию();
ОтправитьПисьмо("Ошибка");
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли
КонецПроцедуры
Функция1()
...
Для Сч = 1 По КоличествоДокументов Цикл
... //Создание и заполнение документа
Попытка
НовыйДокумент.Записать();
Исключение
Сообщить(ОписаниеОшибки());
ЗаписатьВЛог(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки
КонецЦикла;
Возврат Истина;
КонецФункции
Показать
(10)
В примере я привел простейший пример кода.
В реальной реализации в обработке исключения попытки выдается и другая информация, кроме самого описания ошибки, сгенерированной системой, и эта информация доступна только во "внутренней" функции и для каждого типа документа (или другого объекта) она своя.
Попытку перенести на уровень основной транзакции. Соответственно в исключении получать ошибку и делать с ней что нужно
В примере я привел простейший пример кода.
В реальной реализации в обработке исключения попытки выдается и другая информация, кроме самого описания ошибки, сгенерированной системой, и эта информация доступна только во "внутренней" функции и для каждого типа документа (или другого объекта) она своя.
(11) обработкой исключения внутри функции для каждого документа просто скрываете ошибку и основная ошибка далее не идет.
Тогда в основной функции все равно делайте попытку и обрабатывайте там исключение, а в обработке исключения по документам пробрасывайте исключение дальше. Можно со своим текстом ошибки, который получит основной обработчик исключения в основной попытке.
Тогда в основной функции все равно делайте попытку и обрабатывайте там исключение, а в обработке исключения по документам пробрасывайте исключение дальше. Можно со своим текстом ошибки, который получит основной обработчик исключения в основной попытке.
С 1С ИТС пример
Правильно
Правильно
НачатьТранзакцию();
Попытка
РегистрыСведений.КурсыВалют.УстановитьИспользованиеИтогов(Ложь);
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(ВалютаСсылка);
НаборЗаписей.Загрузить(ТаблицаКурсов);
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
РегистрыСведений.КурсыВалют.УстановитьИспользованиеИтогов(Истина);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Показать
(6) В примере транзакция и попытки в рамках одной процедуры.
У меня транзакция одна на множество процедур и функций - обусловлено решаемой задачей.
Остается попробовать начало и фиксацию транзакции оставить в общей процедуры, а отменять ее при необходимости в каждой "внутренней" процедуре и функции.
У меня транзакция одна на множество процедур и функций - обусловлено решаемой задачей.
Остается попробовать начало и фиксацию транзакции оставить в общей процедуры, а отменять ее при необходимости в каждой "внутренней" процедуре и функции.
и еще. По хорошему транзакцию начинать нужно для записи уже подготовленных для записи документов.
Сначала создаете коллекцию ДокументОбъект с заполненными данными. Потом открываете транзакцию и в цикле проходите коллекцию и записываете.
Время транзакции желательно делать как можно меньше.
Сначала создаете коллекцию ДокументОбъект с заполненными данными. Потом открываете транзакцию и в цикле проходите коллекцию и записываете.
Время транзакции желательно делать как можно меньше.
(15) Я это знаю. Но вопрос специфики решаемой задачи. В транзакции не только создаются документы, до их создания еще записывается в разные регистры полученные извне данные, на основании которых и заполняются документы. И только в случае успешного выполнения всего кода данные должны попасть в БД. Поэтому это все в одной транзакции, и в 99% случаев она выполняется регламентно в то время, когда с БД никто не работает.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот