Имя: Пароль:
1C
 
Периодические глюки транзакции в 1с
0 Сергиус
 
08.09.14
15:34
Есть конструкция вида:

Попытка
НачатьТранзакцию()
Док = Документы.Документ1.СоздатьДокумент();
Док.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
Исключение
Сообщить(ОписаниеОшибки());
Если ТранзакцияАктивна()
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;

Так вот..периодически(в рандомном порядке) в случае ошибки проведения при попытке исполнить код в строчке ОтменитьТранзакцию() возникает системное исключение "В данной транзакции уже происходили ошибки..." и 1с вылетает с исключением, а бывает, что отмена завершается корректно и выполнение программы продолжается...
Что это такое может быть? На глюк платформы похоже? 8.2.19.80
1 Ёпрст
 
гуру
08.09.14
15:36
нет вложенных транзакций, писать НачатьТранзакцию() в этом коде лишнее
2 Сергиус
 
08.09.14
15:37
(1)А где вложенная транзакция? Или ты хочешь сказать, что Попытка организует свою?
3 Ёпрст
 
гуру
08.09.14
15:38
(2) проведение - это всегда транзакция, если че..
4 Сергиус
 
08.09.14
15:39
(3)Согласен..это еще объяснимо. Но почему тогда периодически такое разное поведение?
5 Сергиус
 
08.09.14
15:41
+(4)Т.е. исключение возникает всегда, но вот "В данной транзакции уже происходили ошибки..." выскакивает от раза к разу..
6 Сергиус
 
08.09.14
15:45
И следует тогда такой вопрос..как же тогда быть..когда, допустим, помимо создания документа, надо еще удалить что-ть(произвольные записи в регистре сведений)..Если я не буду использовать НачатьТранзакцию(), то получится, что записи из регистра удалятся...а документ не создастся... Что же делать в таком случае, чтобы все таки все вместе было в одной транзакции?
7 Леха Дум
 
08.09.14
15:45
Попробуй для начала перенести НачатьТранзакцию() до попытки
8 Maxus43
 
08.09.14
15:46
НачатьТранзакцию()
Попытка
9 Леха Дум
 
08.09.14
15:47
а условие "Если ТранзакцияАктивна() Тогда"  убери
10 Сергиус
 
08.09.14
15:49
(9)
НачатьТранзакцию()
Попытка
Док = Документы.Документ1.СоздатьДокумент();
Док.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
КонецПопытки;

Вот так?
11 Maxus43
 
08.09.14
15:54
я так делаю, на автомате уже
НачатьТранзакцию()
ЕстьОшибки = Ложь;
Попытка
Док = Документы.Документ1.СоздатьДокумент();
Док.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ОписаниеОшибки());
ЕстьОшибки = истина;
КонецПопытки;

Если ЕстьОшибки Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
12 Сергиус
 
08.09.14
15:56
(11) Спасибо за совет.
13 Сергиус
 
08.09.14
16:07
(11)Попробовал такую конструкцию..и опять та же история..в одном случае все прошло нормально, т.е. было выброшено исключение, сообщение об ошибке..в другом опять словил "В данной транзакции уже происходили ошибки".
14 Maxus43
 
08.09.14
16:12
Док = Документы.Документ1.СоздатьДокумент(); вынеси за попытку вверх
15 Maxus43
 
08.09.14
16:13
возможно причина в проведении самого документа, там есть конструкции Попытка (пальцем в небо, в качестве бреда)?
16 Сергиус
 
08.09.14
16:16
(15) Нет, там внутри ничего такого нет. Просто в обработке проведения документа идет проверка определенных условий, и если они нарушаются то ставится Отказ = Истина.
17 Maxus43
 
08.09.14
16:22
Ошибка "В данной транзакции уже происходили ошибки" возникает либо при "повторной ошибке" в рамках одной транзакции, либо при ОБРАЩЕНИИ к БД, после первой ошибки в рамках транзакции.
Код точно весь в (0)?
18 Сергиус
 
08.09.14
16:34
(17)Да, это весь код.
19 Сергиус
 
08.09.14
16:35
+(18) После попытки проведения сразу валится в исключение, а там уж как повезет - либо отмена транзакции, либо ошибка..
20 Maxus43
 
08.09.14
16:35
ну не верю (с)
не понятно что-то...
21 Йохохо
 
08.09.14
16:39
(18) а в (6) ты про что? про подписки?
22 Сергиус
 
08.09.14
16:41
(20) Я ж говорю..такая ошибка возникает не постоянно, а "плавающая"..вот и спросил - может это быть глюком платформы?
23 Сергиус
 
08.09.14
16:42
(21) Ну это у меня была мысль потом так сделать..но пока даже в простом варианте "непонятки".
24 Сергиус
 
08.09.14
16:43
Пока мне видится вариант..вообще убрать НачатьТранзакцию(), но  чую, что могут быть "траблы"..
25 Сергиус
 
08.09.14
16:45
+(24) "траблы" - если я усложню код..допустим удаление записей регистра, то тогда без транзакции не обойтись.
26 Йохохо
 
08.09.14
16:47
(23) а пока все происходит в ПриЗаписи()?
27 Сергиус
 
08.09.14
16:51
(26) ПередЗаписью - там стоит обычное условие

Если РеквизитДокумента <> Перечисления.Перечисление1.Вариант1 Тогда Отказ = Истина КонецЕсли;