Вход | Регистрация


1С:Предприятие ::

Метки: 

Транзакция и попытка_исключение

Я
   Wefast
 
13.08.18 - 14:31
Не доводилось использовать транзакции.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

Исключение
//ничего

КонецПопытки

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

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

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

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

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

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

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

Попытка
      НачатьТранзакцию();
// код с ошибкой

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


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

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

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

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

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



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует