Имя: Пароль:
1C
 
ОтменитьТранзакцию() не срабатывает
0 nikulya
 
07.10.10
16:08
Уважаемые знатоки! Есть ли объяснение того что не откатывается транзакция в следующем коде:

   Попытка
       НачатьТранзакцию();
       ДокИсточник.Удалить(0);
       ДокПриемник.Записать();
       ДокПриемник.Провести();
         а=1/0;
       ЗафиксироватьТранзакцию();
   Исключение
       ОтменитьТранзакцию();
   КонецПопытки;
1 Ёпрст
 
гуру
07.10.10
16:09
Есть. нефик транзакцию в попытку оборачивать таким извращенным способом.
2 nikulya
 
07.10.10
16:10
а как посоветуешь??
3 NS
 
07.10.10
16:11
начатьтранзакцию() вроде вне попытки нужно делать.
4 YHVVH
 
07.10.10
16:11
(0) мрак
5 YF
 
07.10.10
16:14
(0) При ошибке в транзакции она же отменится без твоего отменитьТранзакцию()
6 NS
 
07.10.10
16:17
Нет, и в попытке работает.
так что (0) что-то не договариваешь.
(5) В попытке - нет.
7 nikulya
 
07.10.10
16:20
да все договариваю.... идет на отменуТранзакции(), в отладчике проверял. Но ничего не откатывается. 1 Документ удаляется, 2 перепроводится
8 YHVVH
 
07.10.10
16:22
а так
   НачатьТранзакцию();
   Попытка
       ДокИсточник.Удалить(0);
       ДокПриемник.Записать();
       ДокПриемник.Провести();
       а=1/0;
      ЗафиксироватьТранзакцию();
   Исключение
       ОтменитьТранзакцию();
   КонецПопытки;
9 nikulya
 
07.10.10
16:24
(8) тот же эффект. не откатывает
10 YF
 
07.10.10
16:25
НачатьТранзакцию();
       ДокИсточник.Удалить(0);
       ДокПриемник.Записать();
       ДокПриемник.Провести();
       а=1/0;
Попытка
      ЗафиксироватьТранзакцию();
   Исключение
       ОтменитьТранзакцию();
   КонецПопытки;
11 1Сергей
 
07.10.10
16:26
(10) это ошибку скажет
12 1Сергей
 
07.10.10
16:26
деление на 0
13 YHVVH
 
07.10.10
16:27
(9) гонишь
14 Ёпрст
 
гуру
07.10.10
16:27
(7)врешь..
Всё там работает.. и в (0) тоже.
Ты просто проверять не умеешь.
15 YHVVH
 
07.10.10
16:27
у тебя не случ не вложенная транзакция?
16 YF
 
07.10.10
16:28
(11) Я думал у (0) деление на 0 поставлено для проверки того отменяется ли транзакция
17 Ёпрст
 
гуру
07.10.10
16:28
+14

   Док = СоздатьОбъект("Документ");
   Док.НайтиДокумент(ВыбДок);
   Сообщить(Док.ПометкаУдаления());    
   Попытка
         НачатьТранзакцию();
       Док.Удалить(0);
         а=1/0;
       ЗафиксироватьТранзакцию();
   Исключение
       ОтменитьТранзакцию();
   КонецПопытки;
   Сообщить(Док.ПометкаУдаления()); //так проверяешь ты и видишь 1
   Док.НайтиДокумент(ВыбДок);
   Сообщить(Док.ПометкаУдаления());//а вот так нужно на самом деле, и вернёт 0, как и есть на самом деле.
18 YHVVH
 
07.10.10
16:28
100 пудняк стоит выше по тексту еще какаяето хрень типа начать транзакцию.
19 Ёпрст
 
гуру
07.10.10
16:29
(9) откатывает.
20 Ёпрст
 
гуру
07.10.10
16:30
(18) ничего там не стоит, он просто проверять не умеет, и смотрит в отладчике, а не в самом журнальчике глазками, к примеру.
21 YHVVH
 
07.10.10
16:30
(20) ну фиг знает тогда. врет значит.
22 Z1
 
07.10.10
16:31
ВсеХорошо = 1;
       НачатьТранзакцию();
Попытка
       ДокИсточник.Удалить(0);
       ДокПриемник.Записать();
       ДокПриемник.Провести();
         а=1/0;
Исключение
ВсеХорошо = 0;
КонецПопытки;

Если ВсеХорошо = 1 Тогда
       ЗафиксироватьТранзакцию();
Иначе
       ОтменитьТранзакцию();
КонецЕсли;
23 ilya_i
 
07.10.10
16:32
(7) "1 Документ удаляется, 2 перепроводится"
т.е. в цикле, а транзакция, для каждого документа?
24 YHVVH
 
07.10.10
16:33
достал чипсы
25 nikulya
 
07.10.10
16:36
я смотрю в журнале собственными глазками. обработка объединяет 2 документа. потом удаляет первый и сохраняет и перепроводит второй. хочется если что то не получится откатить транцакцию, но конструкция не работает. пробовал по всякому
26 YHVVH
 
07.10.10
16:40
(25) у всех работает.
27 YHVVH
 
07.10.10
16:41
(18) смотрел?
28 Ёпрст
 
гуру
07.10.10
16:42
(25) врешь.
29 Z1
 
07.10.10
16:45
(25) может у тебя нарушена парность и/или количество скобок транзакций.
30 nikulya
 
07.10.10
16:52
Вот так работает. Откатывает без проблем.

ВсеХорошо = 1;
       НачатьТранзакцию();
Попытка
       ДокИсточник.Удалить(0);
       ДокПриемник.Записать();
         а=1/0;
Исключение
ВсеХорошо = 0;
КонецПопытки;

Если ВсеХорошо = 1 Тогда
       ЗафиксироватьТранзакцию();
Иначе
       ОтменитьТранзакцию();
КонецЕсли;

А в проведении есть sql вставка. Наверно из за этого не срабатывает.
31 YHVVH
 
07.10.10
16:54
я так понял без проведения у тебя все хорошо?
(30) какая вставка не понял?
32 nikulya
 
07.10.10
16:54
причем вызывается из проведения хранимка. Закоментил вызов SQL хранимки и все заработало.
33 YF
 
07.10.10
16:57
(32) Что за хранимка? Как вызывается?
34 YHVVH
 
07.10.10
16:59
хранимка фиксирует начатаю транзакцию - оригинально
35 nikulya
 
07.10.10
16:59
хранимка написанная на sql. вызывается через компоненту rmSQL.
36 nikulya
 
07.10.10
17:00
ВсеХорошо = 1;
       НачатьТранзакцию();
Попытка
       ДокПриемник.Записать();
       ДокПриемник.Провести();
       ДокИсточник.Удалить(0);
         а=1/0;
Исключение
ВсеХорошо = 0;
КонецПопытки;

Если ВсеХорошо = 1 Тогда
       ЗафиксироватьТранзакцию();
Иначе
       ОтменитьТранзакцию();
КонецЕсли;
37 nikulya
 
07.10.10
17:00
ЗАРАБОТАЛА..... Всем спасибо.
38 Z1
 
07.10.10
17:15
(32) для хранимки учитывай обязательно 29.
Также если твой хранимка откатит транзакцию могут начаться забавные вещи.
( после этого откроется неявная транзакция и зафиксировать транзакцию будет лишним, а Зафиксировать транзакцию зафиксирует данные от места отмены транзакции) +  на это на все еще накладывается
включение  выключение режима неявных транзакций.
39 artbear
 
07.10.10
17:29
Напомните - Удалить(0) ставит только пометку удаления?
40 Z1
 
07.10.10
17:32
Удалить(0)  - да ставит только пометку

Удалить(1) удаляет документ из базы. но если база УРБД то
все равно позже документ может и вернуться
41 nikulya
 
07.10.10
17:49
(38) по моему транзакция SQL и 1с транзакция не связаны. Во всяком случае нельзя например откатить SQL транзакцию из 1С
42 Z1
 
07.10.10
17:57
(41) ошибаешься
для v77 ms sql

НачатьТранзакцию() - на sql сервер приходит  begin tran
ЗафиксироватьТранзакцию(); -   commit

ОтменитьТранзакцию(); rollback - только для отката они еще вроде
проверяют уровень вложености ( вот этого точно не помню сейчас )
43 nikulya
 
07.10.10
18:00
(42) интересно. в профайлере проверю. а ты не знаешь как можно отменить из 1с транзакцию которая была запущена из хранимки на sql сервере??
44 DK_L
 
07.10.10
18:09
епрст3 - скорее всего из 1С-а :)
45 Z1
 
07.10.10
18:11
(43) Так по барабану откуда отменять главная чтобы скобки
begin tran и cjmmit были правильными.

>>>отменить из 1с транзакцию
rc.ВыполнитьСкалятный("rollback"); - только учти что в MS sql
нет вложенных транзакций - отмениться все.