Транзакция в событии ПередЗаписьюНаСервере.
В событии модуля формы документа ПередЗаписьюНаСервере мне необходимо создать второй документ программно. При этом, если создание второго документа завершилось неуспешно, то и первый не нужно проводить, а выдать сообщение пользователю. Как это лучше сделать? У меня есть 3 варианта:
Вариант 1. Открыть транзакцию в событии ПередЗаписьюНаСервере в модуле формы, провести второй документ и зафиксировать транзакцию. (Сработает ли это, если мы уже находимся в событии записи первого документа?). Получается вложенная явная транзакция в неявной. Тогда вопрос: надо ли явно фиксировать транзакцию проведения второго документа?
Вариант 2. Провести 2ой документ. В случае успешного проведения 2го документа попытаться провести 1ый документ. Если 1ый документ не проведён, то удалить второй документ и сообщить пользователю.
Вариант 3. Отправить проведение 2го документа в событие ПриЗаписи в модуле объекта. При неуспешном проведении 2го документа отменить его транзакцию явно, что приведёт и к отмене транзакции верхнего уровня, что нам и нужно.
Для наглядности прикреплю шпаргалку простого проведения одного документа =) (В ней нет информации о втором документе).
Вариант 1. Открыть транзакцию в событии ПередЗаписьюНаСервере в модуле формы, провести второй документ и зафиксировать транзакцию. (Сработает ли это, если мы уже находимся в событии записи первого документа?). Получается вложенная явная транзакция в неявной. Тогда вопрос: надо ли явно фиксировать транзакцию проведения второго документа?
Вариант 2. Провести 2ой документ. В случае успешного проведения 2го документа попытаться провести 1ый документ. Если 1ый документ не проведён, то удалить второй документ и сообщить пользователю.
Вариант 3. Отправить проведение 2го документа в событие ПриЗаписи в модуле объекта. При неуспешном проведении 2го документа отменить его транзакцию явно, что приведёт и к отмене транзакции верхнего уровня, что нам и нужно.
Для наглядности прикреплю шпаргалку простого проведения одного документа =) (В ней нет информации о втором документе).
Прикрепленные файлы:
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Вот этот вариант с доработками.
ПриЗаписи уже есть Ссылка. Следовательно можно ее использовать во 2 документе.
В попытке вызывать создание/проведение 2 документа с проверкой что такого документа еще нет..
Явно отменять транзакцию не нужно.
В Исключении вызывать исключение и передавать текст ошибки, чтобы не получать ошибку, что в данной транзакции уже были ошибки.
Любая ошибка/Отказ в любом из этих документов отменит общую транзакцию.
В Обработчике проведению этого лучше не делать. Там будет накладываться блокировка. Как минимум это увеличит время блокировок.
Вариант 3. Отправить проведение 2го документа в событие ПриЗаписи в модуле объекта. При неуспешном проведении 2го документа отменить его транзакцию явно, что приведёт и к отмене транзакции верхнего уровня, что нам и нужно.
Вот этот вариант с доработками.
ПриЗаписи уже есть Ссылка. Следовательно можно ее использовать во 2 документе.
В попытке вызывать создание/проведение 2 документа с проверкой что такого документа еще нет..
Явно отменять транзакцию не нужно.
В Исключении вызывать исключение и передавать текст ошибки, чтобы не получать ошибку, что в данной транзакции уже были ошибки.
Любая ошибка/Отказ в любом из этих документов отменит общую транзакцию.
В Обработчике проведению этого лучше не делать. Там будет накладываться блокировка. Как минимум это увеличит время блокировок.
Очень плохая идея с точки зрения архитектуры. Очень желательно пересмотреть
1) В транзакции записи/проведения одного документа создавать другой.
2) Делать алгоритм изменения данных в форме.
Что делать при распроведении/пометке на удаление обоих документов? Что делать при повторной записи/проведении ПервогоДокумента?
Сделайте отдельную функцию в модуле объекта, а из формы будете её вызывать.
Примерно такой алгоритм:
А так, конечно, можно и "костыльнуть" в ОбработкаПроведения, и тогда даже явная транзакция не нужна.
Типа:
1) В транзакции записи/проведения одного документа создавать другой.
2) Делать алгоритм изменения данных в форме.
Что делать при распроведении/пометке на удаление обоих документов? Что делать при повторной записи/проведении ПервогоДокумента?
Сделайте отдельную функцию в модуле объекта, а из формы будете её вызывать.
Примерно такой алгоритм:
Результат = Новый Структура;
Результат.Вставить("ЕстьОшибки", Ложь);
Результат.Вставить("ОписаниеПричиныОшибки", "");
НачатьТранзакцию();
Попытка
УдалосьСоздатьВторойДокумент = Ложь;
СоздатьВторойДокумент();
УдалосьСоздатьВторойДокумент = Истина;
ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Результат.Вставить("ЕстьОшибки", Истина);
Если Не УдалосьСоздатьВторойДокумент Тогда
Результат.Вставить("ОписаниеПричиныОшибки", "Не удалось создать ВторойДокумент");
Иначе
Результат.Вставить("ОписаниеПричиныОшибки", "Не удалось провести ПервыйДокумент");
КонецЕсли;
КонецПопытки;
Возврат Результат;
ПоказатьА так, конечно, можно и "костыльнуть" в ОбработкаПроведения, и тогда даже явная транзакция не нужна.
Типа:
Если Не УдалосьСоздатьВторойДокумент() Тогда
Отказ = Истина;
КонецЕсли;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот