![]() |
|
Периодические глюки транзакции в 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 Тогда Отказ = Истина КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |