Логика обработки отказов - не ожидал...это описано в документации? #584016


#0 by Тим
Мое почтение! По причине того, что установка отказ=истина в обработчике подписки на событие передзаписью  не давала  ожидаемого эффекта - отказа действия, стал...думать, вот :) Стал пробовать. И обнаружил для себя  интересный эффект - оказывается, состояние отказа не проверяется платформой после вызова каждого обработчика - только после вызова всей очереди! О, как... Отсюда неприятненький эффект - в одном обработчике Отказ устанавливается в Истина, в последующем - в Ложь. И тогда состояние Отказа по логике первого обработчика уже не имеет никакого значения! Если последующий разрешил - будет исполнено. Эффект при незнании неприятный, вычислять по всем обработчикам корректность логики - та ещё радость. Собственно, из варинатов обхода приходит на ум либо использование исключения при необходимости гарантированного отказа, либо внутренняя клятва никогда, ни за что не использовать в обработчике события присвоение Отказу значения ложь... Хотя, имхо, было бы вернее всё-таки реагировать на состояния отказов по каждому огбработчику. ЗЫ: я в 1С 8 - чечако, для меня это так забавно и странно... а описания эффекта в доке не нахожу. Да и в сети - тоже. Есть ли официальная позиция по этому вопросу?
#1 by Галахад
Может руки кривые?
#2 by rutony
Я сначало подумал стихи какие то=))
#3 by Bober
не использовать в обработчике события присвоение Отказу значения ложь
#4 by Bober
это не эффект, так и должно быть
#5 by Ненавижу 1С
багофича?
#6 by Тим
- ну, тут вопрос не только рук, но и знания правил игры. Где-то в официальной документации, руках раба и прочее такое поведение декларируется?
#7 by Тим
- фичебага звучит лояльнее к 1С
#8 by Bober
например: идет перед записью в модуле, там идет отказ по внутренней логике, но в подписке это выправляется (хак, костыль). Т.е. можно модернизировать работу типовой без внесения изменений в типовых функции.
#9 by Reset
Причем тут баг?
#10 by Тим
- согласен, тот факт, что эта модель не есть зло, а есть особенность - признаю полностью.
#11 by Reset
+ Так и должно быть. Представьте почтальона, который, не смогши запихать письмо в один ящик, забивает (!) на разнесение остальные письма.
#12 by Тим
- я от наименования багом отказываюсь! :) И имхо тоже защищать не буду.
#13 by Bober
10 эта модель полностью отработает по всех подписка перед записью и если в конце будет отказ, то к при записи не перейдет. Более того, платформа не гарантирует порядок выполнения подписок.
#14 by Bober
короче. в умелых руках фича, в кривых все что угодно.
#15 by Sammo
Вообще-то ПередЗаписью(<Отказ>... Т.е. если вы пришедшему значению Ложь присвоили значение Истина, то ССЗБ
#16 by Тим
- именно отсутствие предопределенной очереди исполнения, и приводит меня к моему имхо - реакция после каждого обработчика. Хотя где-то заявляют, что негласно очередь соответствует хронологии создания, могу уже из своей практики подвтердить - это не так. Созданный мною обработчик был последним, однако отказа не происходит, хотя код установки его значения исполняется.
#17 by Reset
Какой реакции? Ты понимаешь смысл параметра "Отказ"?
#18 by Тим
<Отказ> Тип: Булево. Признак отказа от выполнения действия. Факт в том, что установка отказа в отдельном обработчике не означает, что это действие не будет выполнено.
#19 by Reset
Означает. Если ты зачем-то в других обработчиках его меняешь в "ложь", то проблема в тебе, а не в платформе.
#20 by Buster007
+1
#21 by Тим
- давай без экспрессии, дружище. Не гарантирует - о чем тут спорить? Мой предшественник, видимо, так поступал - а я пожинаю.
#22 by Steel_Wheel
исключение выкинь :)
#23 by Reset
Окей, в твоем предшественнике. Но объяву дал ты, поэтому тебе и пожинать. Пойми ты, твоё недовольство совершенно аналогично следующему:
#24 by Тим
- пока так и сделал.
#25 by Тим
- не-не, совсем не аналогично. В условиях, когда очередь исполнения отдельных обработчиков не определена, такой примитивной линейности, как в примере, мы не имеем. Речь об общем случае. Недовольство платформой я вроде бы не заявлял.
#26 by AlexNew
А что обсуждаем? Руки оторвать.
#27 by acsent
Сначала ты: -Нет не пишем. А потом: -Ой, извини попутал, пишем
#28 by Serg_1960
Короче, пиши так и не парься :) Процедура МойОчереднойГениальныйОбработчик(Отказ)   КонецЕсли: ...
#29 by PVV65
Если у тебя несколько обработчиков, надо писать так (и не парь мозг) - Отказ = Отказ ИЛИ Истина; или Отказ = Отказ ИЛИ Ложь;
#30 by Reset
Супер вообще...
#31 by Тим
- ненадежно, если не исполняется стандартом кодирования. НЕт никаких гарантий, что после моего отказа не будет вызван обработчик, который не следует такой логике присвоения значения, а тупо определяет Отказ = Ложь. Подъём исключения надежнее, я думаю.
#32 by AlexNew
Улыбнуло:) Иногда лучше молчать, чем говорить (с)
#33 by Steel_Wheel
Еще каждый слушатель подписки надо предварять Если Отказ Тогда Возврат КонецЕсли; или Если Не Отказ Тогда
#34 by Steel_Wheel
бгг... может "И", а не "ИЛИ"
#35 by Ненавижу 1С
Отказ ИЛИ Ложь всегда даст значение Отказ Отказ И Ложь всегда даст значение Ложь Отказ ИЛИ Истина всегда даст значение Истина Отказ И Истина всегда даст значение Отказ
#36 by kuromanlich
... или добавлять после изменения значения отказа "возврат" ...
#37 by PVV65
Обратимся к книге П.С.Белоусова и А.В.Островерха "1С:Предприятие: от 8.0 к 8.1" "При наступлении события, для которого определена подписка, выполняется такая последовательность действий:   - обрабатывается событие в самом объекте ...;   - если в процессе выполнения обработчика параметр Отказ установлен в значение Истина или вызвано исключение, последовательность действий прерывается;   - в произвольном порядке вызываются внешние обработчики, назначенные для данного события;   - ....;   - если в процессе выполнения назначенного обработчика параметр Отказ установлен в значение Истина или вызвано исключение, последовательность действий прерывается;" Т.е. Подписки не будут выполнятся, если в основном обработчике Отказ = Истина. Если Отказ = Ложь, будут выполнены все обработчики, назначенные в подписках. В каждом из них надо учитывать состояние Отказ. Если это не понятно - кривые программы.
#38 by maxx079
в уже ответили больше ничего и не требуется у себя делал также, когда на одно событие (перед записью документа) пришлось повесить несколько разных подписок обходит твою ошибку, плюс позволяет пропустить уже ненужные проверки
#39 by mikecool
а писать Отказ = Ложь без проверки на отказ - это нормально?
#40 by PVV65
Отказ = Отказ ИЛИ Результат; КонецПроцедуры    Отказ = Отказ ИЛИ Результат; КонецПроцедуры КонецПроцедуры
#41 by PVV65
Конечно. Но если требуется выполнить все проверки, тогда .
#42 by Steel_Wheel
Это нормально, т.к. у нас ошибка, которую мы не можем обработать, и надо прервать выполнение... а вот Отказ = Не Отказ -- это уже бомба (видел такое на практике, прог исходил из мысли, что Отказ -- первоналаьно всегда Истина)
#43 by maxx079
только что проверил - сделал три подписки на одно событие (перед записью документа), во всех трех Отказ = Истина 1с зашла во все три процедуры, т.е. последовательность не прерывается! проверял на 8.2.14.537, сервер
#44 by mikecool
как раз Отказ = Ложь указывает на отсутствие ошибки и без проверки на Отказ использовать - наживать кучу гемора
#45 by mikecool
а почему последовательность должна прерваться?
#46 by mikecool
+45 может есть действия , которые надо выполнить независимо от состояния отказа?
#47 by PVV65
Я и написал - "будут выполнены все обработчики, назначенные в подписках. В каждом из них надо учитывать состояние Отказ."
#48 by Steel_Wheel
А точно.... попутал немного с первой частью своего поста
#49 by maxx079
да, возможно не так понял текст :)
#50 by PVV65
+ Только при установке Отказ в Истина в основном обработчике происходит прерывание (не выполняются подписки).
#51 by mikecool
установка Отказа не прерывает ничего
#52 by PVV65
Прерывает последовательность вызова обработчиков.
#53 by Тим
(51, 52) - так это и было указано в первом же сообщении: значение отказа проверяется только после вызова всей очереди обработчиков. Никакие установки значения в обработчике, никакие возвраты не влияют автоматически на отработку всех подписчиков. Только исключение.
#54 by shuhard
классный срач тебя сто раз объяснили, что в типовых нельзя ставить отказ=истина, а ты сто раз ответил что платформа херово документирована
#55 by PVV65
При чем тут "исключение"?
#56 by Тим
вызов исключения в подписчике гарантированно отменяет действие.
#57 by Reset
Топором по серверу еще гарантированнее...
#58 by Reset
Все действия сразу, даже прошедшие
#59 by vde69
+100 Всегда следует вставлять этот код если в параметрах есть "Отказ", даже в обработчики формы :)
#60 by vde69
ты еще не пробовал вкус отката в бизнесс процессах, там вообще жесть :)
#61 by Тим
(57, 58) - почтенный, неуместная ирония. Логика такова, что действие должно быть отменено - и оно отменено, поскольку проверка - критическая; вполне транзакционное поведение.
#62 by acsent
Зачем в форме то?
#63 by Reset
Для отмены действия параметр "Отказ" придумали. Сказ про белого бычка, на самом деле.
#64 by hhhh
в общем выражение "Отказ - Ложь;" должно быль немедленно выброшено, его применять не надо. Такая вот логика.
#65 by PVV65
Если хочешь прервать выполнение обработчиков, пиши как . Зачем вызывать исключение?
#66 by vde69
что-бы не пытатся выполнить глупые действия, параметр "отказ" не во всех обработчиках формы имеет значение "истина".
#67 by Souvenire
А в каких случаях писать Отказ = Ложь имеет смысл?
#68 by Reset
(истерично) Ни в каких
#69 by Тим
- не надо, практика показывает, что установка отказа в подписчике не гарантирует отмены действия. затем, что как в 28 - не меняет поведение. Банальный практический пример это подтвердит. Подписка на событие ПриЗаписи по регистру сведений. Проводим документ, выполняющий движения по РС. Очередь вызовов: ПодпискаНаСобытие_1_ПередЗаписью ПодпискаНаСобытие_2_ПередЗаписью результат - действие не отменено. Если вызвать исключение в ПодпискаНаСобытие1ПередЗаписью - отменено.
#70 by shuhard
классный срач тебя сто раз объяснили, что в типовых нельзя ставить отказ=истина, а ты сто раз ответил что платформа херово документирована
#71 by PVV65
А подскажи - что это за событие такое "ПриОкончанииРедактированияТекста" - не припомню.
#72 by Reset
У тебя опечатка :) "true"->"false"
#73 by Reset
Ты нас разводишь чтоли?
#74 by PVV65
Жесть. Ты хоть не позорься. В написано другое.
#75 by shuhard
нет опечатки есть две беспредметные стороны спора
#76 by Тим
- уважаемый shuhard, я читал Твоё сообщение, просто не понимаю, что можно на него ответить. Я нигде не написал ничего о качестве документации, я лишь заметил, что не нахожу официального описания такого поведения, и спросил - где такое описание есть? И это было лишь однажды. (73, 74) - коллеги, не спорю. что другое. Я вам ответил - нужно ГАРАНТИРОВАННО отменить в обработчике действие. Ваши комментарии отностяся к каким-то иным сценариям; я привел код, который поясняет ситуацию. Но вы не отвечаете на фактуру, вы упорно доказываете, что я - м.дак.
#77 by hhhh
ну просто выполняйте вашу подписку в самом конце, чего вы паритесь?
#78 by Тим
- сможете пояснить - в каком конце? Есть способ управлять очередностью выполнения подписчиков?
#79 by Reset
По моему, ты сам пытаешься это доказать. Какое поведение? Что после присваивания переменной в ней оказывается значение, которое присвоили? Это не описано? После Отказ=Ложь в переменной оказывается "ложь", ЭТО должно быть (так перетак) описано?
#80 by hhhh
ну как они записаны в конфигурации - на 99% в таком порядке и выполняются. Остальной 1% проверите экспериментально.
#81 by Reset
Ладно, правильные ответы уже были даны в ,,,. Месите воду дальше ;)
#82 by Тим
я сам, похоже, на практике нарвался на негарантированный порядок - мой подписчик явно последний, однако он установкой отказа не отменяет действия. Кроме того, вроде бы, как упоминали в сети, сами разработчики официально предлагают считать порядок неопределенным.
#83 by Serg_1960
При написании алгоритмов обработчиков нужно исходить из того, что они могут быть вызваны и порядок их вызова - неопределен. Поэтому, если надо  не потерять присвоение "Отказ = Истина;", то писать надо так (ваш пример сучетом п.28):
#84 by Тим
- Serg_1960, я прекрасно понимаю это внушение, я в 31 не зря указал: "ненадежно, если не исполняется стандартом кодирования". Это моя ситуация - не исполняется. Где-то кем-то написан обработчик, который не следует этому "хорошему" стандарту кода. Не мной. Конечно можно провести ревизию кода, найти преступную небрежность и убрать крамолу - и обязательно сделаем, и уже делаем. Но в условиях дефицита времени, полагаю, вызов исключение даёт мне совершенно удовлетворительный требуемый результат.
#85 by Serg_1960
Ок, я вас услышал. Но - "не понял". В "условиях дефицита времени" не стоит писать индусский код - постоянный цейтнот вам гарантирован.
#86 by Тим
Благодарен всем за участие, знания и конструктивную полемику :)
#87 by acsent
Так пользуй кто не дает-то? 1С в УТ 11 вовсю использует исключения
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С