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

  1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Как победить ошибку "В данной транзакции уже происходили ошибки"

Как победить ошибку "В данной транзакции уже происходили ошибки"
Я
   ildary
 
20.11.18 - 14:33
Уважаемые специалисты, посоветуйте пожалуйста, как правильно в КА2 исправить появление вот такой ошибки:

Добавленный в КА2 2.4.5.86 документ при проведении делает следующее (документ не мой, делали до меня):

Вызывается процедура в которой происходит запись в РС примерно так:

    НачатьТранзакцию();
    
    Попытка
        НаборЗаписей.Записать(Ложь);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
    КонецПопытки;

    ЗафиксироватьТранзакцию(); 

При выполнении ОбщегоНазначенияКлиентСервер.СообщитьПользователю() появляется ошибка. Я погуглил и решил отказать от транзакции вообще (т.к. проведение уже вызывает транзакцию) - не помогло. Попробовал делать транзакцию как советует ИТС:

        НачатьТранзакцию();
        
        Попытка
            
            НаборЗаписей.Записать(Ложь);
            ЗафиксироватьТранзакцию(); 
            
        Исключение
            
            ОтменитьТранзакцию();
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
            
        КонецПопытки;


тоже не помогло.

Увидел в интернете, что корень зла в том, что во всём виновата обработка исключения сделал вот так:

        ЕстьОшибка = Истина;
        Попытка
            
            НаборЗаписей.Записать(Ложь);
            ЕстьОшибка = Ложь;
            
        Исключение
        КонецПопытки;
        
        Если ЕстьОшибка Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
        КонецЕсли;


тоже не помогло. Сижу, чешу репу. Наверное самое правильное - вообще убрать попытку, но тогда как ловить ошибку записи в РС?
 
 
   Остап Сулейманович
 
101 - 24.11.18 - 12:14
(98) ГЫ. "Учить можно но не очень приятно"
Реализация класса в большинстве случаев закрыта. И "Учить" ты можешь только вызов публичных методов. И не можешь "учить" вызовы приватных.
Ну да бог с ним...
   Рэйв
 
102 - 24.11.18 - 12:15
не гугли..Быстродавай:-)
   Остап Сулейманович
 
103 - 24.11.18 - 12:15
(100) Поищи в своих интернетах. Там должно было быть.
   Рэйв
 
104 - 24.11.18 - 12:17
(103)конечно должно быть. я и так знаю.
Только ты нуб в программировании и не надо тут из себя строить
   Darych
 
105 - 24.11.18 - 12:17
Пиписки одинаковые... можно убирать
   Рэйв
 
106 - 24.11.18 - 12:17
:-)
   Рэйв
 
107 - 24.11.18 - 12:18
(105)У него в программинге вообще пипски нет.
   Остап Сулейманович
 
108 - 24.11.18 - 12:19
(107) Ну все. Ты конечно первый переТц. Хоть и не в курсе за инкапсуляцию. Ну то такое...
   Рэйв
 
109 - 24.11.18 - 12:21
(108)Я даже знаю что такое инкапсуляция. Но тебе не скажу.Сам учись:-)
   Остап Сулейманович
 
110 - 24.11.18 - 12:25
(109) Когда для объекта ДокументDOM выкатишь реализацию метода ВставитьПеред() - продолжим. А пока (с учетом (98)) - ты то что прописано в (84).
 
 Рекламное место пустует
   Рэйв
 
111 - 24.11.18 - 12:32
>>реализацию метода ВставитьПеред() 
Это как раз наследование:-)
   Рэйв
 
112 - 24.11.18 - 12:32
Ну продолжай...
   Остап Сулейманович
 
113 - 24.11.18 - 12:37
(111) Реализация = наследование? Такого я еще не слышал...
Впечатление такое, что на форуме бот с произвольной генерацией текста...
   Рэйв
 
114 - 24.11.18 - 12:39
(113)>> Реализация = наследование
Да запросто.
   Рэйв
 
115 - 24.11.18 - 12:39
Мне интересны твои доводы против:-)
   Остап Сулейманович
 
116 - 24.11.18 - 12:40
(114) Я уже не удивляюсь.
   Рэйв
 
117 - 24.11.18 - 12:40
(116)Естественно.Ты идешь паситсь:-))
   Рэйв
 
118 - 24.11.18 - 12:40
Пастись и есть траву:-))
   Остап Сулейманович
 
119 - 24.11.18 - 12:41
(117) А кроме хамства еще какие-нибудь аргументы есть?
   Рэйв
 
120 - 24.11.18 - 12:42
(119)У меня тоесть.А у тебя нет.
   vi0
 
121 - 24.11.18 - 12:42
кто пустил детей в интернеты
   Рэйв
 
122 - 24.11.18 - 12:43
(121)Они там живут(дети),сволочи..
   lamina
 
123 - 24.11.18 - 18:31
(74) Ты пишешь: "если код не в глобальной транзакции то делать надо так". Можно получить объяснения, зачем? Не словами, а примером кода, который не будет работать, если это правило не соблюсти.

Все что я смог по этому поводу, уже написал, повторяю: пример кода был в 21, а твой случай 68 - ничего там делать не нужно, поэтому примера кода нет.
   Конструктор1С
 
124 - 24.11.18 - 18:41
Учись юзать ВызватьИсключение
   vde69
 
125 - 24.11.18 - 20:30
(123) понимаешь в чем дело, в 1с нет стека транзакций и флаг отката транзакции он глобальный, то есть без разнице на каком уровне произошла ошибка ты не сможешь откатить или зафиксировать одну транзакию внутри другой.

по этому код в (21) это банально мусор...

теперь объясняю почему 74 правильно:
запись документа - это не явная транзакция и если в ней происходит ошибка то она взводит глобальный флаг ошибкитранзакции, и по этому если в ней произошла ошибка надо явным образом откатить транзакцию верхнего уровня,  или вообще не надо делать верхнюю транзакцию
   vi0
 
126 - 25.11.18 - 13:19
кстати, кто там говорил что в типовых не ипользуется эскалация исключения (ВызватьИсключение;)
посмотрите ут11 - на каждом шагу
   Остап Сулейманович
 
127 - 25.11.18 - 14:00
(126) Всему должно быть место и время.
То, что исключение должно быть обработано на своем уровне изоляции - это да.
Но вот такой пример. Из моей практики. Обращение к ВЕБ-Сервису с передачей некорректных параметров. Теоретически возможно проанализировать параметры, обработать и вернуть допустим код ошибки. Вроде все правильно. НО. В таком варианте ошибка самого ВЕБ-сервиса будет неотличима от ошибки на вызывающей стороне. Потому в модуле ВЕБ-сервиса вызывается такая вот фигня :
ВызватьИсключение "Трам пам пам";

И тогда ошибка вызывающей стороны диагностированная в ВЕБ-сервиса вызовет исключение не у себя в модуле, а передаст выше по стеку вызовов.
   Остап Сулейманович
 
128 - 25.11.18 - 14:01
+ (127) А по поводу транзакций - вот здесь https://its.1c.ru/db/metod8dev#content:2313:hdoc все от "создателя".
   vi0
 
129 - 25.11.18 - 14:30
(128) тут вопросов нет
   vi0
 
130 - 25.11.18 - 14:30
(127) чет не понял, что ты сказать хотел
   Остап Сулейманович
 
131 - 25.11.18 - 15:00
(130) Насчет кидать исключения наверх или нет.
1. Стараться не кидать.
2. Смотреть по обстоятельствам.
  1  2

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