|
Фоновое задание в обработке проведения | ☑ | ||
---|---|---|---|---|
0
Ryzeman
25.04.22
✎
08:26
|
У документа есть подписка на событие обработка проведения. В рамках неё происходит пара "тяжёлых" запросов и создание подчинённых документов за записью ссылки в них. Я бы хотел поместить весь тяжёлый код в фон (делал через БСП - длительные операции), но в рамках новой, фоновой транзакции, изменения в базе данных не видны. С подобным уже сталкивался, решил сериализацией табличных частей и нужных мне реквизитов в структуру и передачу её параметром. Тут такое не пройдёт - придётся слишком много чего переписывать. Кто-нибудь сталкивался с такой проблемой и есть ли изящное решение без ухода в регламентное задание?
|
|||
1
DGorgoN
25.04.22
✎
08:29
|
"В рамках неё происходит пара "тяжёлых" запросов и создание подчинённых документов за записью ссылки в них" - поубивав бы..
|
|||
2
Ryzeman
25.04.22
✎
08:33
|
(1) Согласен, но писал не я. Моя задача это всё дело максимально ускорить минимальными усилиями :)
|
|||
3
Мигрень
25.04.22
✎
08:33
|
(1) легко решается запуском фонового задания
|
|||
4
Ryzeman
25.04.22
✎
08:48
|
(3) ну, не так уж и легко если есть проблемы как в (0). Или речь про регламентное? Мне оно не подходит.
|
|||
5
PuhUfa
25.04.22
✎
08:53
|
(0) >>создание подчинённых документов за записью ссылки в них
Запись ссылок куда? |
|||
6
Serg_1960
25.04.22
✎
08:54
|
"изменения в базе данных не видны" - можно более подробно где именно они не видны? В открытых формах?
|
|||
7
Simod
25.04.22
✎
08:57
|
(0) Как собираешься отменять создание подчиненных документов при отказе проведения основного документа?
|
|||
8
Кир Пластелинин
25.04.22
✎
09:01
|
(7) + 1
|
|||
9
Serg_1960
25.04.22
✎
09:07
|
(7) Вызовом ещё одного фонового задания, "обратного" первому. "Я тебя породил, я тебя и убью"(с)
|
|||
10
Ryzeman
25.04.22
✎
09:35
|
(5) Там перекрёстно у нового документа в проводимы и назад.
|
|||
11
Ryzeman
25.04.22
✎
09:36
|
(7) Для этого это делается последней подпиской в самом конце с проверкой на отказ.
|
|||
12
Ryzeman
25.04.22
✎
09:38
|
(6) При чём тут формы? Записывается объект. Скажем, если это новый объект, то в подписке в обработке проведения ссылка на него уже будет существовать. И запросом можно выбрать его табличную часть, например. В фоновом же задании открывается новая транзакция, ссылка будет на новый пустой документ, а запрос по табличной части ничего не вернёт.
|
|||
13
Кир Пластелинин
25.04.22
✎
09:41
|
(11) а если потом кто то добавит еще одну подписку?)
|
|||
14
Ryzeman
25.04.22
✎
09:49
|
(13) Надавать ему по пальцам :) Если серьёзно, в этом плане у нас есть защиты от таких коллизий. Доработки по подпискам, которые влияют от отказов или могут к ним приводить все запихнуты в 1 процедуру на каждый документ, который стоит в конце. По (0) у кого-нибудь мысли есть? Не хочется ради такой мелочи перелопачивать всё :(
|
|||
15
PuhUfa
25.04.22
✎
09:58
|
(12) фоновое же ты запускаешь в самом конце подписки и транзакция проведения должна завершиться?
|
|||
16
Ryzeman
25.04.22
✎
09:59
|
(15) Сам механизм фонового задания именно что запускает отдельную независимую транзакцию, видимо, и на момент выполнения кода в ней результаты транзакции из подписки ещё не видны. В этом суть проблемы.
|
|||
17
Ryzeman
25.04.22
✎
10:03
|
Можно поэкспериментировать и паузу в 1 секунду добавить :-D Но это не решит ту же проблему с переданной ссылкой в параметре. Объект в фоновое задание не запихнуть параметром.
|
|||
18
mistеr
25.04.22
✎
10:05
|
(16) Не просто отельную транзакцию, а отдельный сеанс.
Нужно в фоновом дождаться, пока основная транзакция зафиксируется и изменения будут видны. |
|||
19
Serg_1960
25.04.22
✎
10:07
|
(12) Sorry, понедельник, утро... Чисто теоретически, сам объект --> ПоместитьВоВременноеХранилище(), без движений документа.
Некрасивое решение: можно скопировать и записать в базу; после использования в фоновом задании - удалить. |
|||
20
Ryzeman
25.04.22
✎
10:07
|
(18) Я это и имел ввиду, верно, там сеанс запускается. Возможно ли передать ссылку нового документа при этом?
|
|||
21
Ryzeman
25.04.22
✎
10:09
|
(19) чёт оба варианта какие то ужасные, но за наводки спасибо. Сам объект мало что даст и не лучше варианта с сериализацией.
|
|||
24
PuhUfa
25.04.22
✎
10:12
|
(17) Можно попробовать отвязаться от самого документа. И запускать фоновое задание из другого места. Например из РС или РН связанных с твоим документом.
|
|||
25
Ryzeman
25.04.22
✎
10:13
|
Кстати интересно, а что с ссылкой у объекта, который поместили во временное хранилище? Что вообще с ним происходит при помещении туда?
|
|||
26
Ryzeman
25.04.22
✎
10:14
|
(24) вот это интересная идея, спасибо, подумаю.
|
|||
27
Serg_1960
25.04.22
✎
10:25
|
(25) Чисто теоретически рассуждая, если учитывать что документ может быть записан без проведения, то самой ссылкой уже можно пользоваться в процедуре ПриЗаписи(), которая вызывается до ОбработкаПроведения().
|
|||
28
Simod
25.04.22
✎
10:29
|
(11) Нет такого понятия "последняя" подписка. Хоть практика показывает, что подписки на одно событие для объекта запускаются в порядке следования в дереве метаданных платформой не регламентирован порядок запуска. И завязываться на это нельзя.
(16) Проблема известная - платформа не имеет механизма запуска события "после окончания транзакции". Когда поднимется Infostart кину ссылку на статью. Может поможет. В общем случае советую разнести события: после создания основного документа формировать очередь задания на создание подчиненнных (связанных) и отдельным заданием ее обрабатывать. |
|||
29
mistеr
25.04.22
✎
10:30
|
(20) А в чем проблема передать ссылку?
|
|||
30
Serg_1960
25.04.22
✎
10:34
|
"А в чём проблема"(с) не использовать механизм отложенное проведение? :)
|
|||
31
Ryzeman
25.04.22
✎
10:35
|
(29) Для новых объектов её сеанс\транзакция фонового задания её не видит.
(28) Пока мне больше всего понравилась идея привязаться к РН и просто от него плясать. Тыркать регистратор не совсем красиво, конечно. Да и следующий кто будет разбираться где создаётся документ - прифигеет это искать. Гм, надо ещё подумать) |
|||
32
mistеr
25.04.22
✎
10:37
|
(31) Еще раз повторю (18):
> Нужно в фоновом дождаться, пока основная транзакция зафиксируется и изменения будут видны. |
|||
33
Ryzeman
25.04.22
✎
10:42
|
(32) ок интереса ради поиграюсь с паузой секунд в 5 как дойдут до этой задачи.Но даже если это поможет, решение выглядит ненадёжным.
|
|||
34
mistеr
25.04.22
✎
10:48
|
(33) Просто пауза конечно ненадежно. Нужно проверять запросом.
|
|||
35
Ryzeman
25.04.22
✎
11:04
|
(34) Да, ты абсолютно прав. Ожидание в несколько секунд решило проблему, и ссылку он определяет правильно. Видимо, он просто по ней не мог данные получить. Остаётся только дилемма как обезопасить схему и как не уйти в бесконечный цикл. Ну, это уже мои проблемы. Спасибо.
|
|||
36
Serg_1960
25.04.22
✎
11:05
|
Хех... а если тупо и без затей использовать ТранзакцияАктивна() для постановки фонового задания на "паузу"?
|
|||
37
Ryzeman
25.04.22
✎
11:12
|
(36) Для платформы это уже как другой сеанс. Т.е. ты как бы с двух сеансов выполняешь некие действия на сервере. Не думаю, что есть механизмы из первого увидеть транзакции второго.
|
|||
38
Ryzeman
25.04.22
✎
11:15
|
(37)+ А на все проверять как то страшновато.
|
|||
39
Мигрень
25.04.22
✎
11:21
|
я просто тупо сделал очередь на РС и фоновое задание автоматически проверяет эту очередь, после выполнения своей работы из очереди убирается ссылка на документ
|
|||
40
Simod
25.04.22
✎
11:29
|
||||
41
Simod
25.04.22
✎
11:31
|
(31) Лучше создать РС где записи это документы требующие обработки.
|
|||
42
Ryzeman
25.04.22
✎
12:31
|
(40) Спасибо.
Кому интересно, сделал в итоге так. Работает неплохо, но некоторая уязвимость всё равно есть. В фоновую процедуру передаётся ДокументСсылка - ссылка на документ и ВерсияДанных - свойство ссылки. Затем внутри самой процедуры я их сверяю, если не совпадают - жду три секунды. ЧислоПопыток = 0; Пока ЧислоПопыток < 5 Цикл ЧислоПопыток = ЧислоПопыток + 1; Если Версия = ДокументСсылка.ВерсияДанных Тогда Прервать; Иначе Если ЧислоПопыток = 5 Тогда Возврат; КонецЕсли; ОбщегоНазначенияБТС.Пауза(3); КонецЕсли; КонецЦикла; |
|||
43
timurhv
25.04.22
✎
12:48
|
(42) А что, версия данных всегда меняется? :)
|
|||
44
Fragster
гуру
25.04.22
✎
12:51
|
в фоновом задании начинай транзакцию и пробуй установить блокировку на документ. как только транзакция записи/проведения документа завершиться - блокировка установится и все будет как надо.
|
|||
45
Fragster
гуру
25.04.22
✎
12:51
|
(42) фубля
|
|||
46
Ryzeman
25.04.22
✎
12:59
|
(43) Когда есть изменения в документе документе - да, всегда. Если изменений не было, то и ждать не надо.
(44) Какой тайм-аут у блокировки? |
|||
47
Fragster
гуру
25.04.22
✎
13:02
|
(46) стандартный от базы, секунд двадцать. но если ты в себе уверен, то ты можешь это всё делать в цикле
|
|||
48
Ryzeman
25.04.22
✎
13:06
|
(47) Тогда не вижу принципиальной разницы кроме стилистической. Что там отвалится через 20 секунд в случае проблем что тут через 15. Блокировать саму запись мне не нужно - там в основном только чтение в запросе идёт. Самое грамотное решение было бы через РС и регламентное сделать, пожалуй, но пока мне это не подходит, если и буду переделывать в эту сторону, то потом и сразу всё. Сейчас просто попросили сделать что б посмотреть насколько это юзерам ускорит работу и стоит ли в этом направлении вообще двигаться.
|
|||
49
Fragster
гуру
25.04.22
✎
13:16
|
(48) принципиальная разница в скорости реакции (от окончания транзакции проведения документа до установки блокировки миллисекунды пройдут), независимости от ВК, работу не через "а мы уже приехали? а сейчас?".
|
|||
50
Ryzeman
25.04.22
✎
14:17
|
(49) Хорошая аналогия 😃 С одной стороны соглашусь, что так лучше и изящнее, с другой всё-таки опасаюсь нарваться на исключительную реакцию при блокировке. А если нагромождать попытками, то выйдет не лучше. Пока оставлю как есть, но за мнение спасибо)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |