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").Форма. ИмяЭлементаУправления или ЭлементыФормы.клВыборПериода1_ИмяЭлементаУправления.
- Если в родительской форме привязать границы элементов управления к границам формы, то в наследуемой форме они будут привязаны к границам панели.
- Возможен вызов родительского обработчика из переопределенного обработчика. Например, вы хотите переопределить обработчик нажатия кнопки. Тогда вы указываете обработчик для кнопки клТест_Кнопка1Нажатие. А в модуль наследуемой формы добавляете, например, такую процедуру.
Процедура клТест_Кнопка1Нажатие(Элемент)
Сообщить("Вызван переопределенный обработчик");
СтандClick(Элемент);
КонецПроцедуры
Компоненту и конфигурацию с примером можно получить здесь //infostart.ru/projects/3629/