Имя: Пароль:
1C
1C 7.7
v7: 1С++. Перехват предопределенных методов формы (событий) в классе
0 zelenprog
 
02.02.24
10:46
Добрый день!

Нужно сделать несколько однотипных обработок, которые в предопределенных методах выполняют очень похожие действия.
Также в этих обработках есть одинаковые "наборы" реквизитов, события (формулы) от которых, также выполняют очень похожие действия.

Естественно, хочется программный код этих одинаковых действий минимизировать и переиспользовать.
для этого все эти одинаковые действия я вынес во внешний 1С++ класс.
Класс этот я назвал звучно - "КонтроллерМоейОбработки"!

В модуле обработки объявлена переменная мКонтроллер и при открытии формы создается этот класс:

мКонтроллер = СоздатьОбъект("КонтроллерМоейОбработки");
мКонтроллер.УстановитьКонтекстФормы(Контекст);


Во всех предопределенных методах, в обработчиках событий, в методах формул я просто вызываю (транслирую) соответствующую функцию этого контроллера.
Например:

Процедура ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагОбработки)
    КонтроллерМоейФормы.Событие_ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагОбработки);
КонецПроцедуры


Однако, писать около двадцати таких "транслирующих" вызовов в каждой обработке - тоже довольно утомительно.
Или я просто ленивый? А также эта "механическая" трансляция чревата ошибками.

В общем, хочется еще больше упростить код. Можно ли это сделать?

Может ли класс сам "назначить" обработчики на все эти события на "свои" "локальные" методы?
Например, в методе КонтроллерМоейОбработки::УстановитьКонтекстФормы(пКонтекстФормы) написать что-то типа:

ПерехватСобытия("ПриНачалеВыбораЗначения", пКонтекстФормы, "Событие_ПриНачалеВыбораЗначения");
ПерехватСобытия("ФормулаПоляВводаФИО", пКонтекстФормы, "Формула_ФИО");
ПерехватСобытия("ФормулаПриИзмененииФлага", пКонтекстФормы, "Формула_ПриИзмененииФлага");


Читал про класс "Перехватчик", но так до конца не понял, можно ли с помощью Перехватчика это сделать?
Или это надо делать каким-то другим способом?
Можно ли вообще сделать задуманное? Подскажите, пожалуйста.
1 АЛьФ
 
02.02.24
11:22
У нас используется класс Общие.Форма.Привязка. У него в модуле прописано:

Функция Сам(Конт) Возврат Конт; КонецФункции

Процедура Конструктор()
    Перехватчик = СоздатьОбъект("Перехватчик");
    ПерехваченныйКонтекст = Сам(Контекст).ПолучитьКонтекстОкружения();
    ПерехватчикПредыдущий = Перехватчик.ПолучитьПерехватчикСобытийГК(ПерехваченныйКонтекст);
    Перехватчик.ПерехватитьСобытияГК(ПерехваченныйКонтекст, Сам(Контекст));

Все события с формы летят прямо в него.

Процедура ПослеОткрытия() Экспорт
    Перехватчик.ВыполнитьСобытиеГК(ПерехватчикПредыдущий, ПерехваченныйКонтекст, "ПослеОткрытия");
    //ЗаполнитьПривязку();
    //_ПриИзмененииРазмераОкна();
КонецПроцедуры

Процедура ПослеСозданияФормы() Экспорт
    Перехватчик.ВыполнитьСобытиеГК(ПерехватчикПредыдущий, ПерехваченныйКонтекст, "ПослеСозданияФормы");
    ШиринаПривязки=РасширениеФормы.Ширина;
    ВысотаПривязки=РасширениеФормы.Высота;
    ЗаполнитьПривязку();
    _ПриИзмененииРазмераОкна();
КонецПроцедуры
2 Ёпрст
 
02.02.24
11:23
3 zelenprog
 
02.02.24
12:02
(1) У меня тоже есть такой класс.
Даже два: "Общие.Форма.Привязка" и "Общие.Форма.Привязка2".
Но в них нету кода с Перехватчиками.

А что делает "ПерехваченныйКонтекст = Сам(Контекст).ПолучитьКонтекстОкружения()"?

Есть где-нибудь описание класса "Перехватчик"?
В документации на 1С++ не нашел, вернее ссылка "Перехватчик" там просто не открывается:
https://www.1cpp.ru/docum/icpp/html/extobjs.html
4 АЛьФ
 
02.02.24
12:05
5 АЛьФ
 
02.02.24
12:08
2(3) по поводу "ПолучитьКонтекстОкружения": https://www.1cpp.ru/docum/icpp/html/classes.html#id13