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


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

Метки: 

Попытка-Исключение в транзакции приводит к проблемам

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

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

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

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

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

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

Попытка
//ошибка

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

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

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

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

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

Попытка
//ошибка

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

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

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

Попытка
//ошибка

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

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

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

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

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

странно что-то, какая платформа?
   Maxus43
 
36 - 11.04.14 - 11:39
(34) недавно появилась, смотри в магазе 1с, автор из БИТа
   ramir
 
37 - 11.04.14 - 11:41
(27) А вот так писать, не вариант?

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

Попытка
  //ошибка

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


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

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

Попытка
   Пока ... Цикл
      //ошибка

   КонецЦикла;

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

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

// при этом выполняется commit

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

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

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

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

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

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

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

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

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

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

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

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

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



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