Имя: Пароль:
1C
 
Как залогировать ошибку из прерванной транзакции проведения?
,
0 Euroset1
 
25.04.19
16:55
Мы в обработчике проведения документа. Записываем лог в регистр. Вдруг документ не проводится из-за ошибки и логи все подтираются, ибо выполнялись в той же транзакции. Как залогировать неудачное проведение документа из его обработчика проведения?
1 Вафель
 
25.04.19
17:01
пиши в ЖР, после можно из жр достать и записать в регистр
2 kortun
 
25.04.19
17:10
Ведите логи во внешней базе, в этом случае они не зависят от транзакций
3 Euroset1
 
25.04.19
17:12
А выполнить в фоне не справится с этой задачей?
4 Лефмихалыч
 
25.04.19
17:47
(0) выбросьте свой регистр на помойку истории. для логов предусмотрен журнал регистрации
5 Лефмихалыч
 
25.04.19
17:48
(3) нет
6 Euroset1
 
25.04.19
17:52
(5) да! фоновые задания помогли.
(4) мне не нужен ЖР
7 H A D G E H O G s
 
25.04.19
17:54
Посмотрим, что будет, когда конфу натянете  в продакшен.
8 Tonik992
 
25.04.19
18:06
(7) Что может произойти?
9 zehn
 
25.04.19
18:55
(7) Ну какой у ларька продакшн?
10 Cyberhawk
 
25.04.19
19:13
Можно разорвать транзакцию, в т.ч. и неявную, но это конечно же не комильфо. Так что только в фоновом задании пиши.
11 Лефмихалыч
 
25.04.19
19:29
(6) тебе показалось. Откат транзакции в фоновом задании тоже удалит на зафиксированные записи из регистра.
12 Лефмихалыч
 
25.04.19
19:32
а, или ты... хех, гениально...
В результате ты получил бесполезный лог с мусором. Ты будешь смотреть в него и не будешь знать, которые записи в нем про то, что зафиксировано, а которые - про то, что откатилось. А ЖР бы тебе сам автоматически и без усилий с твоей стороны и фоновых всяких заданий показал статус транзакции.
13 palsergeich
 
25.04.19
20:38
(12) Фоновое задание - это отдельный сеанс.
И откат транзакции в породившем сеансе никак не скажется на нем.
14 Лефмихалыч
 
25.04.19
20:46
(13) я в (11) решил, что автор всё решил в фонове вывести, а не только запись в лог. в (12) я догадался, что речь идет только про лог, но это шняга, а не решение
15 vde69
 
25.04.19
22:00
попытка
  начатьТранзакцию
    ....
    Если НадоВсеПрервать() Тогда
      ВызватьИстключение "Все пропало, ошибка 1234565432"
    КонецЕсли
    ....
  зафиксироватьтранзакцию
Исключение
  ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки())
КонецПопытки
16 vde69
 
25.04.19
22:02
попытка
  начатьТранзакцию
    ....
    Если НадоВсеПрервать() Тогда
      ВызватьИстключение "Все пропало, ошибка 1234565432"
    КонецЕсли
    ....
  зафиксироватьтранзакцию();
Исключение
  ЕслиТранзакцияАктивна() Тогда
    ОтменитьТранзакцию()
  КонецЕсли;
  ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки())
КонецПопытки
17 Tonik992
 
25.04.19
22:30
(16) В обработке проведения это не прокатит.
18 vde69
 
25.04.19
22:53
(17) прокатит... если так

попытка
  начатьТранзакцию
    оДок.Записать(); // скрытая транзакция
    Если НадоВсеПрервать() Тогда
      ВызватьИстключение "Все пропало, ошибка 1234565432"
    КонецЕсли
    ....
  зафиксироватьтранзакцию();
Исключение
  ЕслиТранзакцияАктивна() Тогда
    ОтменитьТранзакцию()
  КонецЕсли;
  ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки())
КонецПопытки
19 palsergeich
 
25.04.19
23:13
(18) В обработке проведения фиксировать транзакцию бесполезно, потому что она в идет в рамках открытой транзации.
20 palsergeich
 
25.04.19
23:17
(18) По факту это будут вложенные транзакции и они зафиксируются в момент фиксации транзакции самого верхнего уровня.
Но если во время вложенной ошибки происходила невозобновимая ошибка, то при следующем обращении к БД и будет сообщение - в данной транзакции уже происходили ошибки.
В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня
21 palsergeich
 
25.04.19
23:19
По этому именно транзакционные процедуры надо писать по стандарту, тогда не будет критических ошибок во вложенных транзакциях и этих дурацких бесполезных сообщений - в данной транзакции уже происходили ошибки.
22 Cyberhawk
 
26.04.19
09:09
(20) "В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня" // Не только откатится, а еще и упадет в необрабатываемое исключение с ошибкой "В данной транзакции уже происходили ошибки". Поэтому для гарантированной записи лога в том же сеанса надо "Если ТранзакцияАктивна()" заменить на "Пока ТранзакцияАктивна()", о чем в (10) уже было сказано )
23 Euroset1
 
26.04.19
12:14
Для истории: С фоновым заданием прокатило на ура.

Напоминаю, что задача состояла в том, чтобы залогировать неудачную отправку данных в оракл, когда при этом наш документ не должен провестись. То есть внешняя система что-то сделала, а наша система не сделала. В фоне логи пишутся.

а ЖР в таких случаях использовать не комильфо, ибо он находится отдельно от SQL сервера, там, где жесткий диск слабее. Так как ЖР не все ведут, или чистят его каждый месяц. Ну и так далее.
24 Cyberhawk
 
26.04.19
15:21
(23) Конечно использовать ЖР тогда, когда лог надо _гарантированно_ заиметь, не так надежно, как сразу писать в БД
25 vde69
 
26.04.19
21:12
(20) (22) звените, но Вы не правы...

пример в 18 полностью рабочий, по сколько сохранение в лог идет ВНЕ транзакции, тут нет асинхронности
26 palsergeich
 
26.04.19
21:19
(25) ну ты имеешь ввиду запуск фонового к примеру? Тогда да
27 palsergeich
 
26.04.19
21:19
Просто если назвать процедуру Вне транзакции, это не значит, что она будет именно вне транзакции)
28 vde69
 
26.04.19
21:26
(27) приведи пример когда это так....

не забываем две вещи
1. транзакции привязаны к сеансу и имеют ИД
2. в рамках одного сеанса одновременно может быть только одна транзакция
29 palsergeich
 
26.04.19
21:30
(28) вы немного не поняли что я хотел сказать.
Забей в общем, я верю, что ты все сделаешь правильно, в отличии от ТС.
30 Cyberhawk
 
26.04.19
22:14
(26) Он как обычно бакланит, т.е. не понял даже простых слов