О программном создании элементов формы. написано немало, самая лучшая, на мой взгляд, публикация это [Шпаргалка] Программное создание элементов формы, весьма рекомендую использовать как справочник для нестандартных вариантов или обучающий материал для новичков.
Рано или поздно приходят мысли убрать простыни кода, например автор предыдущей публикации предлагает огромный и сложный модуль, куда вынесен основной код: [Общий модуль] Динамическое формирование интерфейса, что на мой взгляд избыточно для большинства применений.
Чаще всего требуется лишь добавить пару простых элементов на форму где-нибудь в расширении и перегружать его избыточном кодом мне кажется излишним.
Вашему вниманию предлагаю одну компактную функцию, которая:
- Обеспечит добавление элемента в одну компактную строку.
- Позволит в этой строке указать все необходимые свойства и обработчики событий.
Примеры вызовов:
//Пример вывода гиперссылки:
мо_ВывестиЭлементУниверсально(ЭтаФорма, ГруппаДанныеДляПФ,"akr_ПрогнозныеКурсыСценариев_Ссылка",Новый Структура("ТипЭлемента,Гиперссылка,Заголовок,Подсказка,ИмяОбработчикаНажатие",Тип("ДекорацияФормы"),Истина,"Прогнозные курсы сценариев",
"Предназначен для хранения прогнозируемых курсов валют, которые будут использоваться в различных сценариях.","ПерейтиПоСсылке"));
//Пример вывода поля ввода:
мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.Эксплуатация,"akrИнвестиционнаяЗаявка",Новый Структура("АвтоМаксимальнаяШирина,МаксимальнаяШирина",Ложь,25));
//Пример вывода флажка:
мо_ВывестиЭлементУниверсально(ЭтотОбъект, Элементы.ГруппаПроведениеИнвентаризации,"akrПровереноАудитором",Новый Структура("Вид",ВидПоляФормы.ПолеФлажка));
Функция не ограничена только этими вариантами, оставляя простор вашему творчеству. В качестве возвратного значения функция возвращает ссылку на новый элемент, предоставляя возможность дальнейшей программной обработки.
//Функция преднозначена для компактного описания динамического добавления элементов на форму
//Параметры
// Форма - форма где будет отображаться новый элемент.
// Родитель = Элемент формы (группа, страница) в котором будет отображаться новый элемент.
// ИмяЭлемента = имя нового элемента на форме.
// СтруктураНастроек - необязательно. Структура с дополнительными параметрами элемента.
// Имена элементов структуры должны совпадать с именами свойств нового элемента а значения с присваиваемыми этим свойствам значениями.
//Дополнительно :
//"ИмяРеквизита" - Если не установлено, будет совпадать с параметром "ИмяЭлемента". Полю ввода устанавливается свойство ПутьКДанным = "Объект."+ИмяРеквизита;
//Для более сложных вариантов можно задать свойство структуры "ПутьКДанным" непосредственно.
//"ТипЭлемента" - по умолчанию = Тип("ПолеФормы")
//"Вид" - по умолчанию для поля формы = ВидПоляФормы.ПолеВвода
//"ПредшествующийЭлемент" - не обязательно, при указании перемещает новый элемент формы на нужную позицию
//"ИмяОбработчикаПриИзменении" - указывает имя соответвующего обработчика
//"ИмяОбработчикаНачалоВыбора" - указывает имя соответвующего обработчика
//"ИмяОбработчикаНажатие" - указывает имя соответвующего обработчика
// Пример обработчика нажатия на гиперссылку
//&НаКлиенте
//Процедура ПерейтиПоСсылке();
// ПараметрыФормы = Новый Структура("", );
// ОткрытьФорму("РегистрСведений.ПрогнозныеКурсыСценариев.ФормаСписка", ПараметрыФормы);
//КонецПроцедуры
//Примеры вызова:
//Создание простой группы элементов без отображения
//ГруппаДанныеДляПФ=мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.ГруппаПланированиеЗапасов,"ГруппаНСИВложенный_akr1",Новый Структура("ТипЭлемента,Вид,Заголовок,Отображение,ОтображатьЗаголовок", Тип("ГруппаФормы"),ВидГруппыФормы.ОбычнаяГруппа,"НСИ вложенный akr1",ОтображениеОбычнойГруппы.Нет,Ложь));
//Пример вывода гиперссылки:
//мо_ВывестиЭлементУниверсально(ЭтаФорма, ГруппаДанныеДляПФ,"akr_ПрогнозныеКурсыСценариев_Ссылка",Новый Структура("ТипЭлемента,Гиперссылка,Заголовок,Подсказка,ИмяОбработчикаНажатие",Тип("ДекорацияФормы"),Истина,"Прогнозные курсы сценариев",
// "Предназначен для хранения прогнозируемых курсов валют, которые будут использоваться в различных сценариях.","ПерейтиПоСсылке"));
//Пример вывода поля ввода:
//мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.Эксплуатация,"akrИнвестиционнаяЗаявка",Новый Структура("АвтоМаксимальнаяШирина,МаксимальнаяШирина",Ложь,25));
//Пример вывода флажка:
//мо_ВывестиЭлементУниверсально(ЭтотОбъект, Элементы.ГруппаПроведениеИнвентаризации,"akrПровереноАудитором",Новый Структура("Вид",ВидПоляФормы.ПолеФлажка));
Функция мо_ВывестиЭлементУниверсально(Форма, Родитель, ИмяЭлемента,СтруктураНастроек=Неопределено) Экспорт
Если СтруктураНастроек = Неопределено тогда
СтруктураНастроек = Новый Структура("ИмяРеквизита",ИмяЭлемента);
Иначе
Если НЕ СтруктураНастроек.Свойство("ИмяРеквизита") Тогда
СтруктураНастроек.Вставить("ИмяРеквизита",ИмяЭлемента);
КонецЕсли;
КонецЕсли;
ТипЭлемента=Неопределено;
Если СтруктураНастроек.Свойство("ТипЭлемента",ТипЭлемента) Тогда
Если ТипЭлемента=Тип("Строка") Тогда
ТипЭлемента=Тип(ТипЭлемента);
КонецЕсли;
Иначе
ТипЭлемента=Тип("ПолеФормы");
КонецЕсли;
НовыйЭлемент = Форма.Элементы.Добавить(ИмяЭлемента,ТипЭлемента,Родитель);
ТекВидПоляФормы=Неопределено;
Если СтруктураНастроек.Свойство("Вид",ТекВидПоляФормы) Тогда
НовыйЭлемент.Вид = ТекВидПоляФормы;
Иначе
Если ТипЭлемента=Тип("ПолеФормы") Тогда
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
КонецЕсли;
Если ТипЭлемента=Тип("ПолеФормы") и не СтруктураНастроек.Свойство("ПутьКДанным") Тогда
НовыйЭлемент.ПутьКДанным = "Объект."+СтруктураНастроек.ИмяРеквизита;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НовыйЭлемент,СтруктураНастроек);
Если СтруктураНастроек.Свойство("ИмяОбработчикаПриИзменении") Тогда
НовыйЭлемент.УстановитьДействие("ПриИзменении", СтруктураНастроек.ИмяОбработчикаПриИзменении);
КонецЕсли;
Если СтруктураНастроек.Свойство("ИмяОбработчикаНачалоВыбора") Тогда
НовыйЭлемент.УстановитьДействие("НачалоВыбора", СтруктураНастроек.ИмяОбработчикаНачалоВыбора);
КонецЕсли;
Если СтруктураНастроек.Свойство("ИмяОбработчикаНажатие") Тогда
НовыйЭлемент.УстановитьДействие("Нажатие", СтруктураНастроек.ИмяОбработчикаНажатие);
КонецЕсли;
Если СтруктураНастроек.Свойство("ПредшествующийЭлемент") тогда
Форма.Элементы.Переместить(НовыйЭлемент, Родитель, СтруктураНастроек.ПредшествующийЭлемент);
КонецЕсли;
Возврат НовыйЭлемент;
КонецФункции
Другие этюды по программированию и другие публикации автора : //infostart.ru/profile/48714/
Другие разработки автора:
Проверено на следующих конфигурациях и релизах: 1С:ERP Управление предприятием 2 (2.5.22.72) и 1С:Предприятие 8.3 (8.3.27.1606)
Вступайте в нашу телеграмм-группу Инфостарт