Переопределение обработчика события формы

1. triviumfan 98 04.05.23 19:27 Сейчас в теме
Доброго дня.

Что-то меня сконтузил вопрос из шапки.
Имеются 2 формы документа. Нужно при измении поля таблицы выполнить некий код, но в одном документе типовой обработчик имеется, а в другом нет.
Окей, в 1м случае дописываем прямо в типовом, а 2й вариант программно через УстановитьДействие(). Но как оказалось в последствии, то в конструкторе формы его не было, а по факту он переопределялся в общем модуле. Таким образом я изменил логику поля при изменении и удалил типовую.
Как правильно переопределять в таких сложных случаях и не наткнуться на такую ошибку?

Да, есть ПолучитьДействие(), но что оно мне даст? Если обработчик имеется, то? Теоретически, моя доработка позволяет сначала выполнить типовой, а затем мой, но как правильно переопределить я так и не пойму, ведь, похоже, что имя исходного обработчика нужно где-то хранить, а потом уже вызывать. Надеюсь, проблему описал корректно.

ЗЫ: доработка в основной конфе, расширение не предлагать :)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 04.05.23 19:40 Сейчас в теме
(1) Доработка ведется в расширении? Можно заимствовать событие элемента формы.
Можно, конечно, сохранить имя типового обработчика, полученного через ПолучитьДействие, в программно созданном реквизите формы, потом вызывать его через Выполнить в собственном обработчике, но это плохая идея.
3. triviumfan 98 04.05.23 20:16 Сейчас в теме
(2) забыл указать, что доработка в основной конфе.
В расширении можно просто явно указать вызов после и всё будет работать как нужно :)
4. SlavaKron 04.05.23 20:48 Сейчас в теме
(3)
всё будет работать как нужно
Так в чем проблема? Что мешает создать расширение?
А, увидел ЗЫ. Понятно, а форму можно изменять?
6. triviumfan 98 04.05.23 21:48 Сейчас в теме
(4) можно, просто обычно это делается программно, но вот с учетом обработчиков событий мне не нравится эта идея.
5. Sashares 33 04.05.23 21:12 Сейчас в теме
(1)Мне кажется, вы усложняете проблему.
Можно проверить, выполняется ли что-то в событии, которое нужно изменить.
Включить замер производительности, выполнить действие на форме, выключить замер производительности. Посмотреть что в замере.
Если ничего в замере нет, значит, никаких обработчиков событий нет.

Сейчас вы нашли нужный обработчик, в него и допишите ваш код.
7. triviumfan 98 04.05.23 21:50 Сейчас в теме
(5) Сейчас я случайно нашёл его, а если бы не нашёл? Тогда я потерял бы логику вендора при изменении поля. Кто ж знал, что он программно вешает обработчики.
8. Sashares 33 04.05.23 22:41 Сейчас в теме
(7)
а если бы не нашёл?

Вам бы сказали пользователи, что что-то сломалось после доработок, и причина проблемы со временем бы нашлась.
Такое бывает, возникают ошибки при доработках. Даже у вендора есть ошибки.

Тут поможет только тестирование.
9. triviumfan 98 04.05.23 23:49 Сейчас в теме
(8)
Вам бы сказали пользователи, что что-то сломалось после доработок

Не сказали бы, ошибок в 99% случаев не будет и типовая логика при изменении просто игнорируется.

Так как всё-таки действовать в этой ситуации?)
МодификацияКонфигурацииПереопределяемый.ПриСозданииФормыНаСервере(): варианты:
а) Игнорировать программную установку типового обработчика и жестко поставить свою
Элемент.УстановитьДействие("ПриИзменении", "МояПроцедура");

пускай пользуется конструктором формы, а такие трюки оставит мне! :D
б) Проверить, если действие уже назначено, и отказаться/или наоборот переопределить
Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("ПриИзменении")) Тогда
     Элемент.УстановитьДействие("ПриИзменении", "МояПроцедура");
КонецЕсли;

в) Ну, раз я нашёл подключаемый обработчик, то в него уже засунуть мою процедуру? А вдруг вендор имеет ветку условий, от которых зависит имя подключаемого обработчика и их там N штук?:)
Процедура ПодключаемыйN_ПолеПриИзменении(Элемент)
     //...
     МояПроцедура(Элемент);
КонецПроцедуры
10. Sashares 33 05.05.23 00:49 Сейчас в теме
(9)
Не сказали бы, ошибок в 99% случаев не будет и типовая логика при изменении просто игнорируется.


В обработчике события что-то делается. Может заполняются другие поля, или что-то еще. Если они перестанут заполняться, это и будет ошибкой. Если вы этого не заметите при тестировании, это заметят пользователи.

А вдруг вендор имеет ветку условий, от которых зависит имя подключаемого обработчика и их там N штук?:)


Не понял, что значит "вдруг"? У вас конфигуратор перед глазами, открываете и смотрите, как подключаются обработчики событий. Процедуры - обработчики событий должны быть размещены только в модуле этой формы.

Обычно не бывает N обработчиков для одного элемента, скорее наоборот, обработчик один, и назначается он N элементам.
11. triviumfan 98 05.05.23 09:27 Сейчас в теме
(10)
В обработчике события что-то делается. Может заполняются другие поля, или что-то еще. Если они перестанут заполняться, это и будет ошибкой. Если вы этого не заметите при тестировании, это заметят пользователи.

Если при изменении контрагента не заполнился основной договор, то никто этого не заметит, просто заполнят его руками.
(10)
Процедуры - обработчики событий должны быть размещены только в модуле этой формы.

В моей форме они назначаются в общем модуле.
12. Sashares 33 05.05.23 09:36 Сейчас в теме
(11)Назначаться они могут хоть где, а сами процедуры размещаться - в форме.
13. triviumfan 98 05.05.23 09:44 Сейчас в теме
(12)
Назначаться они могут хоть где, а сами процедуры размещаться - в форме.

Ну, это очевидно, просто я же не могу сопоставить имя процедуры и имя поля, у меня это "Подключаемый_Блаблабла()".
Я заметил его чисто случайно, когда выполнил "ПолучитьДействие()" и увидел, что оно уже назначено.
14. wertep 31 05.05.23 11:07 Сейчас в теме
(13) Задача не имеет универсального решения в этой постановке.
Проверить что они есть просто. По методикам разработки 1С все подключаемые функции/процедуры должны иметь перфикс "Подключаемый_", открыть модуль и проверить их наличие.
А дальше только проверять логику работы во всех вариантах. Потому как вы заметили подключаться программно в зависимости от условий могут разные обработчики. Но они могут и меняться после создания формы в любое время. поэтому только анализ и уже после этого изменение нужного подключаемого.
15. triviumfan 98 05.05.23 18:21 Сейчас в теме
(14) И как бы вы в данной ситуации переопределяли обработчик?)
16. user1826630 05.05.23 18:42 Сейчас в теме
(15) А в чем проблема нарисовать обработчик в модуле формы и назначить его при создании элемента? Ты же ведешь доработку в основной конфе - у тебя вообще проблем нет!
17. wertep 31 10.05.23 09:37 Сейчас в теме
(15) Сейчас они переходят на универсальные механизмы в общих модулях. Поэтому проверить уходит это в общий модуль "СобытияФорм". Если уходит, то дорабатывать там. И по хорошему сделать функцию в своем модуле, а туда вставить просто ее вызов.
19. truba 11.05.23 12:33 Сейчас в теме
(1) так а какие установки мешают во 2м-варианте прописать прямо в типовом, переопределенном в общем модуле? там не хватает всех данных?
18. user1647484 9 10.05.23 11:05 Сейчас в теме
Переопределить обработчики событий формы не получится. Они прописаны на уровне платформы. Она всякий раз будет искать нужные ей процедуры. И чтобы не конфликтовать с другими разработчиками, лучше использовать подписки на события. сначала отработает типовое событие, и затем аналогичное в подписке.
20. user1826630 11.05.23 12:47 Сейчас в теме
(18) Ну, расскажи мне, какие подписки существуют на события формы или на события элементов формы?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот