Имя: Пароль:
1C
1С v8
Провести второй документ в транзакции первого
0 TrueBuild
 
27.05.21
10:35
Задача: после успешного проведения документа автоматически сформировать и провести другой документ. Но другой документ может не провестись и вызвать исключение, в таком случае просто записать его, оставив непроведенным.
Соответственно проблема в том, что первый документ проводится в транзакции и, если мы вклиниваемся в транзакцию записи первого документа, пытаемся там провести второй документ, а он вызывает исключение, то мы и первый не сможем провести.

Единственное, что приходит на ум, это создать какой-то регистр очереди, куда после успешного проведения первого документа записывать ссылку на него. А регламентным заданием постоянно читать эту очередь и на основании данных очереди формировать второй документ.

Но, мне кажется, какое-то слишком сложное решение для такой простой задачи. Да и лишняя нагрузка на базу в виде регл.задания, которое будет регулярно дергать регистр.
1 Dmitry77
 
27.05.21
10:42
Попытка исключение
2 ДенисЧ
 
27.05.21
10:44
(1) Что, в 1с уже вложенные транзакции завезли?
3 ДенисЧ
 
27.05.21
10:44
(0) Только регистр или подобная структура.
4 RomanYS
 
27.05.21
10:45
(0) после любого проведения? Или речь про конкретную форму?
5 Bigbro
 
27.05.21
10:47
из формы то без проблем, а если всякие пакетные перепроводки.
6 TrueBuild
 
27.05.21
10:56
(4) (5) После любого проведения. Из формы да, без проблем можно было бы реализовать.
7 youalex
 
27.05.21
10:58
Можно в сторону фоновых заданий посмотреть , но не факт, что это норм решение.
8 FN
 
27.05.21
10:59
(0) Можно и без регистра. Просто создаешь второй документ с реквизитом "требует проведения" и не проводишь его.
А проведение уже в регламентированном задании. Которое можно даже не по расписанию запускать, а прямо из кода после создания всех доков и закрытия транзакции.
9 Irbis
 
27.05.21
11:01
(0) Изначально идея куёвая. Нужно трансформировать задачу.
10 TrueBuild
 
27.05.21
11:01
(7) Думал об этом. Но фоновое задание не видит ссылку на объект, который еще пишется в транзакции.
Как вариант, можно отправлять проведение второго документа в фоновое задание из первого, в фоновом задании делать паузу несколько секунд-минут, чтобы там была доступна ссылка. Но это костыль какой-то.
11 ДедМорроз
 
27.05.21
13:45
При проведении первого документа запускаем фоновое задание и передаем в него ссылку на документ.
Фоновое задание читает наш документ,и сможет прочитать только тогда,когда основная транзакция зааершилась,теперь можно проводить второй документ.
12 Вафель
 
27.05.21
13:49
(2) если вложенная откатывается то и верхняя откатывается
вне зависимости от поддержки вложенных
13 Ногаминебить
 
27.05.21
13:52
План обмена может? И регламентом потом анализировать. Или надо чтоб прям вот сразу после сформировался второй?
14 ДенисЧ
 
27.05.21
13:57
(12) Спасибо, кэп
15 Garykom
 
гуру
27.05.21
14:08
(11) Механизм защиты от сбоев где?
16 TrueBuild
 
27.05.21
14:23
(11) Ты имеешь в виду в фоновом запускать бесконечный цикл, который будет обращаться к ссылке, пока не сможет прочитать ее?
17 Вафель
 
27.05.21
14:24
(12) с поддержкой вложенных еще идут точки сохранения. можно откатиться до последней точки сохранения внутри большой транзакции и дальше считать
18 Вафель
 
27.05.21
14:25
(0) как вариант юзать аналоги отложенного проведения.
те в транзакции писать. а проведется как нибудь само. ну или не проведется
19 fisher
 
27.05.21
15:44
(0) > Но, мне кажется, какое-то слишком сложное решение для такой простой задачи. Да и лишняя нагрузка на базу в виде регл.задания, которое будет регулярно дергать регистр.
Тебе кажется. Норм решение.
20 TrueBuild
 
27.05.21
17:32
(19) Ну ладно, убедили ))
21 Dark_Warrior
 
28.05.21
09:23
(9) +

>> Единственное, что приходит на ум, это создать какой-то регистр очереди, куда после успешного проведения первого документа записывать ссылку на него. А регламентным заданием постоянно читать эту очередь и на основании данных очереди формировать второй документ.

Хотя бы так. Либо просто регламент с анализом, без очереди.
22 mistеr
 
28.05.21
09:28
(0) Выявить условия, при которых второй документ не проведется, на этапе проверки первого документа. И соответственно выставлять режим записи.