|   |   | 
| 
 | Фоновое задание в обработке проведения | ☑ | ||
|---|---|---|---|---|
| 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) Хорошая аналогия 😃 С одной стороны соглашусь, что так лучше и изящнее, с другой всё-таки опасаюсь нарваться на исключительную реакцию при блокировке. А если нагромождать попытками, то выйдет не лучше. Пока оставлю как есть, но за мнение спасибо)     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |