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

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С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

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

28800 руб.

27.03.2025    17535    24    18    

35

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

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

18000 руб.

19.04.2021    26395    59    56    

72

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

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

9600 руб.

11.01.2022    15395    4    6    

10

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

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    66229    45    60    

84

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

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

5160 руб.

29.06.2020    21889    32    6    

49

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

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

5040 руб.

06.10.2020    11740    8    8    

13

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

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

21.05.2024    41357    dimanich70    83    

157

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

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    21136    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 391 28.08.25 09:47 Сейчас в теме
Спасибо за публикацию.
Хочу сказать на примерах это не компактные строки, а очень громоздкие.
А еще прям в передаче параметров создаются структуры, это не очень хорошо.
На счет огромного отдельного модуля, это правильно, потому что нужно иметь возможность создавать все, сегодня нужно одно, завтра другое.
Я лично пользуюсь formhelper от Иванченко.
Для отправки сообщения требуется регистрация/авторизация