Имя: Пароль:
1C
 
В данной транзакции уже происходили ошибки?!
0 vi0
 
28.12.17
17:37
В чем принципиальная ошибка построения программного кода если возникает ошибка "В данной транзакции уже происходили ошибки"?
Ваше мнение.
1 karabas11
 
28.12.17
17:38
Транзакция в попытке в попытке транзакции
2 vde69
 
28.12.17
17:40
транзакция
начало цикла
запись документа
конец цикла
фиксация транзакция
3 vi0
 
28.12.17
17:42
(2) ну это самый простой случай
бывают множественные вызовы чужих процедур и прочее
4 hhhh
 
28.12.17
17:47
(3) ну может так

транзакция

попытка
исключение
конецпопытки


фиксация транзакция
5 Вафель
 
28.12.17
17:49
(0) ошибка записи в попытке, и все это в транзакции
6 Вафель
 
28.12.17
17:50
После ошибки записи транзакцию нужно отменять
7 vde69
 
28.12.17
17:51
(4) на самом деле там все сложнее, твой код может работать нормально а может нет...

ошибки генерятся разные и часть из них влияют на вышестоящую транзакцию а часть нет.


То есть тут нет все однозначно
8 vde69
 
28.12.17
17:51
(6) не правда.... точнее далеко не всегда...
9 vi0
 
28.12.17
17:52
Согласен с комментариями выше в части технических причин.
Да, подобные ошибки возникают и из-за этого,
но в разветвеленном коде, когда неизвестно где на пути встретится попытка или начало/отмена транзакции, как вы организуете свой код, чтобы подобных ошибок не возникало.
10 Вафель
 
28.12.17
17:52
(8) Привиди хоть один другой пример
11 Вафель
 
28.12.17
17:52
запись/провдение/удаление - считаем за одно и тоже
12 vde69
 
28.12.17
17:53
(10) если в модуле обьекта при записи написать

Отказ=Истина

верхняя транзакция нормально отработает
13 vi0
 
28.12.17
17:53
(10) если деление на ноль то можно не откатывать
14 vde69
 
28.12.17
17:54
(12) +

или так

ВызватьИсключение "парам"


то-же не влиет на верхнюю транзакцию
15 Вафель
 
28.12.17
17:55
(12) ну это и есть ошибка при записи
16 Вафель
 
28.12.17
17:56
(12) Хочешь сказать что один из документов не запишется, но транзакция при этом закоммитится?
17 vde69
 
28.12.17
17:56
(15) да, но она в таком коде, не запишет только один документ, остальные нормально обработаются


транзакция

попытка
записьДокумента()
исключение
конецпопытки


фиксация транзакция
18 hhhh
 
28.12.17
17:57
(9) надо чтобы начало/отмена транзакции  были в одной процедуре, ну и если начало транзакции внутри цикла, а отмена где-то еще, я бы не приветствовал.
19 Вафель
 
28.12.17
17:59
(17) Ну если в транзакции только один этот документ записывается...
Но фиксация такой транзакции равносильна ее отмене
20 vi0
 
28.12.17
18:05
(18) что значит в одной?
К примеру есть процедура, которая сама по себе должна содержать транзакцию, чтобы была целостность записи.
Есть еще вторая процедура с такими же условиями, но она еще и вызывает первую.
21 Малыш Джон
 
28.12.17
18:15
(0) Принципиальная ошибка в том, что у тебя в транзакции где-то в коде срабатывает исключение, но ты, никак не проверяя этот факт, далее делаешь ещё какое-то действие, которое возможно только в рамках этой транзакции. А так как в этой транзакции ошибка уже произошла, он тебе, собственно это и пишет.
22 ИТ директор
 
28.12.17
18:19
(0) принципиальная ошибка делать так как советует (17)
делать нужно вот так https://its.1c.ru/db/metod8dev#content:2313:hdoc
23 vi0
 
28.12.17
18:20
а как вам такой типовой код?

СвояТранзакцияОткрыта = Ложь;
    
Попытка
    НачатьТранзакцию();
    СвояТранзакцияОткрыта = Истина;
    ...
    Если СвояТранзакцияОткрыта Тогда
        ЗафиксироватьТранзакцию();
    КонецЕсли;

Исключение
    Если СвояТранзакцияОткрыта Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    
КонецПопытки;
24 ИТ директор
 
28.12.17
18:22
(23) в какой конфе эта дичь?
25 Малыш Джон
 
28.12.17
18:23
(23) Переменная Отказ в обработках записи, проведения и т.д. ведь не просто так используется. Зачем изобретать велосипед?
26 Малыш Джон
 
28.12.17
18:23
То есть вот такой код:

НаборЗаписей1.Записать();
НаборЗаписей2.Записать();

может дать такую ошибку
А вот такой:

Отказ = Ложь;
Попытка
   НаборЗаписей1.Записать();
Исключение
  Отказ = Истина;
КОнецПопытки;
Если Не Отказ Тогда
  Попытка
    НаборЗаписей2.Записать();
  Исключение
    Отказ = Истина;
  КонецПопытки;

такой ошибки не даст
27 vi0
 
28.12.17
18:25
(24) Управление торговлей, редакция 11.2 (11.2.3.84)
28 ИТ директор
 
28.12.17
18:26
ну в УТ/ERP и счетчики на константах делали, так что я не удивлен
29 Вафель
 
28.12.17
18:29
(26) первый код не может дать ошибку из (0)
30 Малыш Джон
 
28.12.17
18:40
(29) Да, немного не так

Попытка
  НаборЗаписи1.Записать();
Исключение
КонецПопытки;
Попытка
  НаборЗаписи2.Записать();
Исключение
КонецПопытки;

вот тут возможна такая ошибка
31 h-sp
 
28.12.17
19:12
(30) всё равно в разных транзакциях
32 vde69
 
28.12.17
23:07
(22) Вы почитайте чего я писал выше по тексту...

в (17) я привел пример случая когда ошибка не оттранслированя с СУБД не приводит к отату верхней транзакции...

хотя в отдельных случаях конструкция (17) вполне может применятся сознательно и будет правомерной.
33 Tateossian
 
29.12.17
00:59
(26) В последних версиях платформы отказ (8.3) равносилен возврату и нет смысла проверять на отказ. Кстати, я в какой-то момент попался на этом.

(30) На самом деле методологи 1С за такое по шапке дадут, ибо по канонам записывать нужно вот так

Движения.Записать();

А у конкретных наборов объекта движений документа установить свойство Движения.НаборЗаписейЧегоТо.Записывать = Истина. А свойство записывать установлено в "Записывать модифицированные"
34 Tateossian
 
29.12.17
01:02
(17) Принципиальная ошибка. Вот тут

транзакция

попытка
записьДокумента()
исключение

Откат транзакции <- Обязательно

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


фиксация транзакция

Ибо счетчик транзакций не сбросится в ноль и любая следующая транзакция выдаст ошибку из заголовка (а ты потом ходи ищи ошибку в коде).
35 H A D G E H O G s
 
29.12.17
01:08
(34) Не факт. Например, в типовых БСП ошибки фиксируются записью в регистр. Выходом является установка заглушки через ДополнительныеСвойства
36 Tateossian
 
29.12.17
01:36
(35) Разумеется, написанное мною - это самый простой случай:) В хороших (универсальных) решениях, претендующих на роль библиотечных решений, должно быть больше возможностей для анализа. Вот тут неплохая статья на ИТС обо всем этом:

https://its.1c.ru/db/v8std#content:-2145783148:hdoc:_top:транзакция%20зафиксировать
37 H A D G E H O G s
 
29.12.17
01:45
(36) А ты повзрослел, прямо на моих глазах, хнык.
Ведь я тебя помню совсем юным,
v8: Вопрос по оптимизации
(1)
38 Tateossian
 
29.12.17
02:12
(37) Спасибо:) Я дорос до целого начальника:) И мистяне тут не на последнем месте.
39 vi0
 
10.01.18
13:28
(36) Метод хороший - тот, который предлагается в п. 3.6
Единственное, в Журнале регистрации будет зарегистрировано столько одинаковых ошибок, сколько было вложенных транзакций.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.