diamond АШ Tlg

Программное создание элементов управляемой формы 1С 8.3

Шпаргалка, постарался раскрыть большинство тем, примеры пополняются.

Основы программного добавления элементов

Любые элементы управляемой формы 1С программно могут добавляться всего двумя командами, которые можно вызывать из предопределенного события формы ПриСозданииНаСервере(), эта технология чаще всего имеет смысл при доработке типовых конфигураций в расширении, т.к. программный код легче обновлять и сопровождать.

// Способ 1: Добавить в конец
НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, ТипЭлемента, РодительЭлемента);    

// Способ 2: Вставить между существующими элементами
НовыйЭлемент = Элементы.Вставить(ИмяЭлемента, ТипЭлемента, РодительЭлемента, ЭлементПередКоторымНужноВставить);

Программное добавление реквизитов формы необходимо выполнять перед созданием элементов формы!

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

Все примеры ниже приведены для объекта конфигурации с такими реквизитами и табличными частями:

Пример объекта

Простейшие поля в горизонтальной группе

Простейшие поля в горизонтальной группе
ГруппаНомерДата = Элементы.Добавить("ГруппаНомерДата", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаНомерДата.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаНомерДата.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаНомерДата.ОтображатьЗаголовок = Ложь;
ГруппаНомерДата.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
	
ПолеДата = Элементы.Добавить("ПолеДата", Тип("ПолеФормы"), ГруппаНомерДата);
ПолеДата.Вид = ВидПоляФормы.ПолеВвода;
ПолеДата.ПутьКДанным = "Объект.Дата";
	
ПолеНомер = Элементы.Добавить("ПолеНомер", Тип("ПолеФормы"), ГруппаНомерДата);
ПолеНомер.Вид = ВидПоляФормы.ПолеВвода;
ПолеНомер.ПутьКДанным = "Объект.Номер";

Простейшие поля в вертикальной группе

Простейшие поля в вертикальной группе
ГруппаРеквизиты = Элементы.Добавить("ГруппаРеквизиты", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаРеквизиты.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаРеквизиты.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение;
ГруппаРеквизиты.ОтображатьЗаголовок = Истина;
ГруппаРеквизиты.Заголовок = "Основные реквизиты";	
ГруппаРеквизиты.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	
ПолеСтрока = Элементы.Добавить("ПолеСтрока", Тип("ПолеФормы"), ГруппаРеквизиты);
ПолеСтрока.Вид = ВидПоляФормы.ПолеВвода;
ПолеСтрока.ПутьКДанным = "Объект.РеквизитСтрока";
	
ПолеЧисло = Элементы.Добавить("ПолеЧисло", Тип("ПолеФормы"), ГруппаРеквизиты);
ПолеЧисло.Вид = ВидПоляФормы.ПолеВвода;
ПолеЧисло.ПутьКДанным = "Объект.РеквизитЧисло";

Поле булевого типа

Поле булевого типа
ПолеБулево1 = Элементы.Добавить("ПолеБулево1", Тип("ПолеФормы"), ЭтаФорма);
ПолеБулево1.Вид = ВидПоляФормы.ПолеФлажка;
ПолеБулево1.ПутьКДанным = "Объект.РеквизитБулево";
		
ПолеБулево2 = Элементы.Добавить("ПолеБулево2", Тип("ПолеФормы"), ЭтаФорма);
ПолеБулево2.Вид = ВидПоляФормы.ПолеФлажка;
ПолеБулево2.ВидФлажка = ВидФлажка.Выключатель;
ПолеБулево2.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
ПолеБулево2.ПутьКДанным = "Объект.РеквизитБулево";

Числовое поле + список выбора

Числовое поле
// Простое поле
ПолеЧисло1 = Элементы.Добавить("ПолеЧисло1", Тип("ПолеФормы"), ЭтаФорма);
ПолеЧисло1.Вид = ВидПоляФормы.ПолеВвода;
ПолеЧисло1.ПутьКДанным = "Объект.РеквизитЧисло";
ПолеЧисло1.КнопкаРегулирования = Истина;

// Прогресс-бар
ПолеЧисло2 = Элементы.Добавить("ПолеЧисло2", Тип("ПолеФормы"), ЭтаФорма);
ПолеЧисло2.Вид = ВидПоляФормы.ПолеИндикатора;
ПолеЧисло2.МинимальноеЗначение = 0;     // По умолчанию = 0
ПолеЧисло2.МаксимальноеЗначение = 50;   // По умолчанию = 100
ПолеЧисло2.ОтображатьПроценты = Истина;
ПолеЧисло2.ПутьКДанным = "Объект.РеквизитЧисло";

// Ползунок регулирования
ПолеЧисло3 = Элементы.Добавить("ПолеЧисло3", Тип("ПолеФормы"), ЭтаФорма);
ПолеЧисло3.Вид = ВидПоляФормы.ПолеПолосыРегулирования;
ПолеЧисло3.МинимальноеЗначение = 0;     // По умолчанию = 0
ПолеЧисло3.МаксимальноеЗначение = 50;   // По умолчанию = 100
ПолеЧисло3.Шаг = 2;                     // По умолчанию = 1
ПолеЧисло3.БольшойШаг = 10;             // По умолчанию = 10
ПолеЧисло3.ОтображениеРазметки = ОтображениеРазметкиПолосыРегулирования.СОбоихСторон;
ПолеЧисло3.ПутьКДанным = "Объект.РеквизитЧисло";
	
// Переключатель
ПолеЧисло4 = Элементы.Добавить("ПолеЧисло4", Тип("ПолеФормы"), ЭтаФорма);
ПолеЧисло4.Вид = ВидПоляФормы.ПолеПереключателя;
ПолеЧисло4.ПутьКДанным = "Объект.РеквизитЧисло";
ПолеЧисло4.СписокВыбора.Добавить(0, "Ноль");
ПолеЧисло4.СписокВыбора.Добавить(25, "Двадцать пять");
ПолеЧисло4.СписокВыбора.Добавить(75, "Семьдесят пять");
	
// Со списком выбора
ПолеЧисло5 = Элементы.Добавить("ПолеЧисло5", Тип("ПолеФормы"), ЭтаФорма);
ПолеЧисло5.Вид = ВидПоляФормы.ПолеВвода;
ПолеЧисло5.ПутьКДанным = "Объект.РеквизитЧисло";
ПолеЧисло5.РежимВыбораИзСписка = Истина;
ПолеЧисло5.СписокВыбора.Добавить(25, "25%");
ПолеЧисло5.СписокВыбора.Добавить(50, "50%");
ПолеЧисло5.СписокВыбора.Добавить(75, "75%");

Текстовое поле

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

// Многострочное поле
ПолеТекстМногострочное = Элементы.Добавить("ПолеТекстМногострочное", Тип("ПолеФормы"), ЭтаФорма);
ПолеТекстМногострочное.Вид = ВидПоляФормы.ПолеВвода;
ПолеТекстМногострочное.МногострочныйРежим = Истина;
ПолеТекстМногострочное.Высота = 3;
ПолеТекстМногострочное.ПутьКДанным = "Объект.РеквизитСтрока";
ПолеТекстМногострочное.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
ПолеТекстМногострочное.ЦветФона = Новый Цвет(200, 230, 230);

// Поле текстового документа
ПолеРедактированияТекста = Элементы.Добавить("ПолеРедактированияТекста", Тип("ПолеФормы"), ЭтаФорма);
ПолеРедактированияТекста.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
ПолеРедактированияТекста.Высота = 3;
ПолеРедактированияТекста.ПутьКДанным = "Объект.РеквизитСтрока";
ПолеРедактированияТекста.Шрифт = Новый Шрифт("JetBrainsMono Nerd Font");
ПолеРедактированияТекста.ЦветФона = Новый Цвет(20, 20, 20);
ПолеРедактированияТекста.ЦветТекста = Новый Цвет(230, 230, 230); 

Страницы + декорации

Страница1
Страница2
ГруппаСтраницы = Элементы.Добавить("ГруппаСтраницы", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаСтраницы.Вид = ВидГруппыФормы.Страницы;
	
Страница1 = Элементы.Добавить("Страница1", Тип("ГруппаФормы"), ГруппаСтраницы);
Страница1.Вид = ВидГруппыФормы.Страница;
Страница1.Заголовок = "Страница 1";

Страница2 = Элементы.Добавить("Страница2", Тип("ГруппаФормы"), ГруппаСтраницы);
Страница2.Вид = ВидГруппыФормы.Страница;
Страница2.Заголовок = "Страница 2";
Страница2.Картинка = БиблиотекаКартинок.Настройка;
	
Декорация1 = Элементы.Добавить("Декорация1", Тип("ДекорацияФормы"), Страница1);
Декорация1.Вид = ВидДекорацииФормы.Надпись;
Декорация1.Заголовок = "Мы учимся на своих ошибках и потом от этих ошибок лечимся.";
Декорация1.Шрифт = Новый Шрифт("JetBrainsMono Nerd Font", 16, Истина);
Декорация1.ЦветТекста = Новый Цвет(0, 0, 200);

Декорация2 = Элементы.Добавить("Декорация2", Тип("ДекорацияФормы"), Страница2);
Декорация2.Вид = ВидДекорацииФормы.Картинка;
Декорация2.Картинка = БиблиотекаКартинок.ОформлениеФлагКрасный;
Декорация2.РазмерКартинки = РазмерКартинки.Растянуть;
Декорация2.Ширина = 4;
Декорация2.Высота = 2;

Таблица формы

Таблица формы
ТаблицаФормы = Элементы.Добавить("ТаблицаФормы", Тип("ТаблицаФормы"), ЭтаФорма);
ТаблицаФормы.ПутьКДанным = "Объект.ТЧ";
	
ТЧ_Число = Элементы.Добавить("ТЧ_Число", Тип("ПолеФормы"), ТаблицаФормы);
ТЧ_Число.Вид = ВидПоляФормы.ПолеВвода;      
ТЧ_Число.ПутьКДанным = "Объект.ТЧ.РеквизитЧисло";
	
ТЧ_Ссылка = Элементы.Добавить("ТЧ_Ссылка", Тип("ПолеФормы"), ТаблицаФормы);
ТЧ_Ссылка.Вид = ВидПоляФормы.ПолеВвода;      
ТЧ_Ссылка.ПутьКДанным = "Объект.ТЧ.РеквизитСсылка";

Установка событий элементов формы

События
Поле2 = Элементы.Добавить("Поле2", Тип("ПолеФормы"), ЭтаФорма);
Поле2.Вид = ВидПоляФормы.ПолеВвода;      
Поле2.ПутьКДанным = "Объект.РеквизитЧисло";
Поле2.УстановитьДействие("ПриИзменении", "ПроверитьЧислоПриИзменении");	

И не забыть написать обработчик события:

&НаКлиенте
Процедура ПроверитьЧислоПриИзменении(Элемент)
        
    Если Объект.РеквизитЧисло < 100 Тогда
        Сообщить("Мало половин!");
    КонецЕсли;
    
КонецПроцедуры

Таблица с картинками

Этот пример взят из реального проекта:

Таблица с картинками
&НаСервере
Процедура АШ_ПрограммноеСозданиеЭлементовФормы()	
    
    АШ_Сут = Элементы.Добавить("АШ_Сут", Тип("ПолеФормы"), Элементы.Список);
    АШ_Сут.Вид = ВидПоляФормы.ПолеКартинки;
    АШ_Сут.КартинкаЗначений = БиблиотекаКартинок.КоллекцияСостоянияВыгрузки;
    АШ_Сут.ПутьКДанным = "Список.СтатусОплатыСуточных";
    АШ_Сут.Заголовок = "Сут.";
	
КонецПроцедуры

Кнопка обычная

Кнопка обычная
Кнопка1 = ЭтаФорма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), ЭтаФорма);
Кнопка1.ИмяКоманды = "Команда1";

Кнопка1г = ЭтаФорма.Элементы.Добавить("Кнопка1г", Тип("КнопкаФормы"), ЭтаФорма);
Кнопка1г.ИмяКоманды = "Команда1";
Кнопка1г.Вид = ВидКнопкиФормы.Гиперссылка;

Картинка кнопки и способ отображения кнопки задаются в настройках команды, которую тоже можно создать программно.

Кнопка в меню формы

Кнопка в меню формы
Кнопка2 = ЭтаФорма.Элементы.Добавить("Кнопка2", Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель);
Кнопка2.ИмяКоманды = "Команда2";

Кнопка2г = ЭтаФорма.Элементы.Добавить("Кнопка2г", Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель);
Кнопка2г.ИмяКоманды = "Команда2";
Кнопка2г.Вид = ВидКнопкиФормы.Гиперссылка;

Кнопка в меню таблицы

Кнопка в меню таблицы
Кнопка3 = ЭтаФорма.Элементы.Добавить("Кнопка3", Тип("КнопкаФормы"), ТаблицаФормы.КоманднаяПанель);
Кнопка3.ИмяКоманды = "Команда3";

Выпадающее подменю

Выпадающее подменю
Подменю = Элементы.Добавить("Подменю", Тип("ГруппаФормы"), ЭтаФорма.КоманднаяПанель);
Подменю.Вид = ВидГруппыФормы.Подменю;
Подменю.Заголовок = "ПОДМЕНЮ";
Подменю.Картинка = БиблиотекаКартинок.Настройка;
    
ГруппаКнопок1 = Элементы.Добавить("ГруппаКнопок1", Тип("ГруппаФормы"), Подменю);
ГруппаКнопок1.Вид = ВидГруппыФормы.ГруппаКнопок;

ГруппаКнопок2 = Элементы.Добавить("ГруппаКнопок2", Тип("ГруппаФормы"), Подменю);
ГруппаКнопок2.Вид = ВидГруппыФормы.ГруппаКнопок;
    
Кнопка1п = ЭтаФорма.Элементы.Добавить("Кнопка1п", Тип("КнопкаФормы"), ГруппаКнопок1);
Кнопка1п.ИмяКоманды = "Команда1";

Кнопка2п = ЭтаФорма.Элементы.Добавить("Кнопка2п", Тип("КнопкаФормы"), ГруппаКнопок1);
Кнопка2п.ИмяКоманды = "Команда2";

Кнопка3п = ЭтаФорма.Элементы.Добавить("Кнопка3п", Тип("КнопкаФормы"), ГруппаКнопок2);
Кнопка3п.ИмяКоманды = "Команда3";

Поле с множественным выбором

Поле с множественным выбором

Для такого поля нужен реквизит формы с типом СписокЗначений, в данном примере он называется "Организации" и имеет тип значения "СправочникиСсылка.Организации". Такой реквизит можно создать программно.

МножественныйВыбор = Элементы.Добавить("МножественныйВыбор", Тип("ПолеФормы"), ЭтаФорма);
МножественныйВыбор.Вид = ВидПоляФормы.ПолеВвода;
МножественныйВыбор.ПутьКДанным = "Организации";
МножественныйВыбор.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
МножественныйВыбор.Высота = 3;

Связанные публикации

Программное создание реквизитов управляемой формы 1С

Программное создание команд в управляемой форме 1С