|   |   | 
| 
 | ПослеЗаписиНаСервере() не выполняется, если до этого был Отказ = Истина | ☑ | ||
|---|---|---|---|---|
| 0
    
        SeiOkami 15.04.20✎ 11:55 | 
        Добрый день.
 В общем, столкнулся со, скорее всего, банальной ситуацией. На УФ документа есть событие ПослеЗаписиНаСервере() И оно обрабатывает после записи дополнительные свойства объекта. Так вот, оказалось, что это событие не выполнится, если документ не завершит транзакцию. И нет никаких событий, которые позволят обработать доп.свойства документа уже после попытки записи. Или есть какие-то способы? | |||
| 1
    
        Ёпрст гуру 15.04.20✎ 11:59 | 
        (0)Дык если записи не было, то и события нет.
 Зачем оно вам ? | |||
| 2
    
        ДенисЧ 15.04.20✎ 12:03 | 
        Если документ не записался - то откуда возьмётся ПослеЗаписи() ?
 finally в 1с пока нет... | |||
| 3
    
        SeiOkami 15.04.20✎ 12:11 | 
        (1), в процессе записи происходят проверки. И подробные данные о результатах этих проверок хранятся в ДопСвойствах.
 Нужно после попытки записи (даже неудачной) эти данные получить и сохранить в данных формы | |||
| 4
    
        Ненавижу 1С гуру 15.04.20✎ 12:13 | 
        (3) зачем? что делать когда проведение будет из списка вызвано или вообще не интерактивно?     | |||
| 5
    
        Cyberhawk 15.04.20✎ 12:14 | 
        (4) Очевидно же - запишет в ЖР. А вот если из формы, то красиво хочет показать пользователю.     | |||
| 6
    
        Ненавижу 1С гуру 15.04.20✎ 12:17 | 
        (5) показать пользователю и так можно
 СообщениеПользователю никто не отменял | |||
| 7
    
        SeiOkami 15.04.20✎ 12:28 | 
        (4), это работает только при интерактивной записи из формы документа     | |||
| 8
    
        SeiOkami 15.04.20✎ 12:29 | 
        (5), это не сообщения, а структура с данными, которые потом отображаются пользователю     | |||
| 9
    
        Ёпрст гуру 15.04.20✎ 12:39 | 
        (3)Ну и пиши эту хрень в ПриЗаписи куда нужно, если ошибка..Нафига после ?     | |||
| 10
    
        ДенисЧ 15.04.20✎ 12:42 | 
        (9) Так если ПриЗаписи отвалится, так и транзакция тоже )))
 Куда предлагаешь писать? | |||
| 11
    
        Ёпрст гуру 15.04.20✎ 13:44 | 
        (10) в файл     | |||
| 12
    
        SeiOkami 15.04.20✎ 14:05 | 
        (11), мне эти данные нужны на время существования формы документа. Зачем в файл писать? 0_о     | |||
| 13
    
        Ёпрст гуру 15.04.20✎ 14:06 | 
        (12) тогда показывай сообщение     | |||
| 14
    
        Ёпрст гуру 15.04.20✎ 14:06 | 
        или пихай в оповещение     | |||
| 15
    
        Ёпрст гуру 15.04.20✎ 14:07 | 
        как сделано, например во всех типовых при печати чека     | |||
| 16
    
        Fragster гуру 15.04.20✎ 14:23 | 
        оповещение из модуля объекта не отправить     | |||
| 17
    
        SeiOkami 15.04.20✎ 14:32 | 
        (15), оповещение из модуля объекта?     | |||
| 18
    
        SeiOkami 15.04.20✎ 14:32 | 
        пока что придумал только один вариант - передавать в параметры записи адрес хранилища, в которое помещать нужные данные.
 А ПередЗаписью подключать обработчик ожидания, который сработает после записи и получит результат из хранилища... Не факт что сработает)) | |||
| 19
    
        dezss 15.04.20✎ 14:44 | 
        А почему обработка идет именно после, а не при или перед?
 Там что, данные сильно меняются? | |||
| 20
    
        fisher 15.04.20✎ 14:48 | 
        А ты, если видишь что это интерактивная запись - не отказывайся от нее :) Тогда сможешь словить ПриЗаписиНаСервере(), обработать все что надо и отказаться уже там.
 А адрес временного хранилища для своей структуры пихай в доп-свойства в ПередЗаписьюНаСервере() | |||
| 21
    
        fisher 15.04.20✎ 14:49 | 
        Хотя о чем это я? Не надо хранилища. Ты ж в ПриЗаписиНаСервере прямо доп-свойства и поймаешь.     | |||
| 22
    
        fisher 15.04.20✎ 14:51 | 
        (19) Бывает так, что проверка очень "тяжелая" и получение всех нужных данных требует почти дублирования всего алгоритма проведения.     | |||
| 23
    
        fisher 15.04.20✎ 14:53 | 
        Поэтому проверки бывает выгодно организовывать по оптимистическому алгоритму. Изначально считаем что все хорошо, но если все же что-то пошло не так - то тогда уже откатываемся и сигнализируем.     | |||
| 24
    
        Fragster гуру 15.04.20✎ 15:04 | 
        (18) жди, скоро может будет готов "сервер оповещений", там хоть что хоть куда послать можно     | |||
| 25
    
        dezss 15.04.20✎ 15:12 | 
        (22) Да эт понятно.
 А вот зачем показывать что-то кроме ошибки при неудачной записи, не понимаю. | |||
| 26
    
        SeiOkami 15.04.20✎ 15:20 | 
        (25), пользователям нужен более подробный отчет. Данные для него уже собраны на этапе записи документа. Чтобы не собирать данные повторно, я их передаю через ДополнительныеСвойства.     | |||
| 27
    
        dezss 15.04.20✎ 15:45 | 
        (26) Так при отказе и показывай их, как вариант.
 А так, да. Событий для показа чего-то нет. Обработчик вариант, конечно, но только если они форму раньше не закроют. | |||
| 28
    
        trad 15.04.20✎ 15:47 | 
        1. не делать отказ в ПриЗаписи()
 2. разбирать доп.параметры в данные формы в ПриЗаписиНаСервере() 3. делать отказ в ПриЗаписиНаСервере() если доп.параметры соответствующим образом заполнены | |||
| 29
    
        trad 15.04.20✎ 16:06 | 
        полная, правильная реализация, даже без учета ограничения (7), такая
 Процедура ПередЗаписьюНаСервере(...) ТекущийОбъект.ДополнительныеСвойства.Вставить("Отказ", Ложь); КонецПроцедуры Процедура ПриЗаписи(...) //тут необходимые проверки Если ПроверкиНеПройдены Тогда Если ДополнительныеСвойства.Свойство("Отказ") Тогда //заполнить другие ДополнительныеСвойства для передачи в форму //если из формы, то отказа будет там ДополнительныеСвойства.Отказ = Истина; Иначе //если не из формы, то отказ будет тут Отказ = Истина; КонецЕсли КонецЕсли КонецПроцедуры Процедура ПриЗаписиНаСервере(...) Отказ = ТекущийОбъект.ДополнительныеСвойства.Отказ; //перекладываем в форму другие ДополнительныеСвойства КонецПроцедуры | |||
| 30
    
        trad 15.04.20✎ 16:13 | 
        ну и раз это документ, то, при наличии проведения, нужно его проскочить
 Процедура ОбработкаПроведения() Если ДополнительныеСвойства.Свойство("Отказ") И ДополнительныеСвойства.Отказ Тогда Возврат; КонецЕсли //далее проведение КонецПроцедуры | |||
| 31
    
        SeiOkami 16.04.20✎ 10:04 | 
        (20), (28), Спасибо за решение!
 Проверил, всё гуд работает. | |||
| 32
    
        Ненавижу 1С гуру 16.04.20✎ 10:06 | 
        (28) это все хорошо конечно, но усложняет логику - теперь бизнес-данные хотя и косвенно зависят от представления
 то есть надо всегда помнить, про этот самый параметр | |||
| 33
    
        trad 16.04.20✎ 10:14 | 
        (32) "теперь бизнес-данные хотя и косвенно зависят от представления"
 это так, но ТС этого и надо | |||
| 34
    
        fisher 16.04.20✎ 10:20 | 
        (32) Критикуя - предлагай :)     | |||
| 35
    
        trad 16.04.20✎ 10:23 | 
        (32) "то есть надо всегда помнить, про этот самый параметр"
 А зачем помнить Да, в ПриЗаписиНаСервере нужно знать о наличии свойства заложенного в ПередЗаписьюНаСервере Но эти два события в контексте одной формы, а в рамках одного контекста всегда что-то одно находится в зависимости от другого. С другой стороны, контекст объекта не зависит от этого свойства. Если объект его не учтет, то объекту это не помешает. А если форма "забудет" ему его дать, то код написан, в этом смысле, безопасно. | |||
| 36
    
        Ненавижу 1С гуру 16.04.20✎ 10:39 | 
        (35) ПриЗаписи вообще убрать нельзя, только с условием по параметру
 ибо может быть проведение не из формы | |||
| 37
    
        trad 16.04.20✎ 10:54 | 
        (36) кто-то предлагает ПриЗаписи убрать?     | |||
| 38
    
        Ненавижу 1С гуру 16.04.20✎ 11:11 | 
        (38) >>1. не делать отказ в ПриЗаписи()     | |||
| 39
    
        trad 16.04.20✎ 11:45 | 
        (38) Не делать отказ - с целью добраться до ПриЗаписиНаСервере
 Да, "не делать отказ" - параметрическое поведение. Код приведен в (29) Запись/Проведение не из формы никак не пострадает Запись/Проведение никак не пострадает если форма забудет сформировать параметр | |||
| 40
    
        Ненавижу 1С гуру 16.04.20✎ 11:49 | 
        (39) согласен, норма вариант
 единственное в новых типовых стали бросать исключения, когда в проведении что-то пошло не так | |||
| 41
    
        Cyberhawk 16.04.20✎ 11:51 | 
        (30) Угу, а потом еще "проскочить" все подписки на событие проведения, которые не анализируют Отказ, а молча делают свое дело :)     | |||
| 42
    
        fisher 16.04.20✎ 11:53 | 
        (39) Если в очередной момент забудут о том, что модуле документа нужно не Отказ ставить при интерактивном проведении, а ДополнительныеСвойства.Отказ - то форма перестанет ловить событие и красиво формировать отчет об ошибках. Неудобненько. Особенно учитывая, что это стопудово будет плавающей проблемой. Но все равно лучше вариантов не проглядывается.
 (41) Ихнее молчаливое дело спокойно откатится в итоге. Тут проблемы нет. | |||
| 43
    
        trad 16.04.20✎ 11:54 | 
        (41) полезно было бы услышать альтернативные возможности     | |||
| 44
    
        trad 16.04.20✎ 11:57 | 
        (42) не подготовил свойство - не получил "красивость". Все эта зависимость остается контексте одной формы. Норм же     | |||
| 45
    
        Cyberhawk 16.04.20✎ 11:58 | 
        (42) "Тут проблемы нет" // Ну, на самом деле есть, когда из формы начнут по пессимистичному сценарию проводить много разных сеансов. Удлиняем транзакцию и сопутствующие блокировки, когда могли бы сразу отлуп до обработок проведения выдать.
 Случай редкий, конечно, т.к. ожидаемый сценарий оптимистичный все-таки, но все-таки такое интерфейсное ублажение - это лишняя трата мозготоплива - приходится помнить про этот нюанс. | |||
| 46
    
        trad 16.04.20✎ 12:00 | 
        (42) "Ихнее молчаливое дело" может зависеть от проведения которого не случилось, следовательно, что может пойти не так и привести к исключению     | |||
| 47
    
        Cyberhawk 16.04.20✎ 12:01 | 
        (46) Или наоборот - "молчаливое дело" может рассчитывать, что, мол, раз дошли до обработки проведения и там не отказ, то надо куда-нибудь с кем-нибудь этой инфой поделиться. А там на самом деле уже отказ, просто он пропущен (оттянут до возвращения выполнения кода в форму).     | |||
| 48
    
        Cyberhawk 16.04.20✎ 12:02 | 
        Т.е., повторюсь, решение не безболезненное и поэтому неуниверсальное :(     | |||
| 49
    
        fisher 16.04.20✎ 12:03 | 
        (46) Это так. Но у ТС вряд ли будет пропуск проведения, как ты предполагаешь. Если бы нужные проверки можно было бы сделать без проведения, то и весь этот сыр-бор не нужен был. Т.е. вероятность исключения все равно остается, но она хотя бы не невелика. Тут уже ничего не поделаешь.     | |||
| 50
    
        fisher 16.04.20✎ 12:03 | 
        "хотя бы невелика"     | |||
| 51
    
        fisher 16.04.20✎ 12:04 | 
        (48) Да. Но вполне приемлемо, ИМХО, в отсутствие альтернатив.     | |||
| 52
    
        trad 16.04.20✎ 12:04 | 
        (47) "то надо куда-нибудь с кем-нибудь этой инфой поделиться"
 Ну если эту "дележку инфой" делать в рамках транзакции, при этом эта "дележка" не откатываема, то - тоже не фонтан | |||
| 53
    
        fisher 16.04.20✎ 12:05 | 
        (47) А вот это вполне реальный вариант, при котором будет очень больно.     | |||
| 54
    
        fisher 16.04.20✎ 12:08 | 
        (52) Ну а как еще организовать распределенную транзакцию между разными системами без брокера (как чаще всего и делается в 1С)? В какой-то момент приходится полагаться на то, что раз до последнего момента исключения нет, то транзакция завершена успешно.     | |||
| 55
    
        trad 16.04.20✎ 12:09 | 
        (53) нельзя делится "грязными" данными из транзакции. Это даже без обсуждаемого бантика     | |||
| 56
    
        Cyberhawk 16.04.20✎ 12:09 | 
        (49) "Если бы нужные проверки можно было бы сделать без проведения, то и весь этот сыр-бор не нужен был" // Погоди, так предлагаемый сыр-бор в (28) вроде как раз и предполагает, что проверки только до обработки проведения сделаны.
 Т.е. он не учитывает кейс, когда надо при отлупе в обработке проведения протащить это в форму. | |||
| 57
    
        fisher 16.04.20✎ 12:10 | 
        (56) Сама идея это учитывает как раз. trad это как опцию протащил.     | |||
| 58
    
        Cyberhawk 16.04.20✎ 12:11 | 
        (55) Пример не единственный. Просто факт остается фактом: мы скрываем от последующего кода флаг Отказа, и про это надо потом всегда помнить     | |||
| 59
    
        trad 16.04.20✎ 12:12 | 
        (54) слишком глубоко. Думать нужно в конкретной обстановке     | |||
| 60
    
        Cyberhawk 16.04.20✎ 12:12 | 
        (57) Ну т.е. если без обработки проведения никак, то нужно не в ПриЗаписи, а в ОбработкеПроведения городить эти доп. свойства и пропуск взвода Отказа, так?     | |||
| 61
    
        trad 16.04.20✎ 12:13 | 
        (60) " не в ПриЗаписи, а в ОбработкеПроведения "
 Это зависит от характера проверок у ТС. Этого нам не известно | |||
| 62
    
        fisher 16.04.20✎ 12:14 | 
        (60) Да. Придется заменять все Отказ = Истина на какой-нить ОтказатьсяОтЗаписи().     | |||
| 63
    
        Cyberhawk 16.04.20✎ 12:15 | 
        +(56) И ведь еще веселее будет, когда ты Отказ скрыл в ПриЗаписи, а в ОбработкахПроведения его типовой код все-таки взвел.
 Все, в форму ничего не придет в таком случае же, т.е. схема разрушилась? | |||
| 64
    
        fisher 16.04.20✎ 12:15 | 
        Но ТС и так уже что-то подобное делает, так как во всех точках отказа собирает инфу для последующего отображения.     | |||
| 65
    
        Cyberhawk 16.04.20✎ 12:15 | 
        (62) Вот и я про то же в (63) :)     | |||
| 66
    
        trad 16.04.20✎ 12:18 | 
        (63) ну да, ОбработкахПроведения нужно подгонять под правила принятые в данном контексте.
 Я выше писал, что функциональности в одном контексте должны же играть по общим правилам | |||
| 67
    
        fisher 16.04.20✎ 12:18 | 
        (63) Да. Любой "нелегальный" отказ приведет к необработке события. Но это можно захачить в последней подписке :) Типа если Отказ, а проведение интерактивное, то "отказываемся от отказа" и пишем инфу про необработанную ошибку, чтобы вовремя исправить.     | |||
| 68
    
        Cyberhawk 16.04.20✎ 12:19 | 
        (67) "Но это можно захачить в последней подписке :)" // А потом добавят еще одну подписку... или поменяют последовательность их выполнения     | |||
| 69
    
        Cyberhawk 16.04.20✎ 12:20 | 
        (66) Ну вот и возвращаемся к (32) :)     | |||
| 70
    
        trad 16.04.20✎ 12:21 | 
        (68) подписку обозвать - СамаяСамаяНаВсеВременаПоследняяПодписка     | |||
| 71
    
        fisher 16.04.20✎ 12:21 | 
        (69) Угу. А потом к (34)     | |||
| 72
    
        trad 16.04.20✎ 12:23 | 
        (69) пожалуй я соскочу     | |||
| 73
    
        trad 16.04.20✎ 12:25 | 
        на последок вякну. Подписки эти сами являются источниками (32)     | |||
| 74
    
        fisher 16.04.20✎ 12:28 | 
        (73) Так можно договориться до того, что весь код должен быть в линейной портянке а все остальное - от лукавого.     | |||
| 75
    
        Ненавижу 1С гуру 16.04.20✎ 13:15 | 
        я сейчас одну крамольную вещь покажу, только ногами не бейте:
 &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) //ФлагЗаписи - реквизит формы, тип булево Если Не ФлагЗаписи Тогда ФлагЗаписи = Истина; Отказ = Истина; ВсеХорошо = Истина; Попытка Записать(ПараметрыЗаписи); Исключение Заголовок = "Что-то пошло не так!"; // вот здесь обрабатываем! ВызватьИсключение; КонецПопытки; Иначе ФлагЗаписи = Ложь; КонецЕсли; КонецПроцедуры | |||
| 76
    
        fisher 16.04.20✎ 14:17 | 
        (75) Идея понятна. Если не возникнет проблем с пробрасыванием ошибок через временное хранилище - то отличный выход.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |