Имя: Пароль:
1C
1С v8
Транзакция внутри попытки
0 Fannasankh
 
18.10.17
09:54
Кто-нибудь использовал конструкцию вида такого вида?
Ошибка = Ложь;
Попытка
НачатьТранзакцию();
что-то делаем;
Если НЕ Ошибка Тогда
ЗафиксироватьТранзакцию
Иначе
ОтменитьТранзакцию()
КонецЕсли;
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
Что-то делаем;
КонецПопытки;

Может ли привести к каким-то проблемам?
1 Ненавижу 1С
 
гуру
18.10.17
09:57
Если ошибка не связана с работой транзакции, то ты об этом не узнаешь, например деление на ноль
2 Fannasankh
 
18.10.17
09:59
(1) имелось ввиду, возможно ли падение программы при такой конструкции? Предполагается, что причины ошибки фиксируются в "что-то делается"
3 vde69
 
18.10.17
10:16
на вскидку - вроде все очень даже правильно сделано, я подобные конструкции постоянно использую
4 Ёпрст
 
гуру
18.10.17
10:22
(0)Проблема только одна - бездумное втыкание транзакции, где она вообще не нужна, это 99% проблем.
5 Cyberhawk
 
18.10.17
10:24
6 Fannasankh
 
18.10.17
10:25
(4) она там точно нужна
7 Ёпрст
 
гуру
18.10.17
10:40
(6) сомневаюсь
8 Fannasankh
 
18.10.17
10:44
(7) почему же? Там происходит проведение ряда документов по данным из другой базы. В момент проведения любого может возникнуть ошибка или что-то такое. И нужно откатиться будет.
9 rphosts
 
18.10.17
10:47
(0)нет вывода никакой инфы юзеру о проблемах - это уже жирный минус.
10 dezss
 
18.10.17
10:56
(9) как нету?
ведь есть Что-то делаем; после исключения...вот там оно и будет...вот прям стопудова...я хорошо думаю о людях, пока они не докажут обратное)
11 Ёпрст
 
гуру
18.10.17
10:59
(8) вот-вот. Явное втыкание одной большой транзакции туда, куда не надо.
12 Fannasankh
 
18.10.17
11:01
(11) Ну а как тогда правильно? Есть определенный ответ от внешнего источника. Мы его или получаем или откатываемся к моменту до получения.
13 dezss
 
18.10.17
11:01
(11) а почему не надо?
а как тогда отменить создание кучи связанных сущностей, если где-то в коде произошла ошибка?
14 Лефмихалыч
 
18.10.17
11:02
(0) код, который после попытки, может скопытиться с формулировкой "В данной транзакции уже происходили ошибки"
15 Cyberhawk
 
18.10.17
11:04
(14) Ну это если код выполняться будет во внешней какой-нибудь транзакции, у автора видимо такого нет )
16 Fannasankh
 
18.10.17
11:05
(14) а что для этого должно произойти?
17 Лефмихалыч
 
18.10.17
11:05
(15) ты это как определил? Обычно такие костыли лежат в модуле, который вызывается из модуля, который вызывается ПриЗаписи. Это же "haha classic"!
18 Ёпрст
 
гуру
18.10.17
11:05
(12) ты проводишь 200 документов в одной большой транзакции, не провёлся один - ты откатываешь транзакцию.
В этот момент (в момент твоей транзакции, база нервно курит в сторонке)

Вопрос, и нафига оно надо ? Потом повторно опять проводить 200 документов, заместо одного ?

(13) они не связаны
19 Лефмихалыч
 
18.10.17
11:06
(16) в (5) описано
20 Fannasankh
 
18.10.17
11:06
(18) не 200. А около 4-5. Цепочка вида: Заказ-Реализация-Корректировка... что-то вроде того.
21 dezss
 
18.10.17
11:07
(18) судя по (20) таки связаны
22 Cyberhawk
 
18.10.17
11:09
(17) Не, у меня перед глазами картина такая, что код автора работает выделенно (внешняя обработочка какая-нибудь или кнопка)
23 Fannasankh
 
18.10.17
11:12
(17) нет. Это вызывается регламентным заданием, отдельная процедура.
24 Лефмихалыч
 
18.10.17
11:30
(23) иногда бывает, что транзакции начинаются и неявно.
В общем, тебе виднее. Мне добавить нечего.
25 youalex
 
18.10.17
11:38
(20) А не логичнее будет обернуть в Попытку только запись документа, а при исключении - отменять транзакцию и выходить из цикла/функции или что там.
26 Остап Сулейманович
 
18.10.17
11:50
(0) Вообще непонятна вложенность.
Классика жанра :

НачатьТранзакцию();
...
Попытка
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
КонецПопытки

То есть внутри попытка-исключение действия при успешному / неуспешном выполнению транзакции. А не все внутри попытки.
27 Остап Сулейманович
 
18.10.17
11:54
+ (26) То есть в попытку завернуть только потенциально опасные действия. А не все.
28 бомболюк
 
18.10.17
11:55
(27) "..." надо тоже в попытку заворачивать
29 Злопчинский
 
18.10.17
11:56
А может сломаться именно на НачатьТранзакцию?
30 бомболюк
 
18.10.17
11:58
(29) нет, может сломаться на "..."
31 Остап Сулейманович
 
18.10.17
12:04
(30) Исправлюсь.
(0) Вообще непонятна вложенность.
Классика жанра :

НачатьТранзакцию();
...(1)
Попытка
   ...(2)
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
   ...(3)
КонецПопытки
, где
...(1) - подготовительные действия, ошибка в которых не приводит к изменению объектов БД.
...(2) - потенциально опасные действия, ошибка в которых может привести к нежелательным изменениям объектов БД. (Например нарушению ссылочной целостности)
...(3) - действия при возникновении исключительной ситуации.
32 ildary
 
18.10.17
12:16
(31) чуточку упростил без потери наглядности:

НачатьТранзакцию();
   // подготовительные действия, ошибка в которых не приводит к изменению объектов БД
Попытка
   //потенциально опасные действия, ошибка в которых может привести к нежелательным изменениям объектов БД. (Например нарушению ссылочной целостности)
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
   //действия при возникновении исключительной ситуации
КонецПопытки
33 Фрэнки
 
18.10.17
12:34
(32) я бы перетащил НачатьТранзакцию внутрь Попытка
Так будет и наглядней и правильней.
34 dezss
 
18.10.17
13:01
Народ, а если в процедуре есть ряд действий, которые могут вызвать ошибку, но есть и действия, которые ошибки в БД не вызовут, то лучше использовать одну Попытка - Исключение или для каждого действия с БД отдельные?
35 GANR
 
18.10.17
13:20
(0) Я пользовался вот таким:

НачатьТранзакцию();

Попытка
    что-то делаем....
    ОтменитьТранзакцию();
Исключение

    ОтменитьТранзакцию();
    ВызватьИсключение;
конецПопытки
36 GANR
 
18.10.17
13:22
+(35) да-да - именно отменить независимо от того ошибка там или не ошибка ))
37 бомболюк
 
18.10.17
13:29
(36) может вместо 1го Отменить все таки Зафиксировать? ;-)
38 GANR
 
18.10.17
13:42
(37) Неа - надо сформировать документы с заданными параметрами, получить из них данные, а потом стереть документы. ))
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан