Этюды по программированию: Создание элементов на форме. Примеры и код функции для компактной записи

26.08.25

Разработка - Работа с интерфейсом

Мой вариант программного создания элементов формы, главное достоинство - компактность кода. Пишу как шпаргалку, в том числе и для себя тоже.

О программном создании элементов формы. написано немало, самая лучшая, на мой взгляд, публикация это [Шпаргалка] Программное создание элементов формы, весьма рекомендую использовать как справочник для нестандартных вариантов или обучающий материал для новичков.

Рано или поздно приходят мысли убрать простыни кода, например автор предыдущей публикации предлагает огромный и сложный модуль, куда вынесен основной код: [Общий модуль] Динамическое формирование интерфейса, что на мой взгляд избыточно для большинства применений.

Чаще всего требуется лишь добавить пару простых элементов на форму где-нибудь в расширении и перегружать его избыточном кодом мне кажется излишним.

Вашему вниманию предлагаю одну компактную функцию, которая:

  1. Обеспечит добавление элемента в одну компактную строку.
  2. Позволит в этой строке указать все необходимые свойства и обработчики событий.

Примеры вызовов:

//Пример вывода гиперссылки: 
мо_ВывестиЭлементУниверсально(ЭтаФорма, ГруппаДанныеДляПФ,"мо_ПрогнозныеКурсыСценариев_Ссылка",Новый Структура("ТипЭлемента,Гиперссылка,Заголовок,Подсказка,ИмяОбработчикаНажатие",Тип("ДекорацияФормы"),Истина,"Прогнозные курсы сценариев",
		"Предназначен для хранения прогнозируемых курсов валют, которые будут использоваться в различных сценариях.","ПерейтиПоСсылке"));


//Пример вывода поля ввода: 
мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.Эксплуатация,"мо_ИнвестиционнаяЗаявка",Новый Структура("АвтоМаксимальнаяШирина,МаксимальнаяШирина",Ложь,25));

//Пример вывода флажка: 
мо_ВывестиЭлементУниверсально(ЭтотОбъект, Элементы.ГруппаПроведениеИнвентаризации,"мо_ПровереноАудитором",Новый Структура("Вид",ВидПоляФормы.ПолеФлажка));

//Пример создания реквизита в таблице формы и вывода этого реквизита: 

//Создание реквизитов
	ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
	НовыйРеквизит = Новый РеквизитФормы("мо_НомерПлавки",Новый ОписаниеТипов("СправочникСсылка.мо_НомераПлавок"),"Объект.ПартииПроизводства","Номер плавки"); 
	ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); 
	ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	//Применяем реквизиты     
	мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.ПартииПроизводства,"мо_НомерПлавки",Новый Структура("ПредшествующийЭлемент,ПутьКДанным",ЭтаФорма.Элементы.ПартииПроизводстваПартияПроизводства,"Объект.ПартииПроизводства.мо_НомерПлавки"));

Функция не ограничена только этими вариантами, оставляя простор вашему творчеству. В качестве возвратного значения функция возвращает ссылку на новый элемент, предоставляя возможность дальнейшей программной обработки.

//Функция преднозначена для компактного описания динамического добавления элементов на форму
//Параметры
// Форма   - форма где будет отображаться новый элемент.
// Родитель = Элемент формы (группа, страница) в котором будет отображаться новый элемент.
// ИмяЭлемента = имя нового элемента на форме.  
// СтруктураНастроек - необязательно. Структура с дополнительными параметрами элемента.
// Имена элементов структуры должны совпадать с именами свойств нового элемента  а значения с присваиваемыми этим свойствам значениями.
//Дополнительно :

//"ИмяРеквизита" - Если не установлено, будет совпадать с параметром "ИмяЭлемента". Полю ввода устанавливается свойство ПутьКДанным = "Объект."+ИмяРеквизита; 
//Для более сложных вариантов можно задать свойство структуры "ПутьКДанным" непосредственно.

//"ТипЭлемента" - по умолчанию = Тип("ПолеФормы")
//"Вид" - по умолчанию для поля формы = ВидПоляФормы.ПолеВвода
//"ПредшествующийЭлемент" - не обязательно, при указании перемещает новый элемент формы на нужную позицию 
//"ИмяОбработчикаПриИзменении"  - указывает имя соответвующего обработчика

//"ИмяОбработчикаНачалоВыбора"  - указывает имя соответвующего обработчика

//"ИмяОбработчикаНажатие"  - указывает имя соответвующего обработчика
// Пример обработчика нажатия на гиперссылку
//&НаКлиенте
//Процедура ПерейтиПоСсылке();
//	ПараметрыФормы = Новый Структура("", );
//	ОткрытьФорму("РегистрСведений.ПрогнозныеКурсыСценариев.ФормаСписка", ПараметрыФормы);
//КонецПроцедуры


//Примеры вызова:
//Создание простой группы элементов без отображения
//ГруппаДанныеДляПФ=мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.ГруппаПланированиеЗапасов,"ГруппаНСИВложенный_мо_1",Новый Структура("ТипЭлемента,Вид,Заголовок,Отображение,ОтображатьЗаголовок", Тип("ГруппаФормы"),ВидГруппыФормы.ОбычнаяГруппа,"НСИ вложенный мо_1",ОтображениеОбычнойГруппы.Нет,Ложь));

//Пример вывода гиперссылки: 
//мо_ВывестиЭлементУниверсально(ЭтаФорма, ГруппаДанныеДляПФ,"мо_ПрогнозныеКурсыСценариев_Ссылка",Новый Структура("ТипЭлемента,Гиперссылка,Заголовок,Подсказка,ИмяОбработчикаНажатие",Тип("ДекорацияФормы"),Истина,"Прогнозные курсы сценариев",
//		"Предназначен для хранения прогнозируемых курсов валют, которые будут использоваться в различных сценариях.","ПерейтиПоСсылке"));


//Пример вывода поля ввода: 
//мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.Эксплуатация,"мо_ИнвестиционнаяЗаявка",Новый Структура("АвтоМаксимальнаяШирина,МаксимальнаяШирина",Ложь,25));

//Пример вывода флажка: 
//мо_ВывестиЭлементУниверсально(ЭтотОбъект, Элементы.ГруппаПроведениеИнвентаризации,"мо_ПровереноАудитором",Новый Структура("Вид",ВидПоляФормы.ПолеФлажка));

//Пример создания реквизита в таблице формы и вывода этого реквизита: 

////Создание реквизитов
//	ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
//	НовыйРеквизит = Новый РеквизитФормы("мо_НомерПлавки",Новый ОписаниеТипов("СправочникСсылка.мо_НомераПлавок"),"Объект.ПартииПроизводства","Номер плавки"); 
//	ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); 
//	ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//	//Применяем реквизиты     
//	мо_ВывестиЭлементУниверсально(ЭтаФорма, ЭтаФорма.Элементы.ПартииПроизводства,"мо_НомерПлавки",Новый Структура("ПредшествующийЭлемент,ПутьКДанным",ЭтаФорма.Элементы.ПартииПроизводстваПартияПроизводства,"Объект.ПартииПроизводства.мо_НомерПлавки"));

&НаСервере
Функция мо_ВывестиЭлементУниверсально(Форма, Родитель, ИмяЭлемента,СтруктураНастроек=Неопределено) Экспорт
	Если СтруктураНастроек = Неопределено тогда
		СтруктураНастроек = Новый Структура("ИмяРеквизита",ИмяЭлемента);
	Иначе
		Если НЕ СтруктураНастроек.Свойство("ИмяРеквизита")  Тогда
			СтруктураНастроек.Вставить("ИмяРеквизита",ИмяЭлемента);
		КонецЕсли;
	КонецЕсли;	
	ТипЭлемента=Неопределено;
	Если СтруктураНастроек.Свойство("ТипЭлемента",ТипЭлемента)  Тогда  
		Если ТипЭлемента=Тип("Строка") Тогда
			ТипЭлемента=Тип(ТипЭлемента);	
		КонецЕсли; 
	Иначе
		ТипЭлемента=Тип("ПолеФормы");
	КонецЕсли;
	НовыйЭлемент = Форма.Элементы.Добавить(ИмяЭлемента,ТипЭлемента,Родитель); 
	ТекВидПоляФормы=Неопределено;
	Если СтруктураНастроек.Свойство("Вид",ТекВидПоляФормы)  Тогда  
		НовыйЭлемент.Вид = ТекВидПоляФормы;
	Иначе
		Если ТипЭлемента=Тип("ПолеФормы") Тогда
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; 
		КонецЕсли;
	КонецЕсли; 
	Если ТипЭлемента=Тип("ПолеФормы") и не СтруктураНастроек.Свойство("ПутьКДанным") Тогда  
	НовыйЭлемент.ПутьКДанным = "Объект."+СтруктураНастроек.ИмяРеквизита; 
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(НовыйЭлемент,СтруктураНастроек);
	Если СтруктураНастроек.Свойство("ИмяОбработчикаПриИзменении")  Тогда
		НовыйЭлемент.УстановитьДействие("ПриИзменении", СтруктураНастроек.ИмяОбработчикаПриИзменении);	
	КонецЕсли;
	Если СтруктураНастроек.Свойство("ИмяОбработчикаНачалоВыбора") Тогда
		НовыйЭлемент.УстановитьДействие("НачалоВыбора", СтруктураНастроек.ИмяОбработчикаНачалоВыбора);	
	КонецЕсли;
	Если СтруктураНастроек.Свойство("ИмяОбработчикаНажатие") Тогда
		НовыйЭлемент.УстановитьДействие("Нажатие", СтруктураНастроек.ИмяОбработчикаНажатие);	
	КонецЕсли;
	Если СтруктураНастроек.Свойство("ПредшествующийЭлемент") тогда
		Форма.Элементы.Переместить(НовыйЭлемент, Родитель, СтруктураНастроек.ПредшествующийЭлемент);	
	КонецЕсли;	
	Возврат НовыйЭлемент;
КонецФункции  

 

Другие этюды по программированию и другие публикации автора : //infostart.ru/profile/48714/

 

Другие разработки автора:

Подсистема штрихкодирования серий номенклатуры (УТ 11, КА, ERP)Подсистема штрихкодирования серий номенклатуры (УТ 11, КА, ERP)
Подсистема 'Входной контроль' для ERP ,КА , УТ 11
Подсистема 'Входной контроль' для ERP ,КА , УТ 11
Электронный обходной лист (расширение) для ERP, ЗУП, КА
Отправка электронных писем по задолженностям клиентов (ERP, УТ 11)Отправка электронных писем по задолженностям клиентов (ERP, УТ 11)
Excel Studio for 1CExcel Studio for 1C
Настраиваемый управленческий балансНастраиваемый управленческий баланс
Динамические отчеты СКД
Динамические отчеты СКД
Фоновая отправка уведомлений
Генератор кодаГенератор кода

 

Проверено на следующих конфигурациях и релизах: 1С:ERP Управление предприятием 2 (2.5.22.72)  и 1С:Предприятие 8.3 (8.3.27.1606) 

Вступайте в нашу телеграмм-группу Инфостарт

Программное создание элементов формы

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С v8.3 8.3.14 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

28800 руб.

27.03.2025    49503    28    22    

39

Сканер штрих-кода Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Стандартные конфигурации ERP, КА, УТ 11 позволяют работать с штрихкодированием серий. Есть только одно суровое ограничение – на упаковке должна быть этикетка для номенклатуры и отдельно для серии. Во многих случаях это критически неудобно.

24000 руб.

19.04.2021    27114    63    56    

76

Производство готовой продукции (работ, услуг) Рабочее место Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бухгалтерский учет Управленческий учет Платные (руб)

Расширение "Входной контроль" в 1С:ERP, КА 2.5, УТ11.5 и предназначено для удобства отражения операций входного контроля и их результатов в учетной системе, а также фотофиксации брака.

12000 руб.

02.02.2019    39132    46    22    

45

Кадровый учет Печатные формы Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Электронный обходной лист в 1С предназначен для безбумажной работы с обходными листами, по возможности их автоматического заполнения, с возможностями управления полномочиями по созданию и подписи документов, назначения заместителей, для отсутствующих сотрудников, при увольнении.

9600 руб.

11.01.2022    15942    4    6    

10

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами (виджетами) в 1С.

5160 руб.

29.06.2020    22490    32    6    

50

Работа с интерфейсом Программист 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

5040 руб.

06.10.2020    12514    8    8    

14

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    44331    dimanich70    83    

160
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ImHunter 340 26.08.25 11:11 Сейчас в теме
Вероятно, СтруктураНастроек нужно с Знач сделать. Чтобы не было побочного эффекта.
2. lefthander 26.08.25 16:34 Сейчас в теме
Спасибо очень пригодилась. Сейчас как раз много форм надо будет динамически менять в УТ...
3. SemandCheb 27.08.25 10:13 Сейчас в теме
Не подходит, если необходимо создать на форме в шапке без указания родительской группы или перед определенным элементом формы
4. Red_Devil 181 27.08.25 11:51 Сейчас в теме
5. mrcamomile 87 27.08.25 14:18 Сейчас в теме
Библиотека ДФИ - ее используем, на гитхабе видел
https://infostart.ru/1c/articles/1284403/
6. Viktor_Ermakov 393 28.08.25 09:47 Сейчас в теме
Спасибо за публикацию.
Хочу сказать на примерах это не компактные строки, а очень громоздкие.
А еще прям в передаче параметров создаются структуры, это не очень хорошо.
На счет огромного отдельного модуля, это правильно, потому что нужно иметь возможность создавать все, сегодня нужно одно, завтра другое.
Я лично пользуюсь formhelper от Иванченко.
Для отправки сообщения требуется регистрация/авторизация