[RClassMngr] Наследование форм v.1.1

26.03.09

Разработка - Математика и алгоритмы

Предлагаю методику наследования форм. Данная методика позволяет выделять блоки элементов управления форм, которые часто повторяются в разных формах, в отдельные классы.

UPDATE 26.03.2009 v.1.1

+ Добавил поддержку наследования типа КоманднаяПанель.


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

Для организации наследования необходимо выполнить следующее.

1.      Включить в состав конфигурации общий модуль НаследованиеФорм, зарегистрировать в  системе внешнюю компоненту RClassMngr (прилагаются в примере).

2.      Создать базовый класс на основе обработки.

2.1.   Добавить обработку, например, КлассВыборПериода.

2.2.   Добавить форму, например, Форма. Сделать ее основной. Обработка может содержать только одну базовую форму и она должна быть основной.

2.3.   Добавить реквизит формы имя Форма, тип Произвольный. Этот реквизит необходимо использовать вместо стандартного ЭлементыФормы для доступа к реквизитам базовой формы и их значениям в обработчиках базовой формы.

2.4.   Добавить на форму необходимые элементы управления. Элементы управления желательно не связывать с реквизитами формы. Обращаться к значениям элементов управления следует так: Форма.ИмяЭлементаУправления.Значение. Для обращения непосредственно к элементу управления – Форма.ИмяЭлементаУправления.

2.5.   Добавить необходимые обработчики событий для каждого элемента управления. В объявления процедур обработчиков следует добавить слово Экспорт. Иначе переадресация вызова обработчика из формы наследника в форму родителя работать не будет.

2.6.   После объявления процедур в теле модуля добавить следующий вызов: НаследованиеФорм.ИнитФормыКлассаРодителя(ЭтаФорма);

3.      Наследовать эту форму можно в любой форме конфигурации соблюдая следующий порядок действий. Например, Отчет ЖурналДокументов, форма ОсновнаяФорма.

3.1.   В модуль наследуемой формы добавить вызов НаследованиеФорм.ИнитФормыКлассаНаследника(ЭтаФорма);

3.2.   Добавить реквизит формы имя БазовыеКлассы, тип Произвольный.

3.3.   В модуль наследуемой формы добавить стандартные обработчики для элементов управления. Не буду приводить текст этих обработчиков, смотрите прилагаемый пример. Обращаю внимание! Текст этих обработчиков менять не следует! Форма может наследовать элементы сразу от нескольких разных родительских форм. При этом стандартные обработчики добавляются только один раз и работают сразу для всех родительских форм и унаследованных элементов управления. Изменять их не нужно. Их нужно просто скопировать из примера и просто вставить в модуль вашей формы.

3.4.   На наследуемую форму следует поместить Панель в то место на форме, где должны оказаться наследуемые элементы управления. Имя панели, например, клВыборПериода1.

3.5.   Добавить реквизит формы имя клВыборПериода1, тип Обработка.КлассВыборПериода. Внимание! Имя реквизита должно совпадать с именем панели на форме. Тип реквизита должен быть обработкой, в которой описан базовый класс.

Все. Теперь при выводе основной формы отчета ЖурналДокументов на месте панели вы увидите реквизиты из родительской формы.

 

Кроме того, доступны следующие возможности.

  1. Возможно переопределить свойства элемента управления в наследуемой форме. Для этого нужно поместить на форму элемент управления, например, скопировать его из родительской формы. Имя элемента должно быть составлено по следующему шаблону – ИмяПанели_ИмяЭлементаВРодительскойФорме. Можно изменить любые свойства элемента, они уже не будут изменены при связывании родительской формы и этого элемента. Обработчики событий можно не указывать. Они будут подхвачены из родительской формы.
  2. А можно изменить обработчики на собственные. Для этого достаточно указать обработчики для элемента в наследуемой форме стандартным способом. Тогда обработчики родительской формы будут игнорироваться.
  3. Возможно связать элементы управления, определенные в родительской форме, с данными, определенными в наследуемой форме. Для этого в Панели в свойстве Заголовок необходимо записать пары ИмяЭлемента=Данные через точку с запятой.
  4. В модуле наследуемой формы возможно обращение к элементам из родительской формы следующим образом. Для приведенного выше примера, БазовыеКлассы.Получить("клВыборПериода1").Форма. ИмяЭлементаУправления или ЭлементыФормы.клВыборПериода1_ИмяЭлементаУправления.
  5. Если в родительской форме привязать границы элементов управления к границам формы, то в наследуемой форме они будут привязаны к границам панели.
  6. Возможен вызов родительского обработчика из переопределенного обработчика. Например, вы хотите переопределить обработчик нажатия кнопки. Тогда вы указываете обработчик для кнопки клТест_Кнопка1Нажатие. А в модуль наследуемой формы добавляете, например, такую процедуру.

Процедура клТест_Кнопка1Нажатие(Элемент)

      Сообщить("Вызван переопределенный обработчик");

      СтандClick(Элемент);

КонецПроцедуры

 

Компоненту и конфигурацию с примером можно получить здесь //infostart.ru/projects/3629/


См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3297    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7744    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3231    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    11004    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4489    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3646    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9061    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Арчибальд 2709 25.03.09 13:12 Сейчас в теме
Продолжаем, значит. И это правильно!
2. tormozit 7233 31.03.09 14:00 Сейчас в теме
А как события то обрабатывать будешь?
3. Robert 723 31.03.09 15:26 Сейчас в теме
(2) Обработчик события элемента управления записан в модуле формы родителя. Он и будет отрабатывать. Если только явно не переопределен в модуле формы наследника. Для этого нужно поместить на форму наследника аналогичный элемент управления из формы родителя и явно указать ему обработчик. Это описано выше.
Или я не понял вопрос?
Оставьте свое сообщение