Имя: Пароль:
1C
 
Отменить транзакцию = в этой транзакции уже были ошибки
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) Вызватьисключение(ОписаниеОшибки()) надо и тебе все станет ясно