#0
by Тим
Мое почтение! По причине того, что установка отказ=истина в обработчике подписки на событие передзаписью не давала ожидаемого эффекта - отказа действия, стал...думать, вот :) Стал пробовать. И обнаружил для себя интересный эффект - оказывается, состояние отказа не проверяется платформой после вызова каждого обработчика - только после вызова всей очереди! О, как... Отсюда неприятненький эффект - в одном обработчике Отказ устанавливается в Истина, в последующем - в Ложь. И тогда состояние Отказа по логике первого обработчика уже не имеет никакого значения! Если последующий разрешил - будет исполнено. Эффект при незнании неприятный, вычислять по всем обработчикам корректность логики - та ещё радость. Собственно, из варинатов обхода приходит на ум либо использование исключения при необходимости гарантированного отказа, либо внутренняя клятва никогда, ни за что не использовать в обработчике события присвоение Отказу значения ложь... Хотя, имхо, было бы вернее всё-таки реагировать на состояния отказов по каждому огбработчику. ЗЫ: я в 1С 8 - чечако, для меня это так забавно и странно... а описания эффекта в доке не нахожу. Да и в сети - тоже. Есть ли официальная позиция по этому вопросу?
#6
by Тим
- ну, тут вопрос не только рук, но и знания правил игры. Где-то в официальной документации, руках раба и прочее такое поведение декларируется?
#8
by Bober
например: идет перед записью в модуле, там идет отказ по внутренней логике, но в подписке это выправляется (хак, костыль). Т.е. можно модернизировать работу типовой без внесения изменений в типовых функции.
#10
by Тим
- согласен, тот факт, что эта модель не есть зло, а есть особенность - признаю полностью.
#11
by Reset
+ Так и должно быть. Представьте почтальона, который, не смогши запихать письмо в один ящик, забивает (!) на разнесение остальные письма.
#13
by Bober
10 эта модель полностью отработает по всех подписка перед записью и если в конце будет отказ, то к при записи не перейдет. Более того, платформа не гарантирует порядок выполнения подписок.
#15
by Sammo
Вообще-то ПередЗаписью(<Отказ>... Т.е. если вы пришедшему значению Ложь присвоили значение Истина, то ССЗБ
#16
by Тим
- именно отсутствие предопределенной очереди исполнения, и приводит меня к моему имхо - реакция после каждого обработчика. Хотя где-то заявляют, что негласно очередь соответствует хронологии создания, могу уже из своей практики подвтердить - это не так. Созданный мною обработчик был последним, однако отказа не происходит, хотя код установки его значения исполняется.
#18
by Тим
<Отказ> Тип: Булево. Признак отказа от выполнения действия. Факт в том, что установка отказа в отдельном обработчике не означает, что это действие не будет выполнено.
#19
by Reset
Означает. Если ты зачем-то в других обработчиках его меняешь в "ложь", то проблема в тебе, а не в платформе.
#21
by Тим
- давай без экспрессии, дружище. Не гарантирует - о чем тут спорить? Мой предшественник, видимо, так поступал - а я пожинаю.
#23
by Reset
Окей, в твоем предшественнике. Но объяву дал ты, поэтому тебе и пожинать. Пойми ты, твоё недовольство совершенно аналогично следующему:
#25
by Тим
- не-не, совсем не аналогично. В условиях, когда очередь исполнения отдельных обработчиков не определена, такой примитивной линейности, как в примере, мы не имеем. Речь об общем случае. Недовольство платформой я вроде бы не заявлял.
#28
by Serg_1960
Короче, пиши так и не парься :) Процедура МойОчереднойГениальныйОбработчик(Отказ) КонецЕсли: ...
#29
by PVV65
Если у тебя несколько обработчиков, надо писать так (и не парь мозг) - Отказ = Отказ ИЛИ Истина; или Отказ = Отказ ИЛИ Ложь;
#31
by Тим
- ненадежно, если не исполняется стандартом кодирования. НЕт никаких гарантий, что после моего отказа не будет вызван обработчик, который не следует такой логике присвоения значения, а тупо определяет Отказ = Ложь. Подъём исключения надежнее, я думаю.
#33
by Steel_Wheel
Еще каждый слушатель подписки надо предварять Если Отказ Тогда Возврат КонецЕсли; или Если Не Отказ Тогда
#35
by Ненавижу 1С
Отказ ИЛИ Ложь всегда даст значение Отказ Отказ И Ложь всегда даст значение Ложь Отказ ИЛИ Истина всегда даст значение Истина Отказ И Истина всегда даст значение Отказ
#37
by PVV65
Обратимся к книге П.С.Белоусова и А.В.Островерха "1С:Предприятие: от 8.0 к 8.1" "При наступлении события, для которого определена подписка, выполняется такая последовательность действий: - обрабатывается событие в самом объекте ...; - если в процессе выполнения обработчика параметр Отказ установлен в значение Истина или вызвано исключение, последовательность действий прерывается; - в произвольном порядке вызываются внешние обработчики, назначенные для данного события; - ....; - если в процессе выполнения назначенного обработчика параметр Отказ установлен в значение Истина или вызвано исключение, последовательность действий прерывается;" Т.е. Подписки не будут выполнятся, если в основном обработчике Отказ = Истина. Если Отказ = Ложь, будут выполнены все обработчики, назначенные в подписках. В каждом из них надо учитывать состояние Отказ. Если это не понятно - кривые программы.
#38
by maxx079
в уже ответили больше ничего и не требуется у себя делал также, когда на одно событие (перед записью документа) пришлось повесить несколько разных подписок обходит твою ошибку, плюс позволяет пропустить уже ненужные проверки
#40
by PVV65
Отказ = Отказ ИЛИ Результат; КонецПроцедуры Отказ = Отказ ИЛИ Результат; КонецПроцедуры КонецПроцедуры
#42
by Steel_Wheel
Это нормально, т.к. у нас ошибка, которую мы не можем обработать, и надо прервать выполнение... а вот Отказ = Не Отказ -- это уже бомба (видел такое на практике, прог исходил из мысли, что Отказ -- первоналаьно всегда Истина)
#43
by maxx079
только что проверил - сделал три подписки на одно событие (перед записью документа), во всех трех Отказ = Истина 1с зашла во все три процедуры, т.е. последовательность не прерывается! проверял на 8.2.14.537, сервер
#44
by mikecool
как раз Отказ = Ложь указывает на отсутствие ошибки и без проверки на Отказ использовать - наживать кучу гемора
#47
by PVV65
Я и написал - "будут выполнены все обработчики, назначенные в подписках. В каждом из них надо учитывать состояние Отказ."
#50
by PVV65
+ Только при установке Отказ в Истина в основном обработчике происходит прерывание (не выполняются подписки).
#53
by Тим
(51, 52) - так это и было указано в первом же сообщении: значение отказа проверяется только после вызова всей очереди обработчиков. Никакие установки значения в обработчике, никакие возвраты не влияют автоматически на отработку всех подписчиков. Только исключение.
#54
by shuhard
классный срач тебя сто раз объяснили, что в типовых нельзя ставить отказ=истина, а ты сто раз ответил что платформа херово документирована
#59
by vde69
+100 Всегда следует вставлять этот код если в параметрах есть "Отказ", даже в обработчики формы :)
#61
by Тим
(57, 58) - почтенный, неуместная ирония. Логика такова, что действие должно быть отменено - и оно отменено, поскольку проверка - критическая; вполне транзакционное поведение.
#64
by hhhh
в общем выражение "Отказ - Ложь;" должно быль немедленно выброшено, его применять не надо. Такая вот логика.
#66
by vde69
что-бы не пытатся выполнить глупые действия, параметр "отказ" не во всех обработчиках формы имеет значение "истина".
#69
by Тим
- не надо, практика показывает, что установка отказа в подписчике не гарантирует отмены действия. затем, что как в 28 - не меняет поведение. Банальный практический пример это подтвердит. Подписка на событие ПриЗаписи по регистру сведений. Проводим документ, выполняющий движения по РС. Очередь вызовов: ПодпискаНаСобытие_1_ПередЗаписью ПодпискаНаСобытие_2_ПередЗаписью результат - действие не отменено. Если вызвать исключение в ПодпискаНаСобытие1ПередЗаписью - отменено.
#70
by shuhard
классный срач тебя сто раз объяснили, что в типовых нельзя ставить отказ=истина, а ты сто раз ответил что платформа херово документирована
#71
by PVV65
А подскажи - что это за событие такое "ПриОкончанииРедактированияТекста" - не припомню.
#76
by Тим
- уважаемый shuhard, я читал Твоё сообщение, просто не понимаю, что можно на него ответить. Я нигде не написал ничего о качестве документации, я лишь заметил, что не нахожу официального описания такого поведения, и спросил - где такое описание есть? И это было лишь однажды. (73, 74) - коллеги, не спорю. что другое. Я вам ответил - нужно ГАРАНТИРОВАННО отменить в обработчике действие. Ваши комментарии отностяся к каким-то иным сценариям; я привел код, который поясняет ситуацию. Но вы не отвечаете на фактуру, вы упорно доказываете, что я - м.дак.
#78
by Тим
- сможете пояснить - в каком конце? Есть способ управлять очередностью выполнения подписчиков?
#79
by Reset
По моему, ты сам пытаешься это доказать. Какое поведение? Что после присваивания переменной в ней оказывается значение, которое присвоили? Это не описано? После Отказ=Ложь в переменной оказывается "ложь", ЭТО должно быть (так перетак) описано?
#80
by hhhh
ну как они записаны в конфигурации - на 99% в таком порядке и выполняются. Остальной 1% проверите экспериментально.
#82
by Тим
я сам, похоже, на практике нарвался на негарантированный порядок - мой подписчик явно последний, однако он установкой отказа не отменяет действия. Кроме того, вроде бы, как упоминали в сети, сами разработчики официально предлагают считать порядок неопределенным.
#83
by Serg_1960
При написании алгоритмов обработчиков нужно исходить из того, что они могут быть вызваны и порядок их вызова - неопределен. Поэтому, если надо не потерять присвоение "Отказ = Истина;", то писать надо так (ваш пример сучетом п.28):
#84
by Тим
- Serg_1960, я прекрасно понимаю это внушение, я в 31 не зря указал: "ненадежно, если не исполняется стандартом кодирования". Это моя ситуация - не исполняется. Где-то кем-то написан обработчик, который не следует этому "хорошему" стандарту кода. Не мной. Конечно можно провести ревизию кода, найти преступную небрежность и убрать крамолу - и обязательно сделаем, и уже делаем. Но в условиях дефицита времени, полагаю, вызов исключение даёт мне совершенно удовлетворительный требуемый результат.
#85
by Serg_1960
Ок, я вас услышал. Но - "не понял". В "условиях дефицита времени" не стоит писать индусский код - постоянный цейтнот вам гарантирован.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- ЗУП - как сделать доступ пользователя только к определенной организации?
- v8: Получить остатки по складам в Ут 10
- Нумерация счетов
- Как вызвать форму из другой формы ?
- v7: предустановленный реквизит при открытии диалога
- Проводки в реализации 1с 8.2 УПП 1.3 (при переходе права собственности)
- Почему подсистема не отображается в интерфейсе ?
- БП 2.0 Проф. Отказ от подразделений в ПС, почему?
- 8.2 УФ. Обработчик ожидания не дает ввести значение в текстовое поле
- ЗУП Вытесняющие начисления и заполнение табеля на примере отпуска по ух за реб
- Как сделать из регистра накопления регистр бухгалтерии
- Сканеры ШК и RDP
- Добавить колонку в ТЗ
- v7: Пример использования ROM-Chart
- Как обратиться из одной внешней обработке к другой, если они "Внешние отчеты""?
- Печатаю на принтер этикеток рисунки выходят перевернутые
- ТабДок.ИмяПринтера = ИмяПринтера. Не видит принтер.
- 1С:Конвертация данных 8.2 2.1.5.1 Обработчик события "При загрузке"
- Хранение матрицы в 1С
- Калькулятор в управляемых формах