Имя: Пароль:
1C
1С v8
Попытка-Исключение в транзакции приводит к проблемам
, ,
0 vi0
 
10.04.14
21:53
в "книге 1С Эксперта" говорится, что использование Попытка-Исключение в транзакции является приемом, который приводит к проблемам

ваше мнение
согласны, нет?
почему?
1 ДенисЧ
 
10.04.14
21:59
да
2 Ksandr
 
10.04.14
22:02
да.
3 Зойч
 
10.04.14
22:03
Не всегда.
Если запись данных в базу выполнилась с ошибкой, то никакая попытка не поможет
4 Злопчинский
 
10.04.14
22:05
в этом бл..ом снеговике - может быть...
в клюшках нормально работает. у меня в достаточно большом количестве мест используется - траблов не натыкался.. может просто потому что везло или комплекс мероприятий...
5 vi0
 
10.04.14
22:07
(3) не поможет - понятно
какие проблемы будут?

единственное - если после попытки программист не позаботится закончить серверный вызов и дождется "в транзакции уже происходили ошибки" - ну так это скорее проблемы програмиста, а не платформы
6 Ksandr
 
10.04.14
22:35
(5) которые станут проблемами конечного пользователя.
7 vi0
 
10.04.14
22:50
(6) повторю - это не проблемы конструкции Попытка Исключение
8 Ненавижу 1С
 
гуру
10.04.14
22:55
а что вы хотели?
сама транзакция, это попытка, просто движок 1С кривоват тут
9 vi0
 
10.04.14
22:56
(8) мы хотели ответы на ворпросы
согласны, нет?
почему?
10 spectre1978
 
10.04.14
23:03
Да, в восьмерке это не работает нормально, сталкивался. в семерке работает корректно.
11 vi0
 
10.04.14
23:12
(10) что именно не работает нормально в 8ке и работает нормально в 7ке ?
12 Torquader
 
10.04.14
23:48
В семёрке исключение автоматом отменяет транзакцию, насколько я помню, в восьмёрке - нет.
13 Ksandr
 
11.04.14
00:15
(12) В 8 тоже отменяет. Проверить можно через ТранзакцияАктивна()
14 EugeniaK
 
11.04.14
00:17
Конструкция Попытка - Исключения всегда и везде приводит к проблемам. Дело не в транзакции.
15 Torquader
 
11.04.14
00:24
(14) К каким таким проблемам ?
Это же перехват прерывания исполнения программы.
Вы ещё скажите, что вам "ВызватьИсключение" не по душе.
16 Ksandr
 
11.04.14
00:56
(15) К таким, что от не знания как проверить наличие свойства у объекта не опытные программисты начинают пихать в попытки Объет.МожетБытьСвойство

ВызватьИсключение по душе, но только при необходимости прерывания выполнения программы. Когда something going wrong и дальнейшее выполнение не целесообразно или может привести к записи ошибочных данных.
17 vi0
 
11.04.14
08:14
пока все озвученные доводы были только про кривые руки программиста
18 spectre1978
 
11.04.14
10:03
(11) сейчас уже не припомню, два года назад вопрос был. Но точно помню, что ситуация эта даже была документирована и я прочитал что так делать нельзя. То ли вложенных блоков попытка-исключение касалось, то ли еще чего-то такого. Ограничение платформы.
19 Базис
 
naïve
11.04.14
10:08
А теперь включите в отладчике остановку на ошибках и запустите какой-нибудь Рарус Альфа Авто или другую франчовую конфу. Оно постоянно отменяет транзакции, и вложенные там не редкость. Так что теория может быть правильной, но её мало кто применяет.
20 EugeniaK
 
11.04.14
10:19
(15) Исключительная ситуация это признак того, что в коде что-то отработало некорректно. Т.е. что-то нужное не выполнилось. Нужно анализировать, какие могут быть причины ошибок и описывать, что именно должна делать система при них.

А еще конфигурацию, в которой большое количество конструкций "Попытка", дико неудобно отлаживать, если нужно остановиться на ошибке. Потому что останавливается она еще в сотне мест до нужного.
21 maxile
 
11.04.14
10:25
Нет Здесь эта транзакция используется как исключение когда временно надо обойти ошибку.
22 le_
 
11.04.14
10:29
(0) Да, приводит. И некоторые версии платформы даже неправильно тексты ошибок показывают при этом. Разобраться можно только с отладчиком.
23 vde69
 
модератор
11.04.14
10:45
не приводит,

проблеммы возникают только при вложении транзакции.
24 ifso
 
11.04.14
11:09
(14)
> Конструкция Попытка - Исключения всегда и везде
> приводит к проблемам.
особливо в пятницу ;)
25 ifso
 
11.04.14
11:15
(20)
> Исключительная ситуация это признак того, что в коде
> что-то отработало некорректно.
С каких пор вилка виновата, что кто-то ею в глаз тычет?
26 Maxus43
 
11.04.14
11:25
(13) не отменяет исключение транзакцию
27 Maxus43
 
11.04.14
11:28
надо правильно просто писать...
конструкция
НачатьТранзакцию()

Попытка
//ошибка
Исключение
   ОтменитьТранзакцию();
КонецПопытки;

Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;

НЕ правильная, она не работает действительно
28 Maxus43
 
11.04.14
11:30
работает так:

ЕстьОшибка = Ложь;

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

Попытка
//ошибка
Исключение
ЕстьОшибка = Истина;
КонецПопытки;

Если ЕстьОшибка Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
29 elCust
 
11.04.14
11:30
(27) А как сработает такая конструкция если ее реализовать в ОбработкаПроведения?
30 vi0
 
11.04.14
11:32
еще интересное наблюдение:

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

Попытка
//ошибка
Исключение
КонецПопытки;

ЗафиксироватьТранзакцию(); // делает ROLLBACK в SQL
31 Maxus43
 
11.04.14
11:34
(29) такая конструкция не рабочая.
В Обработке проведения - нафига вобще так делать?
Это можно использовать при загрузчиках каких-то, своих непонятных алгоритмах, но не при неявных транзакциях патформенных, зачем там?
32 Maxus43
 
11.04.14
11:35
(30) а вот между
Исключение
КонецПопытки;

вставь сообщить(ТранзакцияАктивна())

и её как будто бы и нет. а на самом деле транзакция есть и живёт, надо юзать (28) чтобы номрально отрабатывало
33 Maxus43
 
11.04.14
11:36
в рамках попытки обращаться к командам транзакции - будет ошибка, многие почему то думают что реально транзакция сдыхает из-за этого
34 NcSteel
 
11.04.14
11:38
(0) Что за книга - не знаю о такой.

А по сабжу - нет проблемы в Попытке исключения, важно грамотно закрывать транзакцию.
35 Maxus43
 
11.04.14
11:38
(30) >>ЗафиксироватьТранзакцию(); // делает ROLLBACK в SQL
странно что-то, какая платформа?
36 Maxus43
 
11.04.14
11:39
(34) недавно появилась, смотри в магазе 1с, автор из БИТа
37 ramir
 
11.04.14
11:41
(27) А вот так писать, не вариант?

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

Попытка
   //ошибка
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
КонецПопытки;
38 Drac0
 
11.04.14
11:42
(37) +1
39 goleaff2006
 
11.04.14
11:50
(37)так писать религия многим не позволяет =))Надо обязательно г...о код писать=)
40 Maxus43
 
11.04.14
11:50
(37) проверь
41 ramir
 
11.04.14
11:51
(40) Давно уже это сделал. Так и пишу.
42 Bigbro
 
11.04.14
11:52
не понимаю проблемы. почему все пытаются фиксировать внешнюю транзакцию когда во вложенной прошла ошибка?
43 Maxus43
 
11.04.14
11:52
я обычно использую такой говнокод когда загрузки данных идут, в цикле ты как напишешь (37)? чтобы фиксировалось всё, а не каждый элемент?
44 ramir
 
11.04.14
11:54
(16) Когда "возникает необходимость" сделать ВызватьИсключение из блока Исключение. Я этого не делаю, сразу пишу запись в журнал регистрации. Регламентным заданием проверяю журнал регистрации на "свои" ошибки и записываю в специально созданный для этого справочник, чтобы база сама говорила мне о произошедших ошибках. Все это, конечно, вынесено в отдельный модуль.
45 ramir
 
11.04.14
11:58
(43) я пишу такой код не от того, что это овнокод, а для того, чтобы если все-таки произойдет нештатная ситуация не показывать юзеру системные сообщения об ошибках.
46 scanduta
 
11.04.14
11:58
(0)в "книге 1С Эксперта" говорится, что использование Попытка-Исключение в транзакции является приемом, который приводит к проблемам


к каким проблемам в книге не написано ?
47 Maxus43
 
11.04.14
12:03
(45) ещё раз. Надо загрузить в цикле данные, в транзакции.
И выдавать юзеру не ошибку программного кода с кнопками подробно/конфигуратор а нормальную осмысленную - для этого используется (28).
Юзая другие варианты - у тебя будут ошибки
48 ramir
 
11.04.14
12:09
(47) В цикле никогда использовать не приходилось. На первый взгляд не улавливаю где возникнет ошибка

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

Попытка
   Пока ... Цикл
      //ошибка
   КонецЦикла;

   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
КонецПопытки;
49 vi0
 
11.04.14
12:17
(46) не написано
50 floody
 
11.04.14
12:19
(49) всё там написано, читайте лучше
51 vi0
 
11.04.14
12:21
(50) процитируйте, пожалуйста
52 floody
 
11.04.14
12:23
страница 43, абзацы 5,6,7
53 vi0
 
11.04.14
12:28
(35)
1С:Предприятие 8.2 (8.2.17.169)

// rollback возникает при такой ошибке например
а = Справочники.Склады.СоздатьЭлемент(); а.Код = "ф"; а.Записать();
а = Справочники.Склады.СоздатьЭлемент(); а.Код = "ф"; а.Записать();

// при этом выполняется commit
а = 1/0;
54 vi0
 
11.04.14
12:29
(52) нет книги с собой
что там в двух словах хотябы?
55 Господин ПЖ
 
11.04.14
12:39
более точная формулировка: кривая реализация проводит к проблемам...
56 anddro
 
11.04.14
15:52
В транзакции вставляю попытку с ошибкой:

Попытка
    а = Число("бу");
Исключение
    ИОШ = ИнформацияОбОшибке();
    Сообщить(КраткоеПредставлениеОшибки(ИОШ));
Конецпопытки;

Исключение есть, но транзакция успешно прошла, изменения в базе.
Или причина в том, что именно вызвало исключение?
И не все исключения одинаковы.
57 anddro
 
11.04.14
16:01
И вот такое исключение (которое возникает при изменении данных) действительно приводит к тому, что транзакция откатывается:

Попытка
        об = Справочники.КонтактныеЛица.НайтиПоНаименованию("Иванов").ПолучитьОбъект();
    об.Владелец = Неопределено;
    об.Записать();
Исключение
    ИОШ = ИнформацияОбОшибке();
    Сообщить(КраткоеПредставлениеОшибки(ИОШ));
КонецПопытки;
58 Torquader
 
11.04.14
16:11
(57) Можно предположить, что из-за ошибки записи данных сначала откатывается транзакция, вызвавшая ошибку, а потом генерится исключение (уже на стадии вывода ошибки пользователю).
59 Попытка1С
 
11.04.14
16:21
(47) В цикле все это делается на 1000 элементов к примеру. потом заново открытие
60 vde69
 
модератор
11.04.14
16:27
пока без ответа но в тему v8: нужна ли транзакция в обработке БП
61 Torquader
 
11.04.14
16:41
Проведение документа в транзакции - это вложенная транзакция ?
И насколько она правильно отрабатывает при отмене проведения ?
62 vde69
 
модератор
11.04.14
17:02
(61)
распишу свои мысли:

вообще на сколько я знаю в 1с есть глобальный флаг ошибки транзакции, по этому

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

    Попытка
        НачатьТранзакцию();
        
        Для Каждого эл из Объекты Цикл
            // тут изменяем документы            
        КонецЦикла;
        
        ЗафиксироватьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
    КонецПопытки;
ЗафиксироватьТранзакцию();

в случае обработаной ошибки вложеной транзакции приведет к ошибке в момент попытки фиксации верхнего уровня транзакции будет ошибка....

а вот такая конструкция будет нормально работать при условии, что внутри попытки нет транзакций....

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

    НачатьТранзакцию();
      Попытка
        
        Для Каждого эл из Объекты Цикл
            // тут изменяем документы            
        КонецЦикла;
        
      Исключение
      КонецПопытки;
    ЗафиксироватьТранзакцию();
ЗафиксироватьТранзакцию();
63 vi0
 
13.04.14
16:05
(52) Перечитал страницу 43, абзацы 5,6,7 и далее
в общем автор книги сам дает рекомендации использовать ВызватьИсключение после обработки исключительной ситуации.
Так что проблем, по прежнему не видно.