Имя: Пароль:
1C
1С v8
v8: Подскажите плз по сохранению данных в исключениях
,
0 megabax
 
16.06.12
18:31
Добрый день.
Пытасюь в обработчике исключения записать задачу (что бы уведомить юзера о сбоях)
Вот как я это делаю:
   Исключение
       ОтменитьТранзакцию();
       лОписаниеОшибки    = ОписаниеОшибки();
       ЗаписатьВЛог(ИмяФайлаЛога, лОписаниеОшибки);
       лТекстОшибки="Ошибка в заявке для ";// + Строка(ПЗОбъектСтрока.ПЗОбъект.Получатель) + " " + Строка(ПЗОбъектСтрока.ПЗОбъект.ДоговорКонтрагента);
       СоздатьУведомление(лОписаниеОшибки, лТекстОшибки, ПЗОбъектСтрока.ПЗОбъект, Ссылка);
       Сообщить(лОписаниеОшибки, СтатусСообщения.ОченьВажное);
       Сообщить("Ошибка в заявке для " + Строка(ПЗОбъектСтрока.ПЗОбъект.Получатель) + " " + Строка(ПЗОбъектСтрока.ПЗОбъект.ДоговорКонтрагента));
       БПОбъект.ПричинаРучнойОбработки    = Справочники.битПричиныРучнойОбработкиЗаявокПокупателя.ОшибкаВТранзакции;
       БПОбъект.Сообщение                = лОписаниеОшибки;
       БПОбъект.Записать();
       Возврат;
   КонецПопытки;

запись делается в
процедура СоздатьУведомление(АТекстОшибки, АКомментарий, АПЗ, АЗаявка)
   ЗадачаОбъект=Задачи.битУведомлениеОСбоях.СоздатьЗадачу();    
   ЗадачаОбъект.Дата=ТекущаяДата();
   //ЗадачаОбъект.Заявка=АЗаявка;
   ЗадачаОбъект.Комментарий=АКомментарий;
   ЗадачаОбъект.Наименование="Сбой: "+АТекстОшибки;
   //ЗадачаОбъект.ПЗ=АПЗ;
   ЗадачаОбъект.РольИсполнителя=Справочники.РолиИсполнителей.битПолучательУведомленийОСбоях;
   ЗадачаОбъект.Записать();
конецпроцедуры

на строке ЗадачаОбъект.Записать();
вылетает с сообщением "В данной транзакции уже произошли ошибки. Подскажите плз, как лечить?
1 shuhard
 
16.06.12
18:33
(0) и рыбку съесть(транзакцию откатить) и задачу записать

пиши в журнал или E-mail пошли юзеру
2 megabax
 
16.06.12
18:36
1, а больше никак?
3 shuhard
 
16.06.12
18:44
(2) всё зависит от твоей фантазии:
можешь использовать ADODB, TCP/IP, файловые системы
4 DJ Anthon
 
16.06.12
18:45
а что, вне исключения нельзя задачу записать?
5 DJ Anthon
 
16.06.12
18:46
и исключение разве не отменяет транзакцию?
6 Mashinist
 
16.06.12
18:53
Вынести создание задачи за попытку

       Ошибка = Ложь;
...
Исключение
       ОтменитьТранзакцию();
       ...
       Ошибка = Истина;
КонецПопытки;
Если Ошибка Тогда
    СоздатьУведомление(АТекстОшибки, АКомментарий, АПЗ, АЗаявка)
КонецЕсли;
7 megabax
 
16.06.12
18:57
6, а, понятно, спасибо
8 mistеr
 
16.06.12
19:00
(0) Представляю, сколько задач посыпется на бедных юзеров из-за какого-нибудь косяка в коде.
9 megabax
 
18.06.12
11:16
Сделал вот так:
   //отдельная транзакция для проведения
   БылаОшибка=ложь;
   НачатьТранзакцию();
   Попытка
       ПЗОбъектСтрока.ПЗОбъект.Записать(РежимЗаписиДокумента.Проведение);
   исключение
       лОписаниеОшибки    = ОписаниеОшибки();
       ОтменитьТранзакцию();
       БылаОшибка=истина;
       ЗаписатьВЛог(ИмяФайлаЛога, лОписаниеОшибки);
       //СоздатьУведомление(лОписаниеОшибки, лТекстОшибки, ПЗОбъектСтрока.ПЗОбъект, Ссылка);
       //Сообщить(лОписаниеОшибки, СтатусСообщения.ОченьВажное);
       //Сообщить("Ошибка в заявке для " + Строка(ПЗОбъектСтрока.ПЗОбъект.Получатель) + " " + Строка(ПЗОбъектСтрока.ПЗОбъект.ДоговорКонтрагента));
       //БПОбъект.ПричинаРучнойОбработки    = Справочники.битПричиныРучнойОбработкиЗаявокПокупателя.ОшибкаВТранзакции;
       //БПОбъект.Сообщение                = лОписаниеОшибки;
       //БПОбъект.Записать();
       //Возврат;
   конецпопытки;
   
   если БылаОшибка тогда
       //СоздатьУведомление(лОписаниеОшибки, лТекстОшибки, ПЗОбъектСтрока.ПЗОбъект, Ссылка);        
       СоздатьУведомление(лОписаниеОшибки, лТекстОшибки, 0, 0);        
       возврат;
   иначе
       ЗафиксироватьТранзакцию();
   конецесли;

процедура СоздатьУведомление(АТекстОшибки, АКомментарий, АПЗ, АЗаявка)
   ЗадачаОбъект=Задачи.битУведомлениеОСбоях.СоздатьЗадачу();    
   ЗадачаОбъект.Дата=ТекущаяДата();
   //ЗадачаОбъект.Заявка=АЗаявка;
   ЗадачаОбъект.Комментарий=АКомментарий;
   ЗадачаОбъект.Наименование="Сбой: "+АТекстОшибки;
   //ЗадачаОбъект.ПЗ=АПЗ;
   ЗадачаОбъект.РольИсполнителя=Справочники.РолиИсполнителей.битПолучательУведомленийОСбоях;
   ЗадачаОбъект.Записать();
конецпроцедуры

все равно вылетает при попытке записать задачу. Что еще можно сделать?
10 ssh2006
 
18.06.12
11:23
Делай теперь уведомление об ошибке при создании уведомления об ошибке

> Что еще можно сделать?

Выяснить причину ошибки при создании задачи-уведомления,
11 megabax
 
18.06.12
11:38
10, дык я вроде как все правильно делаю: говорю
ЗадачаОбъект.Записать();

а в ответ получаю "В данной транзакии уже произошли ошибки".
Какая тут может быть причина ошибка? Может кто знает?
12 ssh2006
 
18.06.12
11:46
(11) значит код БылаОшибка=ложь;
   НачатьТранзакцию();
....

выполняется внутри другой транзакции