Транзакция в событии ПередЗаписьюНаСервере.

1. Aleksey_Abramov 21.03.24 20:29 Сейчас в теме
В событии модуля формы документа ПередЗаписьюНаСервере мне необходимо создать второй документ программно. При этом, если создание второго документа завершилось неуспешно, то и первый не нужно проводить, а выдать сообщение пользователю. Как это лучше сделать? У меня есть 3 варианта:

Вариант 1. Открыть транзакцию в событии ПередЗаписьюНаСервере в модуле формы, провести второй документ и зафиксировать транзакцию. (Сработает ли это, если мы уже находимся в событии записи первого документа?). Получается вложенная явная транзакция в неявной. Тогда вопрос: надо ли явно фиксировать транзакцию проведения второго документа?

Вариант 2. Провести 2ой документ. В случае успешного проведения 2го документа попытаться провести 1ый документ. Если 1ый документ не проведён, то удалить второй документ и сообщить пользователю.

Вариант 3. Отправить проведение 2го документа в событие ПриЗаписи в модуле объекта. При неуспешном проведении 2го документа отменить его транзакцию явно, что приведёт и к отмене транзакции верхнего уровня, что нам и нужно.

Для наглядности прикреплю шпаргалку простого проведения одного документа =) (В ней нет информации о втором документе).
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. spacecraft 22.03.24 11:09 Сейчас в теме
(1)
Вариант 3. Отправить проведение 2го документа в событие ПриЗаписи в модуле объекта. При неуспешном проведении 2го документа отменить его транзакцию явно, что приведёт и к отмене транзакции верхнего уровня, что нам и нужно.

Вот этот вариант с доработками.
ПриЗаписи уже есть Ссылка. Следовательно можно ее использовать во 2 документе.
В попытке вызывать создание/проведение 2 документа с проверкой что такого документа еще нет..
Явно отменять транзакцию не нужно.
В Исключении вызывать исключение и передавать текст ошибки, чтобы не получать ошибку, что в данной транзакции уже были ошибки.

Любая ошибка/Отказ в любом из этих документов отменит общую транзакцию.

В Обработчике проведению этого лучше не делать. Там будет накладываться блокировка. Как минимум это увеличит время блокировок.
2. Vadim-SH 22.03.24 06:43 Сейчас в теме
По моему, достаточно присвоить Отказ=Истина и транзакция записи документа отменит все изменения сделанные внутри нее.
3. novohatko 22.03.24 06:55 Сейчас в теме
А чем не нравиться событие "Обработка проведения", при ошибке проведения транзакция будет отменена ?
4. Onwardv 64 22.03.24 10:26 Сейчас в теме
Очень плохая идея с точки зрения архитектуры. Очень желательно пересмотреть
1) В транзакции записи/проведения одного документа создавать другой.
2) Делать алгоритм изменения данных в форме.

Что делать при распроведении/пометке на удаление обоих документов? Что делать при повторной записи/проведении ПервогоДокумента?

Сделайте отдельную функцию в модуле объекта, а из формы будете её вызывать.

Примерно такой алгоритм:

Результат = Новый Структура;

Результат.Вставить("ЕстьОшибки", Ложь);
Результат.Вставить("ОписаниеПричиныОшибки", "");

НачатьТранзакцию();
Попытка

    УдалосьСоздатьВторойДокумент = Ложь;
    СоздатьВторойДокумент();
    УдалосьСоздатьВторойДокумент = Истина;

    ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

Исключение
    ОтменитьТранзакцию();

    Результат.Вставить("ЕстьОшибки", Истина);
    Если Не УдалосьСоздатьВторойДокумент Тогда
        Результат.Вставить("ОписаниеПричиныОшибки", "Не удалось создать ВторойДокумент");
    Иначе 
        Результат.Вставить("ОписаниеПричиныОшибки", "Не удалось провести ПервыйДокумент");
    КонецЕсли;
КонецПопытки;

Возврат Результат;
Показать


А так, конечно, можно и "костыльнуть" в ОбработкаПроведения, и тогда даже явная транзакция не нужна.
Типа:

Если Не УдалосьСоздатьВторойДокумент() Тогда
   Отказ = Истина;
КонецЕсли;
6. Aleksey_Abramov 22.03.24 10:58 Сейчас в теме
(4) Буду делать в обработке проведения. Первый ваш вариант не очень хорош тем, что при успешном проведении 2го документа, первый может завершиться с ошибкой, а транзакции уже нет, и проведение 2го не отменишь просто так.
8. Onwardv 64 22.03.24 12:59 Сейчас в теме
(6) Посмотрите внимательнее, нет там такой проблемы.
5. Onwardv 64 22.03.24 10:47 Сейчас в теме
И не забывайте про любителей групповой обработки документов.
Наверняка у Вас такие пользователи есть, массово перепроводящие документы перед сдачей отчетности в госорганы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот