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