Переопределение обработчика события формы
Доброго дня.
Что-то меня сконтузил вопрос из шапки.
Имеются 2 формы документа. Нужно при измении поля таблицы выполнить некий код, но в одном документе типовой обработчик имеется, а в другом нет.
Окей, в 1м случае дописываем прямо в типовом, а 2й вариант программно через УстановитьДействие(). Но как оказалось в последствии, то в конструкторе формы его не было, а по факту он переопределялся в общем модуле. Таким образом я изменил логику поля при изменении и удалил типовую.
Как правильно переопределять в таких сложных случаях и не наткнуться на такую ошибку?
Да, есть ПолучитьДействие(), но что оно мне даст? Если обработчик имеется, то? Теоретически, моя доработка позволяет сначала выполнить типовой, а затем мой, но как правильно переопределить я так и не пойму, ведь, похоже, что имя исходного обработчика нужно где-то хранить, а потом уже вызывать. Надеюсь, проблему описал корректно.
ЗЫ: доработка в основной конфе, расширение не предлагать :)
Что-то меня сконтузил вопрос из шапки.
Имеются 2 формы документа. Нужно при измении поля таблицы выполнить некий код, но в одном документе типовой обработчик имеется, а в другом нет.
Окей, в 1м случае дописываем прямо в типовом, а 2й вариант программно через УстановитьДействие(). Но как оказалось в последствии, то в конструкторе формы его не было, а по факту он переопределялся в общем модуле. Таким образом я изменил логику поля при изменении и удалил типовую.
Как правильно переопределять в таких сложных случаях и не наткнуться на такую ошибку?
Да, есть ПолучитьДействие(), но что оно мне даст? Если обработчик имеется, то? Теоретически, моя доработка позволяет сначала выполнить типовой, а затем мой, но как правильно переопределить я так и не пойму, ведь, похоже, что имя исходного обработчика нужно где-то хранить, а потом уже вызывать. Надеюсь, проблему описал корректно.
ЗЫ: доработка в основной конфе, расширение не предлагать :)
По теме из базы знаний
- Методика переопределения и вызова обработчиков событий обычной формы
- Файл шаблонов кода для создания обработчиков событий формы
- Методика упрощения поддержки конфигураций. Переопределение и вызов обработчиков событий для УФ 1С 8.2-8.3
- Структурирование доработок обработчиков событий объектов и форм
- [ЕХТ] Фреймворк для Расширений 1С: Обработка событий: описание, примеры и демобаза.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Доработка ведется в расширении? Можно заимствовать событие элемента формы.
Можно, конечно, сохранить имя типового обработчика, полученного через ПолучитьДействие, в программно созданном реквизите формы, потом вызывать его через Выполнить в собственном обработчике, но это плохая идея.
Можно, конечно, сохранить имя типового обработчика, полученного через ПолучитьДействие, в программно созданном реквизите формы, потом вызывать его через Выполнить в собственном обработчике, но это плохая идея.
(1)Мне кажется, вы усложняете проблему.
Можно проверить, выполняется ли что-то в событии, которое нужно изменить.
Включить замер производительности, выполнить действие на форме, выключить замер производительности. Посмотреть что в замере.
Если ничего в замере нет, значит, никаких обработчиков событий нет.
Сейчас вы нашли нужный обработчик, в него и допишите ваш код.
Можно проверить, выполняется ли что-то в событии, которое нужно изменить.
Включить замер производительности, выполнить действие на форме, выключить замер производительности. Посмотреть что в замере.
Если ничего в замере нет, значит, никаких обработчиков событий нет.
Сейчас вы нашли нужный обработчик, в него и допишите ваш код.
(8)
Не сказали бы, ошибок в 99% случаев не будет и типовая логика при изменении просто игнорируется.
Так как всё-таки действовать в этой ситуации?)
МодификацияКонфигурацииПереопределяемый.ПриСозданииФормыНаСервере(): варианты:
а) Игнорировать программную установку типового обработчика и жестко поставить свою
пускай пользуется конструктором формы, а такие трюки оставит мне! :D
б) Проверить, если действие уже назначено, и отказаться/или наоборот переопределить
в) Ну, раз я нашёл подключаемый обработчик, то в него уже засунуть мою процедуру? А вдруг вендор имеет ветку условий, от которых зависит имя подключаемого обработчика и их там N штук?:)
Вам бы сказали пользователи, что что-то сломалось после доработок
Не сказали бы, ошибок в 99% случаев не будет и типовая логика при изменении просто игнорируется.
Так как всё-таки действовать в этой ситуации?)
МодификацияКонфигурацииПереопределяемый.ПриСозданииФормыНаСервере(): варианты:
а) Игнорировать программную установку типового обработчика и жестко поставить свою
Элемент.УстановитьДействие("ПриИзменении", "МояПроцедура");
пускай пользуется конструктором формы, а такие трюки оставит мне! :D
б) Проверить, если действие уже назначено, и отказаться/или наоборот переопределить
Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("ПриИзменении")) Тогда
Элемент.УстановитьДействие("ПриИзменении", "МояПроцедура");
КонецЕсли;
в) Ну, раз я нашёл подключаемый обработчик, то в него уже засунуть мою процедуру? А вдруг вендор имеет ветку условий, от которых зависит имя подключаемого обработчика и их там N штук?:)
Процедура ПодключаемыйN_ПолеПриИзменении(Элемент)
//...
МояПроцедура(Элемент);
КонецПроцедуры
(9)
В обработчике события что-то делается. Может заполняются другие поля, или что-то еще. Если они перестанут заполняться, это и будет ошибкой. Если вы этого не заметите при тестировании, это заметят пользователи.
Не понял, что значит "вдруг"? У вас конфигуратор перед глазами, открываете и смотрите, как подключаются обработчики событий. Процедуры - обработчики событий должны быть размещены только в модуле этой формы.
Обычно не бывает N обработчиков для одного элемента, скорее наоборот, обработчик один, и назначается он N элементам.
Не сказали бы, ошибок в 99% случаев не будет и типовая логика при изменении просто игнорируется.
В обработчике события что-то делается. Может заполняются другие поля, или что-то еще. Если они перестанут заполняться, это и будет ошибкой. Если вы этого не заметите при тестировании, это заметят пользователи.
А вдруг вендор имеет ветку условий, от которых зависит имя подключаемого обработчика и их там N штук?:)
Не понял, что значит "вдруг"? У вас конфигуратор перед глазами, открываете и смотрите, как подключаются обработчики событий. Процедуры - обработчики событий должны быть размещены только в модуле этой формы.
Обычно не бывает N обработчиков для одного элемента, скорее наоборот, обработчик один, и назначается он N элементам.
(10)
Если при изменении контрагента не заполнился основной договор, то никто этого не заметит, просто заполнят его руками.
(10)
В моей форме они назначаются в общем модуле.
В обработчике события что-то делается. Может заполняются другие поля, или что-то еще. Если они перестанут заполняться, это и будет ошибкой. Если вы этого не заметите при тестировании, это заметят пользователи.
Если при изменении контрагента не заполнился основной договор, то никто этого не заметит, просто заполнят его руками.
(10)
Процедуры - обработчики событий должны быть размещены только в модуле этой формы.
В моей форме они назначаются в общем модуле.
(12)
Ну, это очевидно, просто я же не могу сопоставить имя процедуры и имя поля, у меня это "Подключаемый_Блаблабла()".
Я заметил его чисто случайно, когда выполнил "ПолучитьДействие()" и увидел, что оно уже назначено.
Назначаться они могут хоть где, а сами процедуры размещаться - в форме.
Ну, это очевидно, просто я же не могу сопоставить имя процедуры и имя поля, у меня это "Подключаемый_Блаблабла()".
Я заметил его чисто случайно, когда выполнил "ПолучитьДействие()" и увидел, что оно уже назначено.
(13) Задача не имеет универсального решения в этой постановке.
Проверить что они есть просто. По методикам разработки 1С все подключаемые функции/процедуры должны иметь перфикс "Подключаемый_", открыть модуль и проверить их наличие.
А дальше только проверять логику работы во всех вариантах. Потому как вы заметили подключаться программно в зависимости от условий могут разные обработчики. Но они могут и меняться после создания формы в любое время. поэтому только анализ и уже после этого изменение нужного подключаемого.
Проверить что они есть просто. По методикам разработки 1С все подключаемые функции/процедуры должны иметь перфикс "Подключаемый_", открыть модуль и проверить их наличие.
А дальше только проверять логику работы во всех вариантах. Потому как вы заметили подключаться программно в зависимости от условий могут разные обработчики. Но они могут и меняться после создания формы в любое время. поэтому только анализ и уже после этого изменение нужного подключаемого.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот