Имя: Пароль:
1C
 
Транзакция и попытка_исключение
0 Wefast
 
13.08.18
14:31
Не доводилось использовать транзакции.

И тут стало интересно зачем она нужна.

Везде пишут чтобы отменить ВСЕ чтобы делал если возникла ошибка.

Но ведь достаточно написать

Попытка
Создание объекта.
Еще какой то код с ошибкой
Исключение
КонецПопытки

В итоге все что была между попытка и исключение откатится.


И я так понимаю если в процессе транзакции возникнет ошибка то выполнение кода прекратится.

Получается транзакцию можно использовать для отката каких то действий по условию

Что то вроде
НачатьТранзакцию
СделатьКакиетоРасчеты или Получить данные откуда то

Если Данные = "не правильные" Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;

Я все правильно понимаю? Или что то упускаю?
1 H A D G E H O G s
 
13.08.18
14:32
(0) За многим она нужна, всего не перечислишь.
2 H A D G E H O G s
 
13.08.18
14:33
Иногда транзакция - адов вред, вот даже и не представишь сразу, когда. Г1С любил всякие конкурсы и цирки с конями, может и мне устроить?
3 Cyberhawk
 
13.08.18
14:34
"В итоге все что была между попытка и исключение откатится" // Лол?
4 Вафель
 
13.08.18
14:35
(2) давай. жги
5 H A D G E H O G s
 
13.08.18
14:38
(4) Цикличную работу с внешними системами нельзя выносить в одну транзакцию, если фиксируешь результат в 1С.
Не, я понимаю, что прописная истена, но сам в порыве оптимизации запилил все в одну транзакцию. В итоге, был сбой с оборудованием, транзакция откатилась, а в оборудовании то что было до отката - осталось валидным.
Да, и на Ежуху бывает проруха.
6 Fragster
 
гуру
13.08.18
14:38
какая хорошая реклама статьи https://habr.com/post/419715/
7 Вафель
 
13.08.18
14:39
(5) распределенные транзакция - это вообще отдельная тема.
тут каждый свой велосипед изобретает
8 Cyberhawk
 
13.08.18
14:47
(6) Чувак взял и переписал статью с ИТС, приправив водой
9 Fragster
 
гуру
13.08.18
14:48
(8) не, чувак прорекламировал инструмент для статического анализа кода на 1с. ну и да, удивительно, у скольки "программистов 1с" нет доступа к ИТС...
10 Вафель
 
13.08.18
14:50
(9) что-то ссылки никакой на анализатор не было
11 Fragster
 
гуру
13.08.18
14:51
(10) правильно поданная реклама. только для тех, кто интересуется. Например, что же там за интересный скриншот такой?
12 Fragster
 
гуру
13.08.18
14:51
13 Eiffil123
 
13.08.18
15:16
(0) В смысле всё, что в попытке-исключении отменится. Это не так. Если внутри попытки провожу 2 документа, то первый проведется, а на втором будет ошибка, то первый уже не отменится.
14 Wefast
 
14.08.18
08:26
(13) хм, был уверен что оба документа не запишутся. Т.е. попытка позволяет просто не прекращать выполнение кода.

Ладно поппробовал сейчас сделать так:

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

Ном = Справочники.Номеналатура.СоздатьЭлемент();
Ном.Наименование = "2222";
Ном.ОбменДанными.Загрузка = ИстинА;
Ном.Записать();

ч = 2/Неопределено;

Исключение
//ничего
КонецПопытки

И в этом случае ном не записалась. Зачем тогда в исключение помещать ОтменитьТранзакцию()?
15 Wefast
 
14.08.18
08:29
(14) Перед исключением там еще ЗафиксироватьОтладку()

Но и ЗафиксироватьОтладку() не срабатывает же если ошибка произошла
16 Локи-13
 
14.08.18
08:34
попытка-исключение в 1с зло, кроме очень редких случаев
17 Wefast
 
14.08.18
08:37
ЗафиксироватьОтдалку() наверное получит смысл если код все так будет выполнен правильно, и это надо внести в базу, а дальше там могут быть ошибки или что угодно. Это понятно.

ОтменятьТранзакцию() не понятно зачем, может из-за отсутсвия вложенности транзакции будут проблемы после

(16) Почему? Мне кажется у меня в офисе это мастхев в разработке, постоянно используется т.к. очень удобно
18 Ботаник Гарден Меран
 
14.08.18
09:14
(8)
Клевая статья. Автор посетовал на низкий порог вхождения в 1С и в комментариях стал разбираться, что же это за "пессиМИСТические" и "оптиМИСТические" блокировки.
19 Ботаник Гарден Меран
 
14.08.18
09:15
И это я еще до конца комментариев не дочитал, где автор завалился.
20 Lama12
 
14.08.18
09:26
(0) Да... было время когда я думал что транзакция отменяет не только изменения данных, но еще и переменные к контексте возвращает к состоянию до начала транзакции.

Держи пример. Думай.

Попытка
    
        Спр = Справочники.Номенклатура.СоздатьЭлемент();
        Спр.Наименование = "1";
        Спр.Записать();
        
        Спр = Справочники.Номенклатура.СоздатьЭлемент();
        Спр.Наименование = "2";
        Спр.Записать();
        
        а = 1/0;
    Исключение
    
    КонецПопытки;
    
    
    Попытка
        
        НачатьТранзакцию();
        
        Спр = Справочники.Номенклатура.СоздатьЭлемент();
        Спр.Наименование = "3";
        Спр.Записать();
        
        Спр = Справочники.Номенклатура.СоздатьЭлемент();
        Спр.Наименование = "4";
        Спр.Записать();
        
        а = 1/0;
        
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
    КонецПопытки;
21 Zamestas
 
14.08.18
10:06
(0) Если ты создаешь кучу связанных между собой объектов, и где то, что то пошло не так - то проще ОтменитьТранзакцию(), чем потом выяснять, что записалось, а что нет и как это всё привести в порядок.
22 Deon
 
14.08.18
10:46
А если я напишу только НачатьТранзакцию(), а фиксировать и отменять её не буду, что с ней произойдет?
23 ssh2006
 
14.08.18
10:48
(22) отменится автоматом по завершении процедуры/функции
24 Deon
 
14.08.18
10:50
(23) Это хорошо, спасибо
25 Остап Сулейманович
 
14.08.18
10:54
(22) Классика жанра :
1. В момент НачатьТранзакцию() данные блокируются (или не блокируются) и создаются локальные копии.
2. Потом локальные данные изменяются.
3.
-При ЗафиксироватьТранзакцию() - изменения из локальных переносятся в боевую (как есть. без обработки, потому быстро.) Локальные данные уничтожаются.

-При ОтменитьТранзакцию() Локальные данные уничтожаются без переноса.

ЗЫ В случае ни Зафиксировать ни отменить - в простейшем варианте никакие данные в боевую БД не перенесутся. Счетчик транзакций будет ненулевым. Платформа обязана будет отработать открытую транзакцию самостоятельно. Способом "отменить".
26 Wefast
 
14.08.18
11:08
(25) Т.е. если написать

Попытка
      НачатьТранзакцию();
// код с ошибкой
      ЗафиксироватьТранзакцию
Исключение
КонецПопытки
// Какой то еще код

КОнецПроцедуры

То в конце процедуры будет еще открыта транзакция и платформа сама отменит все. в том числе и "Какой то еще код"?
27 Cool_Profi
 
14.08.18
11:17
(26) Транзакция закроется при закрытии 1с
28 Остап Сулейманович
 
14.08.18
11:19
(26) Должно быть так. Что там в голове 1С - загадка.
Код вообще ни при делах. Голая транзакция "по правильному" касается только данных в БД.
"Какой то еще код" может отправить данные во внешнюю систему. Например отправить СМС об ошибке. Как откатить такой пассаж - я не представляю.
29 Остап Сулейманович
 
14.08.18
11:21
(27) "закроется при закрытии 1с"
При закрытии главного окна? Или при выходе из процедуры, где транзакция бала начата?
30 Deon
 
14.08.18
11:39
Потестил. В УФ транзакция живет пока выполняется серверный код. Когда он возвращается на клиент, транзакция отменяется. А так можно без проблем начать транзакцию в одной процедуре, а завершить или отменить в другой.
Код, правда, становится нечитаемый.
31 ssh2006
 
14.08.18
11:51
Если количество вызовов метода НачатьТранзакцию() превышает количество вызовов методов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(), то система выполнит неявный вызов метода ОтменитьТранзакцию() в следующих случаях:

● при окончании выполнения встроенного языка (обработчик события, внешнее соединение, automation-сервер);

● при передаче управления с сервера на клиента.
https://its.1c.ru/db/v8312doc#bookmark:dev:TI000000528
32 H A D G E H O G s
 
14.08.18
11:53
А еще ОтменитьТранзавкцию() нужно, чтобы не было

"В данной транзакции уже происходили ошибки". Так система тебе намекает, что чтото-то пошло не так, а ты продолжаешь тупить.
33 ЕщеОдин Программист
 
14.08.18
11:59
При выходе из процедуры отменяется Привилегированный режим.
34 Deon
 
14.08.18
12:02
(31) Т.е. документацию всё-таки стоит читать...