|
Почему в модуле объекта не существует события ПослеЗаписи()? | ☑ | ||
---|---|---|---|---|
0
ssalikoff
23.10.22
✎
00:31
|
Здравствуйте!
Известно, что в модуле объекта есть обработчики событий ПередЗаписью(), ПриЗаписи(), ОбработкаПроведения(). Все они выполняются внутри транзакции записи, до её завершения. Также есть одноименные подписки на события, которые выполняются после соответствующих обработчиков. А это означает, что мы нигде, ни в обработчиках модуля объекта, ни в подписках не можем быть уверены в том, что объект успешно запишется, ведь транзакция не завершена. Вдобавок к этому есть ещё событие модуля формы ПриЗаписиНаСервере, у которого есть параметр Отказ. Вопрос: почему так сделали разработчики? Почему в модуле объекта не существует события ПослеЗаписи()? Если это сделано намеренно, то как следует правильно получать и обрабатывать событие записи нового объекта? Можно, конечно, использовать "кривые" пути, например, создавать фоновое задание, которое будет ждать на блокировке освобождение объекта, а потом проверять его версию, чтобы знать наверняка, успешно ли записался документ. Но это некрасиво по сравнению с методом ПослеЗаписи(), который не предоставляется платформой. |
|||
1
Garykom
гуру
23.10.22
✎
00:35
|
(0) Какой смысл?
Чем "не запись" отличается от записи и удаления? |
|||
2
Garykom
гуру
23.10.22
✎
00:37
|
Цель обработчиков выполнить дополнительные действия
А не контроль успешности записи Если так хочется то взводи фоновое задание ПриЗаписи() и потом да проверяй чтением объект |
|||
3
Garykom
гуру
23.10.22
✎
00:40
|
Или используй метод формы ПослеЗаписиНаСервере если интерактивно
|
|||
4
H A D G E H O G s
23.10.22
✎
00:41
|
(0) Лентяи.
Фоновое задание, в которое передаешь Ссылку и НовуюВерсиюДанных, а в фоновом читаешь по ссылке зафиксированную версию раз в секунду и сравниваешь с переданной. Как только станут равны - транзакция зафиксена. Паузу возьмете там же, где и ПослеЗаписи() |
|||
5
ssalikoff
23.10.22
✎
00:50
|
(3)(4) я в своём первом посте сам описал подобный приём с фоновым заданием, как вариант решения
И тут же добавил, что это криво и некрасиво по сравнению с ПослеЗаписи(), если бы он существовал |
|||
6
ssalikoff
23.10.22
✎
00:53
|
(3) если интерактивно, то вопросов нет, это очевидно.
Хотелось бы универсальное красивое решение, которое не предоставляет платформа. Вот и вопрос, почему не предоставляет. Разве это так сложно для разработчиков? Что они имеют в виду, лишая нас такой полезной функции? |
|||
7
H A D G E H O G s
23.10.22
✎
00:57
|
(6) Надеюсь, ты в курсе про ситуацию с реализацией функционала Пауза() в платформе, ведь да?
|
|||
8
ssalikoff
23.10.22
✎
00:59
|
(7) Есть ПодключитьОбработчикОжидания(), хотя, согласен, это не вполне замена паузе
|
|||
9
H A D G E H O G s
23.10.22
✎
01:04
|
(8) Пауза нужна на сервере прежде всего
|
|||
10
ДедМорроз
23.10.22
✎
20:01
|
Для объекта это событие не очень-то и нужно:
Во-первых,если мы что-то пишем или мегяем в базе,то это нужно делать в транзакции записи,т.к.если объект записался,а наш чудо-алглритм выдал ошибку,то непонятно,что делать в данном случае. Во-вторых,выполнение записи объекта может производиться в процессе работы алгоритма и непонятно,нужно ли останавливать алгоритм на выполнении после записи или нет. В третьих,выполнение записи может идти параллельно,и выполнить действия сразу после записи может быть затруднительно,так как другая транзакция может вклиниться после нашей. |
|||
11
Serg_1960
24.10.22
✎
09:10
|
(6) Всё далее сказанное - "имхо" разумеется:
Все связанные между собой изменения желательно делать в пределах одной общей для всех транзакции. Всё, что хотелось бы сделать в обработчике события "после записи"(с) - желательно делать ПриЗаписи (или при обработке проведения для документа, который проводится/перепроводится при записи). Да, не совсем удобно согласен. Но чего только не сделаешь, ради целостности и непротиворечивости данных под жестким контролем платформы. А иначе в информационной базе может возникнуть двусмысленная ситуация: измененный объект записан в базу и ещё какие-то сделанные изменения в обработчике "после записи"... или не сделанные? По какой-либо субъективной/объективной причине. Вам точно нужна такая неопределенность в информационной базе? Я так не думаю. |
|||
12
Жан Пердежон
24.10.22
✎
09:13
|
(0) а проблема-то в чем?
может нету, потому что это нафиг никому не надо? |
|||
13
KJlag
24.10.22
✎
09:32
|
(0) а расширение и &После ?
|
|||
14
polosov
24.10.22
✎
09:45
|
(0) Напиши пару примеров зачем это тебе нужно.
|
|||
15
СвинТуз
24.10.22
✎
10:53
|
(0)
ПриЗаписи() Объект уже записан. Осталось только транзакцию завершить На мой взгляд это и есть ПослеЗаписи. Если эта процедура будет пустая, то и объект уже записан. Видимо уже после записи есть желание перезаписать? Так это не правильно. Зачем? |
|||
16
СвинТуз
24.10.22
✎
10:55
|
Если что то после записи куда-то записать, есть опасения что битая ссылка будет,
так оно в транзакции ... |
|||
17
Новиков
24.10.22
✎
11:00
|
(0) >>как следует правильно получать и обрабатывать событие записи нового объекта?
Если я правильно все понял, то это больше к "ни в подписках не можем быть уверены в том, что объект успешно запишется, ведь транзакция не завершена." - ты там у себя хочешь нагенерить каких-то связанных объектов, но уверенности нет, что оно тебе точно надо? В этом корень вопроса, иначе не понятно, что ты там собрался правильно обрабатывать в модуле объекта? |
|||
18
b_ru
24.10.22
✎
11:02
|
Я думаю, они так сделали, потому что им так было проще. ПослеЗаписи объекта вызывалось бы после деструктора какого-то, пришлось бы делать дополнительную обвязку кода. Очень похоже, что просто поленились.
|
|||
19
Asmody
24.10.22
✎
11:35
|
(4) В твоём-то сценарии нахрена Пауза()?
|
|||
20
repin_mike
24.10.22
✎
13:09
|
(7) Нет, расскажи
|
|||
21
H A D G E H O G s
24.10.22
✎
13:23
|
(19) Как ты без нее подождешь окончания записи в основном потоке?
|
|||
22
polosov
24.10.22
✎
13:43
|
(21) А в чем технологический смысл отдавать в другой поток запись объекта, чтобы обрабатывать его "ПослеЗапись" в основном?
|
|||
23
H A D G E H O G s
24.10.22
✎
14:27
|
(22)
Светило солнышко и ночью и днём Не бывает атеистов в окопах под огнём Добежит слепой,победит ничтожный Такое вам и не снилось |
|||
24
ssalikoff
24.10.22
✎
16:53
|
Пояснение для тех, кто сомневается, зачем это вообще нужно.
Вот вам пример: нужно послать уведомление о том, что документ провёлся (создался). Как узнать, что документ действительно создался? Пока транзакция не завершена, это нельзя знать наверняка. А уведомление запихивать в транзакцию бессмысленно — если оно ушло, его не вернуть. |
|||
25
ejikbeznojek
24.10.22
✎
16:56
|
(24) Записать уведомление в РС и отправить его потом, по расписанию.
Если транзакция не завершится, то и записи в РС не будет)) |
|||
26
Kassern
24.10.22
✎
16:57
|
(25) А если запись в РС создаст ошибку, которая в итоге отменит основную транзакцию?)
|
|||
27
KJlag
24.10.22
✎
16:57
|
(24) создать регистр для уведомлений.
в транзакции пихать туда запись. - документ не создался(не провелся) - транзакция обломалась - запись регистра отменит. бегать регламентным по регистру |
|||
28
Kassern
24.10.22
✎
16:58
|
(24) А как убедится, что после завершения успешной транзакции у вас без ошибок рассылка отработала?
|
|||
29
ejikbeznojek
24.10.22
✎
16:59
|
(26) Если без уведомления совсем нельзя. То значит основная транзакция и должна быть отменена.
А если можно, то в попытке)) |
|||
30
Kassern
24.10.22
✎
17:01
|
(29) Вот будет прикол, если первичка вся колом встанет, из-за того, что почтовик нагнулся))
"А если можно, то в попытке))" - а это не поможет, будет ошибка, в данной транзакции уже происходили ошибки и пошлет лесом) |
|||
31
YFedor
24.10.22
✎
17:01
|
(24) Я думаю, что тут никто не сомневается, что наличие такой возможности было бы неплохо.
Есть еще куча всяких возможностей, наличие которых в 1с было бы совсем неплохо, но их тоже нет. |
|||
32
ssalikoff
24.10.22
✎
17:02
|
(25)(27) Конечно, это рабочий вариант, хотя и не единственный. Но черезчур сложный, по сравнению с использованием несуществующего обработчика события ПослеЗаписи(). В этом и есть первоначальный вопрос в этой теме.
|
|||
33
YFedor
24.10.22
✎
17:02
|
(30) вот именно по этому я и сделал у себя отправку уведомлений через регистр с фоновым заданием
|
|||
34
YFedor
24.10.22
✎
17:03
|
(32) Мы так и не поняли зачем тебе это нужно, но если для отправки, например, уведомлений по эл. почте, то я не советую, ибо (30)
|
|||
35
Kassern
24.10.22
✎
17:05
|
(32) Для почты в типовых есть документ Электронное письмо исходящее. У него есть типовой регламент по рассылке. Всего лишь нужно создать этот документ в транзакции, дальше все само отработает. Если же запись не удалась, то и документ не создастся. Тот же пример как с РС, только типовыми инструментами.
|
|||
36
ejikbeznojek
24.10.22
✎
17:07
|
(30) Ну ладно, тогда сдаюсь...Нужно регламентное задание стартовать.
но вообще в обработке проведения дописал вот такой код. И у меня он выполнился. И транзакция сломанной не стала. попытка ВызватьИсключение ("Какая-то ошибка"); Исключение дата=ТекущаяДата(); КонецПопытки; запрос=новый запрос; запрос.Текст= "ВЫБРАТЬ ПЕРВЫЕ 1 | АвансовыйОтчет.Ссылка КАК Ссылка |ИЗ | Документ.АвансовыйОтчет КАК АвансовыйОтчет"; результат=запрос.Выполнить().Выгрузить(); |
|||
37
ejikbeznojek
24.10.22
✎
17:09
|
(36) Запрос - это чтобы проверить. Сломанная транзакция или нет.
|
|||
38
Serg_1960
24.10.22
✎
17:10
|
[мысли в слух]
В платформе есть такая служба - "Служба регистрации изменений" механизма обмена данных,- работает точно и надёжно как швейцарские часы... к чему это я? Да, так просто, чего-то вспомнилось. Кто сказал, что план обмена нельзя использовать для функционала уведомлений? Это вам не квадратные колеса придумывать для своего лисапеда :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |