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