Имя: Пароль:
1C
1С v8
Логика обработки отказов - не ожидал...это описано в документации?
,
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 вовсю использует исключения