Как откатить транзакцию с фоновыми заданиями

1. yesmax7 17.11.23 08:44 Сейчас в теме
1С:Предприятие 8.3 (8.3.23.1865)
Управляемые формы
Привожу проблему на упрощенном примере для понимания
Суть проблемы:
Начинаем транзакцию
Создаем документ РТУ (пока не записываем)
Фоновыми заданиями параллельно создаем 100 номенклатур
Заполняем РТУ этими номенклатурами
(В каждом фоновом задании созданные номенклатуры помещаются в буфер - регистр сведений. Оттуда мы берем при заполнении РТУ и тут же очищаем регистр сведений)
Записываем РТУ
Если РТУ записывается, то все ок.
Если РТУ не записывается, тогда выполняем отмену транзакций
Но номенклатуры остаются, т. к. они были созданы фоновыми заданиями.
(Регистр сведений Буфер, естественно, тоже остается заполненным, т. к. произошел * транзакций)
Как можно откатить эти действия тоже? Чтобы не создавались номенклатуры
Фоновые задания используются, чтобы распараллелить процесс. Без них выполняется в разы дольше
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DENSKR 15 17.11.23 08:56 Сейчас в теме
(1) А почему РТУ может не записаться?
4. yesmax7 17.11.23 09:04 Сейчас в теме
(2)Это выдуманный пример. Там другой самописный документ.
Не записаться может по любой причине. В любом случае механизм отмены транзакции должен работать
3. laperuz 46 17.11.23 09:02 Сейчас в теме
Результат успешности/неуспешности записи РТУ зависит от каких-либо реквизитов номенклатуры?
5. yesmax7 17.11.23 09:05 Сейчас в теме
(3)Уже писал выше.
Это выдуманный пример. Там другой самописный документ.
Не записаться может по любой причине. В любом случае механизм отмены транзакции должен работать.
В данном примере от номенклатуры не зависит
6. DENSKR 15 17.11.23 09:09 Сейчас в теме
(5) А как тогда проверить возможность записи, от чего то должно зависить...
Есть установленные правила использования транзакций...
Запомнить весь перечень создаваемых данных и при исключении в транзакции удалять.
9. yesmax7 17.11.23 09:39 Сейчас в теме
(6)Перечитал правила использования транзакций. Про фоновые задания там, к сожалению, нет примеров.
Может не совсем правильно использовать фоновые задания в транзакции, но без них будет долго обрабатываться процесс.
Возможность отменять транзакцию в любом случае нужна.
Я написал упрощенный проблем для пониманию сути, реальный процесс намного сложнее чтобы обойтись без транзакций.
10. yesmax7 17.11.23 09:40 Сейчас в теме
(6)Опишу по подробнее. Номенклатуры в моем примере - это расходные ордера
Есть пул заказов клиента. Может быть от 10 до 500 документов.
По этим заказам нужна создать расходные ордера по определенному принципу. Их может быть меньше чем заказов, а может быть столько же.
Сначала нужно создать пересчеты товаров не все номенклатуры из заказов клиента, которых не хватает на складе.
Затем нужно создать эти расходные ордера. Вот туда код выполняется долго, если не использовать фоновые задания.
Затем нужно поместить все созданные расходные ордера в табличную часть самописного документа и записать самописный документ.
Затем нужно заполнить регистр со статусом этого документа.
Затем нужно очистить другой регистр с этим документом, чтобы он не обрабатывался второй раз.
Затем в случае необходимости нужно создать перемещения товаров.
Только потом зафиксировать транзакцию.
Если хотя бы что-то не запишется, то все это нужно вернуть.
7. laperuz 46 17.11.23 09:15 Сейчас в теме
(5)Ну просто можно же изменить подход и не завязываться на транзакции.
Документ заполняем номенклатурой с помощью ПолучитьСсылку(), пытаемся записать документ. Если все ок, передаем в фоновые гуиды и создаем номенклатуру через УстановитьСсылкуНового(). Если не ОК, то ничего и не создавали.
8. DENSKR 15 17.11.23 09:18 Сейчас в теме
(7) Да вот не понятно что ему конкретно нужно. Может быть номенклатура уже должна быть создана, а может быть не должна, может быть "Буфер" при очистке создает блокировки, может не создает, может и не нужны фоновые задания вовсе.
12. yesmax7 17.11.23 09:46 Сейчас в теме
(8)Я создавал ветку, мне было интересно, можно ли отменить результат фонового задания из транзакции. Получается что нет. Видимо придется в исключении программно удалять эти документы/номенклатуры
11. yesmax7 17.11.23 09:45 Сейчас в теме
(7)Мне нравится твоя идея, но есть ряд трудностей.
Номенклатуры в моем примере - это расходные ордера
Я заранее не знаю, сколько будет расходных ордеров, чтобы записать документ сначала.
Вдруг часть ордеров создадутся, а часть нет. Хотелось бы возможность отмены этих документов тоже. И по том в ТЧ останется битая ссылка, следовательно ее надо удалить, опять записывать документ.
13. DENSKR 15 17.11.23 09:51 Сейчас в теме
(11) А что влияет на количество создаваемых РО и их проведение, может поставить проверку на наличие на складах итд? Тут грамотно цепочку процесса нужно организовать.
14. yesmax7 17.11.23 10:01 Сейчас в теме
(13)Функция создания РО стандартная (из БСП).
Туда передаешь склад, поставщика и массив заказов. Она возвращает массив или таблицу созданных расходных ордеров.
Скорре всего, массив из 1 значения, тогда можно подставить туда ГУИД. Но может же создадутся несколько ордеров. Я подумаю над этим
15. soft_wind 17.11.23 10:26 Сейчас в теме
(14) переделывайте свою логику
1.вообще сделайте регламентное задание, которое как раз и работает в фоне
2.Начните транзакцию
2.соберите/создайте свои РО или что там еще
3.если создались исходные данные, создайте РТУ и проведите его
4.если успешно фиксируйте транзакцию, если не успешно отменяйте ее (при этом отменится и п.2)

все эти действия в рамках одного рег.задания
рег.задание работает по расписанию, его так-же можно запускать и по необходимости (интерактивно)
16. soft_wind 17.11.23 10:42 Сейчас в теме
(14) еще вариант обхода
если фоновое задание выполнилось и внутри его не отработала отмена транзакции
созданные там объекты зафиксированы в базе.

(как у нас было)
если у вас при обработке РТУ возникает необходимость отмены транзакции
то в этой ветке просто надо ЯВНО удалить все созданные объекты в фоновом задании
тем более что у вас есть их список в регистре РС
Оставьте свое сообщение

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