Имя: Пароль:
1C
 
Запись документа при отказе в проведении
0 deringpavel
 
01.05.20
09:59
Всем привет.
Столкнулся с ситуацией, когда документ не должен проводиться (отказ = истина), но при этом должен программно записаться. Делаю это в процедуре ПередЗаписью. Но документ не записывается.
Что делаю не так?

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

&НаСервере
Процедура ЗаписатьДокумент()
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры
</code>
1 vde69
 
01.05.20
10:13
так делать нельзя, причина 1с не поддерживает вложенных транзакций и ты по любому потом напоришся на другие ошибки
2 vde69
 
01.05.20
10:14
если тебе очень надо сделай свою кнопку "записать" и там выделывайся....

а вообще разбей логику на такую

сначало записать (без проведения)
потом попробовать провести и если не выйдет просто выйти
3 Cyberhawk
 
01.05.20
10:28
Не делай как (2).
Анализируй отказ в коде, инициирующем проведение, но уже после завершения транзакции.
Дополнительно нужно убедиться, что ты не находишься во вложенной транзакции. Если предполагается, что твой код будет выполняться внутри сторонней транзакции, то без персистентной очереди не обойтись. В этом случае пара ненадежных вариантов - пополнять ее через запуск ФЗ, либо писать в ЖР и шерстить его опосля.