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

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

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

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

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

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