Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

ЗУП 3 Подписка ПриЗаписи Сотрудника вызывает В данной транзакции произошли уже ошибки

ЗУП 3 Подписка ПриЗаписи Сотрудника вызывает В данной транзакции произошли уже ошибки
Я
   zippygrill
 
04.03.21 - 13:34
Привет!
Надо мне приЗаписи сотрудника запомнить его в собственный регистр сведений.
Создал подписку, обработчик - в нем написал создание записи РС через Менеджер записи.

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

При сохранении сотрудника в Предприятии, если Попытка - удачная то, никаких ошибок нет, карточка сохраняется.
Но как только мы в Исключение попадаем, выполнение кода продолжает выполнятся до Заблокировать(). Этот метод находится в типовом ОМ.СотрудникиФормыБазовый.ЗаписатьТекущиеДанные()

            БлокировкаДанных = Новый БлокировкаДанных;
            ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.ТекущиеКадровыеДанныеСотрудников");
            ЭлементБлокировкиДанных.УстановитьЗначение("Сотрудник", СотрудникОбъект.Ссылка);
            БлокировкаДанных.Заблокировать(); // падает с ошибкой "В данной транзакции уже произошли ошибки"

По стеку вызовов прошел до Заблокировать() - нигде не встретилось НачатьТранзакцию(), но в Исключение метод ТранзакцияАктивна() = ИСТИНА ..ничего не понимаю
   youalex
 
1 - 04.03.21 - 13:47
(0) ТранзакцияАктивна() = Истина  - это может быть неявная транзакция при записи объекта.
Но если в этот момент вызвать ОтменитьТранзакцию() - будет ошибка, емнип..
   zippygrill
 
2 - 04.03.21 - 13:51
(1) Но если в этот момент вызвать ОтменитьТранзакцию() - будет ошибка, емнип.. -- какой то замкнутый круг.. прорбовал и Отменить и Зафксировать(чтобы счетчик транзакции уменьшился) --все равно ошибка
   zippygrill
 
3 - 04.03.21 - 13:52
Пока решение одно: МЗ делать только в том случае если все измерения обязательные к заполнению - заполнены.
   zippygrill
 
4 - 04.03.21 - 13:52
и без попытки
   rozer76
 
5 - 04.03.21 - 14:00
первая неявная транзакция и ней ты свою пилишь, там исключение. Тут надо вызватьисключение и все. В поломанной транзакции нельзя обращаться с ИБ и первая транзакция не зафиксируется если уже у тебя была ошибка и не важно обрабатываешь ты в исключении или нет. https://its.1c.ru/db/metod8dev#content:2313:hdoc
   rozer76
 
6 - 04.03.21 - 14:03
+(5)

Попытка
        МЗ.Записать();
    Исключение        
        ВызватьИсключение "Все печально" + ТекстСообщения;
    КонецПопытки;
   zippygrill
 
7 - 04.03.21 - 14:06
(6) ВызватьИсключение прерывает дальнейшее выполнение кода, а мне этого не надо
   rozer76
 
8 - 04.03.21 - 14:08
(7) не получится по другому ты уже в неявной транзакции свою неявную делаешь - или все или ничего )
   zippygrill
 
9 - 04.03.21 - 14:11
(8) тогда надо делать как в (3)
   rozer76
 
10 - 04.03.21 - 14:14
(9) ну да, и не надо никаких попыток. И если например, ляжет на блокировке то все и откатится разом
   zippygrill
 
11 - 04.03.21 - 14:19
неявная транзакция выбило меня..еще, признак в пользу наличия неявной транзакции было отсутствия записи в успешном попытке..а я игнорировал :)

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