v8: Копировальщик форм - вложенные формы Ключевые слова: форма,копирование,элементы
Часто при обновлении типовых я создаю форму-заготовку, а потом добавляю ее элементы в форму типовой конфигурации, например при создании формы. Это позволяет дорабатывать интерфейс формы чисто на уровне кода модуля, т.е. не особо вмешиваться в функционал.
Привожу две полезных функции:
* п_ДобавитьЭлементФормыНаПанель - добавляет элемент управления непосредственно на указанную страницу панели
* п_КопироватьЭлементыФормы - копирует элементы формы из одной формы в другую
Пока в коде перечислены не все события элементов управления, поэтому чтобы события тоже копировались, надо привести их полный перечень.
Ограничение - в копируемой форме не должно быть панелей, т.к. по элементу нельзя определить, какой панели он принадлежит. Но если уж очень хочется иметь панели, нужно где-то в элементах формы подписывать, к какой панели принадлежит элемент, тогда можно внедрять и формы с панелями.
Функция п_ДобавитьЭлементФормыНаПанель(
Форма, Тип, Имя,
Видимость=Неопределено,
Панель=Неопределено,
РезСтраницаПанели=Неопределено) Экспорт
ИсхСтраницаПанели=Неопределено;
Если Панель<>Неопределено И РезСтраницаПанели<>Неопределено И
РезСтраницаПанели<>Панель.ТекущаяСтраница Тогда
ИсхСтраницаПанели=Панель.ТекущаяСтраница;
Панель.ТекущаяСтраница=РезСтраницаПанели;
КонецЕсли;
Эл=Форма.ЭлементыФормы.Добавить(Тип, Имя, Видимость, Панель);
Если ИсхСтраницаПанели<>Неопределено И
РезСтраницаПанели<>Панель.ТекущаяСтраница Тогда
Панель.ТекущаяСтраница=ИсхСтраницаПанели;
КонецЕсли;
Возврат Эл;
КонецФункции
Функция п_КопироватьЭлементыФормы(РезФорма, ИсхФорма, Панель,
РезСтраницаПанели=Неопределено, События=истина) Экспорт
Если События Тогда
МассивСобытий=Новый Массив;
МассивСобытий.Добавить("НачалоВыбора");
МассивСобытий.Добавить("ПриИзменении");
КонецЕсли;
Для Каждого ИсхЭл Из ИсхФорма.ЭлементыФормы Цикл
ИсхТип=ТипЗнч(ИсхЭл);
Эл=п_ДобавитьЭлементФормыНаПанель(РезФорма, ИсхТип,ИсхЭл.Имя, истина, Панель, РезСтраницаПанели);
Попытка
ЗаполнитьЗначенияСвойств(Эл,ИсхЭл,,"Значение");
Исключение
Попытка
ЗаполнитьЗначенияСвойств(Эл,ИсхЭл,,);
Исключение
КонецПопытки;
КонецПопытки;
Если События Тогда
Для Каждого Событие Из МассивСобытий Цикл
Попытка
Эл.УстановитьДействие(Событие, ИсхЭл.ПолучитьДействие(Событие));
Исключение
КОнецПопытки;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецФункции
|