|
Отменить транзакцию = в этой транзакции уже были ошибки | ☑ | ||
---|---|---|---|---|
0
Tateossian
30.11.17
✎
11:28
|
Всем привет! Делаю следующую схему. Имеется свой (нетиповой) документ. Но частично движения при проведении можно получить из типового. Чтобы не усложнять код (да и просто потому что я ленивый) иду следующим путем: начинаю транзакцию, создаю новый типовой документ при проведении, заполняю его упрощенно, провожу, получаю движения на выходе и делаю отменить транзакцию. Я такую схему делал несколько раз (но не при проведении) и никогда не было проблем, а нынче получаю ошибку: в данной транзакции уже были ошибки. Из чего я делаю вывод, что системой ОтменитьТранзакцию() трактуется как ошибка. Почему? И как обойти это? Можно, конечно, создать новый документ, а потом его удалить, но это еще более грубое решение... Использовать экспортные функции нет возможности, так как придется повторять почти всю реализацию типового документа.
|
|||
1
Рэйв
30.11.17
✎
11:39
|
Вложенная транзакция -зло
|
|||
2
Tateossian
30.11.17
✎
11:46
|
(1) Это понятно. Но почему ОтменитьТранзакцию() трактуется как ошибка?
|
|||
3
Рэйв
30.11.17
✎
11:48
|
(2)транзакция - это таже самая Попытка. ОтменитьТранзакцию() вызывает Исключение как и у попытки, что в Попытке трактуется как ошибка
|
|||
4
YFedor
30.11.17
✎
11:49
|
начинаю транзакцию, создаю новый типовой документ при проведении - вообще не понял кто на ком стоял
|
|||
5
vicof
30.11.17
✎
11:50
|
Потому что при нормальной ситуации транзакции не откатываются. А если воспринимать это как нормальную ситуацию, база данных может придти в не работоспособном состояние.
|
|||
6
Tateossian
30.11.17
✎
11:52
|
(5) Чего это вдруг придет в неработоспособоное состояние?
|
|||
7
vicof
30.11.17
✎
11:52
|
Допустим, во вложенной транзакции я создал элемент справочника, потом понял, что он мне не нужен, транзакции отменил. Потом в основной начал обращаться к этому элементу. А его уже нет в базе.
|
|||
8
Tateossian
30.11.17
✎
11:53
|
(3) Тогда зачем в букваре написано, что канонично нужно делать
Попытка НачатьТранзакцию() Исключение ОтменитьТранзакцию() КонецПопытки ЗафиксироватьТранзакцию() ? Это ж получается масло масляное. |
|||
9
vicof
30.11.17
✎
11:53
|
(7) транзакции отменил*
|
|||
10
Tateossian
30.11.17
✎
11:54
|
(7) Тогда это будет ошибка. Это контролируемое поведение.
|
|||
11
vicof
30.11.17
✎
11:54
|
Мля, т9. Вложенную транзакцию отменил
|
|||
12
Рэйв
30.11.17
✎
11:56
|
(8)Ну, оно не на 100% одно и тоже ведь.Просто ОтменитьТранзакцию() и Исключение имеют одинаковый эффект с точки зрения try-catch
|
|||
13
Borteg
30.11.17
✎
12:12
|
(0) Я так понимаю что вся транзакция обернута в попытку, при записи происходит невосстановимая ошибка, но так как транзакция обернута в попытка, то код продолжает работать, но при следующем обращение к БД происходит вышеупомянутая ошибка
Для того чтобы отловить ошибку в попытке пиши исключение Вызватьисключение(ОписаниеОшибки()). Кстати подход без исключения неправильный. |
|||
14
Borteg
30.11.17
✎
12:12
|
(0) Ошибка гдето в проведении типового документа.
|
|||
15
Tateossian
30.11.17
✎
12:14
|
(13) Я и так и так делал, и с ВызватьИсключение() - результат одинаковый.
|
|||
16
Tateossian
30.11.17
✎
12:16
|
(14) Вот, кстати, эту гипотезу я не проверял. Ты меня натолкнул на мысль, спасибо.
|
|||
17
ptiz
30.11.17
✎
12:16
|
В 1С нет вложенных транзакций. Откат может быть только всех транзакций сразу.
|
|||
18
Borteg
30.11.17
✎
12:19
|
(15) ВызватьИсключение напишет на какой строке кода произошла ошибка, а так ты сможешь отловить только ошибка в методе записать, а где ищи свищи сам.
|
|||
19
Borteg
30.11.17
✎
12:23
|
(18) (15) Вызватьисключение(ОписаниеОшибки()) надо и тебе все станет ясно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |