Имя: Пароль:
1C
1С v8
Почему в модуле объекта не существует события ПослеЗаписи()?
,
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
[мысли в слух]
В платформе есть такая служба - "Служба регистрации изменений" механизма обмена данных,- работает точно и надёжно как швейцарские часы... к чему это я? Да, так просто, чего-то вспомнилось. Кто сказал, что план обмена нельзя использовать для функционала уведомлений? Это вам не квадратные колеса придумывать для своего лисапеда :)