Имя: Пароль:
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 и далее
в общем автор книги сам дает рекомендации использовать ВызватьИсключение после обработки исключительной ситуации.
Так что проблем, по прежнему не видно.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn