Добрый день, Коллеги!
Предлагаю вашему вниманию шпаргалку, шаблоны кода для применения в разработке динамического интерфейса – программное формирование элементов управляемой формы. Особенно будет полезно начинающим разработчикам.
Применение
Есть определенные ситуации, когда без программного формирования элементов формы не обойтись:
- Заранее неизвестно какое количество элементов необходимо разместить на форме (Примеры: Система тестирования, где при формирование тестового задания заранее неизвестно сколько будет вопросов или документ корректировки регистров, когда так же заранее не известно какие колонки будут у таблицы формы).
- Доработка типового функционала. Программное размещение элементов впоследствии упрощает обновление типовых конфигураций. Многие разработчики даже придерживаются данного правила при работе с «расширениями».
Шпаргалка
Оглавление
Группа – Тип("ГруппаФормы"). 2
Декорация – Тип("ДекорацияФормы"). 3
Кнопка – Тип("КнопкаФормы"). 3
Бонус – общий модуль с готовыми функциями. 4
Введение
В публикации будет разработан пример создания интерфейса с задействованием практически всех популярных элементов формы. Одно из исключений — таблица, вариант программного создания таблицы описывал ранее — программное создание динамического списка. Ниже пример интерфейса, который будет разобран (тестировалось на платформе 8.3.15.1534):
Общее
Создание элементов, реквизитов и команд лучше производить в процедуре «ПриСозданииНаСервере».
Есть два варианта размещения элементов на форме – «добавить» и «вставить».
ЭтаФорма.Элементы.Добавить([Название нового элемента], [Тип элемента], [Элемент-родитель]) – Элемент будет добавлен на размещаемый элемент-родитель в конец списка.
ЭтаФорма.Элементы.Вставить([Название нового элемента], [Тип элемента], [Элемент-родитель], [Последующий элемент]) – Элемент будет добавлен на размещаемый элемент-родитель и вставлен перед желаемым элементом.
После создания элемента, мы можем определить ему свойства. Свойства практически всегда совпадают с названиями на панели свойств элемента.
Группа – Тип("ГруппаФормы")
Элементы формы, которые можно создать с типом «ГруппаФормы»:
- ГруппаКнопок
- ГруппаКолонок
- КоманднаяПанель
- КонтекстноеМеню
- ОбычнаяГруппа
- Подменю
- Страницы
- Страница
Пример создания элементов типа "ГруппаФормы"
//Группы
//Пример создания обычной группы без отображения
ГруппаДатаНомер = ЭтаФорма.Элементы.Добавить("ГруппаОбычная", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаДатаНомер.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДатаНомер.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДатаНомер.ОтображатьЗаголовок = ЛОЖЬ;
ГруппаДатаНомер.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
//Пример создания обычной группы
ГруппаШапка = ЭтаФорма.Элементы.Добавить("ГруппаШапка", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаШапка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаШапка.Заголовок = "Основные реквизиты";
ГруппаШапка.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение;
ГруппаШапка.ОтображатьЗаголовок = ИСТИНА;
ГруппаШапка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ГруппаШапка.РастягиватьПоГоризонтали = ИСТИНА;
//Пример создания группы страниц
ГруппаСтраниц = ЭтаФорма.Элементы.Добавить("ГруппаСтраницы", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаСтраниц.Вид = ВидГруппыФормы.Страницы;
ГруппаСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
ГруппаСтраниц.РастягиватьПоГоризонтали = ИСТИНА;
//Пример создания страниц
СтраницаТовары = ЭтаФорма.Элементы.Добавить("СтраницаТовары", Тип("ГруппаФормы"),ГруппаСтраниц);
СтраницаТовары.Вид = ВидГруппыФормы.Страница;
СтраницаТовары.Заголовок = "Товары";
СтраницаДополнительно = ЭтаФорма.Элементы.Добавить("СтраницаДополнительно", Тип("ГруппаФормы"),ГруппаСтраниц);
СтраницаДополнительно.Вид = ВидГруппыФормы.Страница;
СтраницаДополнительно.Заголовок = "Дополнительно";
Поле – Тип("ПолеФормы")
Для работы элемента формы «Поле» необходимо наличие источника данных – реквизита. Если необходимого реквизита нет, его нужно предварительно создать.
Элементы формы, которые можно создать с типом «ПолеФормы»:
- ПолеHTMLДокумента
- ПолеВвода
- ПолеГеографическойСхемы
- ПолеГрафическойСхемы
- ПолеДендрограммы
- ПолеДиаграммы
- ПолеДиаграммыГанта
- ПолеИндикатор
- ПолеКалендарь
- ПолеКартинки
- ПолеНадписи
- ПолеПереключателя
- ПолеПланировщика
- ПолеПолосыРегулирования
- ПолеТабличногоДокумента
- ПолеТекстовогоДокумента
- ПолеФлажок
- ПолеФорматированногоДокумента
Создаем реквизит
При создании важно понимать, что указывается не "тип", а "описание типов" и для часто используемых типов: "строка", "число" и "дата", необходимо указывать квалификатор. Рассмотрим на примере ниже.
Пример создания реквизитов
//Создание реквизитов
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
НовыйРеквизит = Новый РеквизитФормы("Комментарий",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(500)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Номер",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Дата",Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Наименование",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("ПометкаУдаления",Новый ОписаниеТипов("Булево"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
Создаем Поле
При создании поля указываем тип «ПолеФормы», принцип мало чем отличается от создания группы:
Пример создания полей
//Создание полей
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Номер", Тип("ПолеФормы"),ГруппаДатаНомер);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Номер";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Дата", Тип("ПолеФормы"),ГруппаДатаНомер);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дата";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Наименование", Тип("ПолеФормы"),ГруппаШапка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Наименование";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Комментарий", Тип("ПолеФормы"),СтраницаДополнительно);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Комментарий";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ПометкаУдаления", Тип("ПолеФормы"),СтраницаДополнительно);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПутьКДанным = "ПометкаУдаления";
Декорация – Тип("ДекорацияФормы")
Обе существующие декорации имеют один тип, но разный вид.
Декорация «Надпись»
Пример создания декорации надпись
//Декорация надпись
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ЗаголовокТовара", Тип("ДекорацияФормы"),СтраницаТовары);
НовыйЭлемент.Вид = ВидДекорацииФормы.Надпись;
НовыйЭлемент.Заголовок = "Глобус";
Декорация «Картинка»
Пример создания декорации картинка
//Декорация картинка
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("КартинкаТовара", Тип("ДекорацияФормы"),СтраницаТовары);
НовыйЭлемент.Вид = ВидДекорацииФормы.Картинка;
НовыйЭлемент.Картинка = БиблиотекаКартинок.ГеографическаяСхема;
НовыйЭлемент.РазмерКартинки = РазмерКартинки.Растянуть;
НовыйЭлемент.Ширина = 20;
НовыйЭлемент.Высота = 8;
Кнопка – Тип("КнопкаФормы")
Для работы кнопок, необходимо наличие команды. Если на форме нет определенной команды, то её необходимо создать программно.
Создание команды
Важно, для работы команды должно быть определено действие. Действие — это основная процедура команды, программно его создать не получится.
Пример заранее описанного общего действия для всех команд
&НаКлиенте
Процедура ОбщееДействие(Команда)
ШифрКоманды = ПолучитьШифрКоманды(ТекущийЭлемент.Имя);
Если ШифрКоманды = 1 Тогда
Сообщить("Привет, мир!");
ИначеЕсли ШифрКоманды = 2 Тогда
Сообщить(Строка(ЭтотОбъект.Номер + ЭтотОбъект.Номер));
ИначеЕсли ШифрКоманды = 3 Тогда
Сообщить(Формат(ТекущаяДата(),"ДЛФ=DDT"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьШифрКоманды(ИмяКнопки)
Возврат Число(СтрЗаменить(ИмяКнопки,"Кнопка",""));
КонецФункции
Пример создания команды
//Создание команды
НоваяКоманда = ЭтаФорма.Команды.Добавить("ОбщаяКоманда");
НоваяКоманда.Заголовок = "Общая команда";
НоваяКоманда.Действие = "ОбщееДействие"; //указываем только имя процедуры
Создание кнопок
Пример создания кнопок
//Создание кнопок
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"),СтраницаТовары);
НовыйЭлемент.Заголовок = "Привет мир!";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка2", Тип("КнопкаФормы"),СтраницаДополнительно);
НовыйЭлемент.Заголовок = "Сложить номер";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка3", Тип("КнопкаФормы"),СтраницаДополнительно);
НовыйЭлемент.Заголовок = "Текущее время";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
Бонус – общий модуль с готовыми функциями
«Лень — двигатель прогресса» и костылей J
Я пошел дальше, создал общий модуль, где описал создание всех выше описанных элементов формы. Поэтому предлагаю вам с ним познакомиться. Для этого создайте новый модуль:
И скопируйте в него код:
Код общего модуля
///////////////////////////////////////////////////////////////////////////////////
//Модуль - Программное создание элементов формы
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
//Создание описание типов
&НаСервере
Функция ОписаниеТипаСтрока(ДлинаСтроки = 0) Экспорт
Возврат Новый ОписаниеТипов("Строка",,кСтрока(ДлинаСтроки));
КонецФункции
&НаСервере
Функция ОписаниеТипаЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
Возврат Новый ОписаниеТипов("Число",кЧисло(ДлинаЧисла,ТочностьЧисла));
КонецФункции
//ДатаВремя - строка, значения "Дата", "Время", "ДатаВремя"
&НаСервере
Функция ОписаниеТипаДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
Возврат Новый ОписаниеТипов("Дата",,,кДатаВремя(ДатаВремя));
КонецФункции
///////////////////////////////////////////////////////////////////////////////////
//Создание квалификаторов
&НаСервере
Функция кСтрока(ДлинаСтроки = 0) Экспорт
Возврат Новый КвалификаторыСтроки(ДлинаСтроки);
КонецФункции
&НаСервере
Функция кЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
Возврат Новый КвалификаторыЧисла(ДлинаЧисла,ТочностьЧисла);
КонецФункции
//ДатаВремя - строка, значения "Дата", "Время", "ДатаВремя"
&НаСервере
Функция кДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
Возврат Новый КвалификаторыДаты(ЧастиДаты[ДатаВремя]);
КонецФункции
///////////////////////////////////////////////////////////////////////////////////
//Создание реквизитов
//Если требуется создать один реквизит
&НаСервере
Процедура СоздатьРеквизит(ИмяРеквизита,ОписаниеТипа,ТекущаяФорма) Экспорт
структураРеквизитов = Новый Структура;
структураРеквизитов.Вставить(ИмяРеквизита,ОписаниеТипа);
СоздатьРеквизиты(структураРеквизитов,ТекущаяФорма);
КонецПроцедуры
//Если требуется создать несколько реквизитов
&НаСервере
Процедура СоздатьРеквизиты(структураРеквизитов,ТекущаяФорма) Экспорт
ДобавляемыеРеквизиты = Новый Массив;
Для Каждого тРеквизит Из структураРеквизитов Цикл
НовыйРеквизит = Новый РеквизитФормы(тРеквизит.Ключ,тРеквизит.Значение);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
КонецЦикла;
ТекущаяФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////
//Создание элементов
&НаСервере
Функция СоздатьОбычнуюГруппуБезОтображения(ЭтаФорма,
ИмяГруппы,
РодительГруппы,
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Перем ВидГруппы;
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
КонецЕсли;
НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;
НовыйЭлемент.ОтображатьЗаголовок = ЛОЖЬ;
Если ГруппировкаОбычнойГруппы = 1 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ИначеЕсли ГруппировкаОбычнойГруппы = 2 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ИначеЕсли ГруппировкаОбычнойГруппы = 3 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
КонецЕсли;
Если РастягиватьГоризонтально = 1 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;
ИначеЕсли РастягиватьГоризонтально = 2 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ЛОЖЬ;
КонецЕсли;
Если РастягиватьВертикально = 1 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ИСТИНА;
ИначеЕсли РастягиватьВертикально = 2 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ЛОЖЬ;
КонецЕсли;
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
&НаСервере
Функция СоздатьОбычнуюГруппу(ЭтаФорма,
ИмяГруппы,
РодительГруппы,
Заголовок = "",
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Перем ВидГруппы;
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
КонецЕсли;
НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение;
НовыйЭлемент.ОтображатьЗаголовок = ИСТИНА;
Если ГруппировкаОбычнойГруппы = 1 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ИначеЕсли ГруппировкаОбычнойГруппы = 2 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ИначеЕсли ГруппировкаОбычнойГруппы = 3 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
КонецЕсли;
Если РастягиватьГоризонтально = 1 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;
ИначеЕсли РастягиватьГоризонтально = 2 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ЛОЖЬ;
КонецЕсли;
Если РастягиватьВертикально = 1 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ИСТИНА;
ИначеЕсли РастягиватьВертикально = 2 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ЛОЖЬ;
КонецЕсли;
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
&НаСервере
Функция СоздатьГруппуСтраницы(ЭтаФорма,
ИмяГруппы,
РодительГруппы,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
ПриСменеСтраницы = "",
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Перем ВидГруппы;
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
КонецЕсли;
НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
Если РастягиватьГоризонтально = 1 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;
ИначеЕсли РастягиватьГоризонтально = 2 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ЛОЖЬ;
КонецЕсли;
Если РастягиватьВертикально = 1 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ИСТИНА;
ИначеЕсли РастягиватьВертикально = 2 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ЛОЖЬ;
КонецЕсли;
Если ПриСменеСтраницы <> "" Тогда НовыйЭлемент.ПриСменеСтраницы = ПриСменеСтраницы КонецЕсли;
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
&НаСервере
Функция СоздатьСтраницу(ЭтаФорма,
ИмяСтраницы,
ГруппаСтраницы,
Заголовок = "",
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
СтраницаПеред = Неопределено) Экспорт
Перем ВидГруппы;
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
Если СтраницаПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяСтраницы, Тип("ГруппаФормы"),ГруппаСтраницы);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяСтраницы, Тип("ГруппаФормы"),ГруппаСтраницы,СтраницаПеред);
КонецЕсли;
НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
Если ГруппировкаОбычнойГруппы = 1 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ИначеЕсли ГруппировкаОбычнойГруппы = 2 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ИначеЕсли ГруппировкаОбычнойГруппы = 3 Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
КонецЕсли;
Если РастягиватьГоризонтально = 1 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;
ИначеЕсли РастягиватьГоризонтально = 2 Тогда
НовыйЭлемент.РастягиватьПоГоризонтали = ЛОЖЬ;
КонецЕсли;
Если РастягиватьВертикально = 1 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ИСТИНА;
ИначеЕсли РастягиватьВертикально = 2 Тогда
НовыйЭлемент.РастягиватьПоВертикали = ЛОЖЬ;
КонецЕсли;
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
&НаСервере
Функция СоздатьГруппу(ЭтаФорма,
ИмяГруппы,
РодительГруппы,
СтруктураСвойств,
ЭлементПеред = Неопределено) Экспорт
Перем ВидГруппы;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяГруппы, Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
КонецЕсли;
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
//Общая функция создания элемента Поле
&НаСервере
Функция СоздатьПоле(ЭтаФорма,
ИмяПоля,
РодительПоля,
ШифрВидаПоля = 0,
ПутьКДанным = "",
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Перем ВидПоля;
Если ШифрВидаПоля <> 0 Тогда
НаборВидов = "ПолеВвода
|ПолеФлажка
|ПолеИндикатора
|ПолеПереключателя
|ПолеПериода
|ПолеHTMLДокумента";
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ШифрВидаПоля));
КонецЕсли;
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
Если СтруктураСобытий = Неопределено Тогда
СтруктураСобытий = Новый Структура;
КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяПоля, Тип("ПолеФормы"),РодительПоля);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяПоля, Тип("ПолеФормы"),РодительПоля,ЭлементПеред);
КонецЕсли;
Если ШифрВидаПоля <> 0 Тогда НовыйЭлемент.Вид = ВидПоляФормы[ВидПоля] КонецЕсли;
Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
Для Каждого Свойства Из СтруктураСвойств Цикл
НовыйЭлемент[Свойства.Ключ] = Свойства.Значение;
КонецЦикла;
Для Каждого События Из СтруктураСобытий Цикл
НовыйЭлемент.УстановитьДействие(События.Ключ,События.Значение);
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
//Быстрая функция по созданию декорации надпись
&НаСервере
Функция СоздатьДекорациюНадпись(ЭтаФорма,
ИмяДекорации,
РодительДекорации,
ЗаголовокДекорации,
РастягиватьПоГоризонтали = ИСТИНА,
ЭлементПеред = Неопределено) Экспорт
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"),РодительДекорации);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяДекорации, Тип("ДекорацияФормы"),РодительДекорации,ЭлементПеред);
КонецЕсли;
НовыйЭлемент.Заголовок = ЗаголовокДекорации;
НовыйЭлемент.РастягиватьПоГоризонтали = РастягиватьПоГоризонтали;
Возврат НовыйЭлемент;
КонецФункции
//Общая функция создания декорации с видом надпись и картинка
&НаСервере
Функция СоздатьДекорацию(ЭтаФорма,
ИмяДекорации,
РодительДекорации,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Если СтруктураСвойств = Неопределено Тогда СтруктураСвойств = Новый Структура; КонецЕсли;
Если СтруктураСобытий = Неопределено Тогда СтруктураСобытий = Новый Структура; КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"),РодительДекорации);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяДекорации, Тип("ДекорацияФормы"),РодительДекорации,ЭлементПеред);
КонецЕсли;
Для Каждого Свойства Из СтруктураСвойств Цикл
НовыйЭлемент[Свойства.Ключ] = Свойства.Значение;
КонецЦикла;
Для Каждого События Из СтруктураСобытий Цикл
НовыйЭлемент.УстановитьДействие(События.Ключ,События.Значение);
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
&НаСервере
Функция СоздатьКнопку(ЭтаФорма,
ИмяКнопки,
РодительКнопки,
ЗаголовокКнопки = "",
ИмяКоманды = "",
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
Если СтруктураСвойств = Неопределено Тогда СтруктураСвойств = Новый Структура; КонецЕсли;
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"),РодительКнопки);
Иначе
НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяКнопки, Тип("КнопкаФормы"),РодительКнопки,ЭлементПеред);
КонецЕсли;
Если ЗаголовокКнопки <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокКнопки; КонецЕсли;
Если ИмяКоманды <> "" Тогда НовыйЭлемент.ИмяКоманды = ИмяКоманды; КонецЕсли;
Для Каждого Свойства Из СтруктураСвойств Цикл
НовыйЭлемент[Свойства.Ключ] = Свойства.Значение;
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////
//Создание команды
&НаСервере
Процедура СоздатьКоманду(ЭтаФорма,ИмяКоманды,КомандаЗаголовок,КомандаДействия) Экспорт
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Заголовок = КомандаЗаголовок;
НоваяКоманда.Действие = КомандаДействия;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////
//Создание динамического списка
&НаСервере
Процедура СозданиеДинамическогоСписка(ЭтаФорма,
ИмяСписка = "Список", //тип строка - имя будущего списка на форме и реквизита
ТекстЗапроса = "", //тип строка - запрос, если он не указан, необходимо указать таблицу
МассивКолонок, //тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
// с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента",
// заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
СписокДействий = Неопределено, //типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействий = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
ТаблицаСписка = "", //тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваровУслуг"
ДобавитьВ = "", //тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
ВставитьПеред = "", //тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
СвояКоманднаяПанель = ЛОЖЬ, //тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будушего наполнения ИмяСписка+"КоманднаяПанель2"
ПараметрыЗапроса = Неопределено)//тип структура - содержит перечень параметров, если они используются в запросе.
//Защита от дурака
Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;
//Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
Если СвояКоманднаяПанель Тогда
Если ВставитьПеред = "" Тогда
ГруппаДинамическогоСписка = ЭтаФорма.Элементы.Добавить("Группа" + ИмяСписка
+ "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]));
Иначе
ГруппаДинамическогоСписка = ЭтаФорма.Элементы.Вставить("Группа" + ИмяСписка
+ "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
КонецЕсли;
ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
КоманднаяПанельСписка = ЭтаФорма.Элементы.Добавить(ИмяСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;
КонецЕсли;
//Создаем реквизит формы
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",ЛОЖЬ); //Имя реквизита
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
//Задаем свойства реквизиту
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
РеквизитДинамическийСписок = ЭтаФорма[ИмяСписка]; //Имя реквизита
Если ТекстЗапроса = "" Тогда
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ЛОЖЬ;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
Иначе
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;
КонецЕсли;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
Если ЛОЖЬ
ИЛИ ВставитьПеред = ""
ИЛИ СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
Тогда
ТаблицаФормы = ЭтаФорма.Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),
?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ])));
Иначе
ТаблицаФормы = ЭтаФорма.Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),
?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
КонецЕсли;
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Если своя панель тогда скрываем стандартную
Если СвояКоманднаяПанель Тогда
ЭтаФорма.Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
КонецЕсли;
//Создание колонок на основание МассивКолонок
Для Каждого Элемента Из МассивКолонок Цикл
ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
Иначе
Заголовок = "";
ИмяКолонки = ПараметрыКолонки;
КонецЕсли;
НоваяКолонкаТаблицы = ЭтаФорма.Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;
КонецЦикла;
//Задаем действия (События) на основание СписокДействий, если он определен
Если СписокДействий <> Неопределено Тогда
ПереченьСвойств = "ПриИзменении
|Выбор
|ПриАктивизацииСтроки
|ВыборЗначения
|ПриАктивизацииПоля
|ПриАктивизацииЯчейки
|ПередНачаломДобавления
|ПередНачаломИзменения
|ПередУдалением
|ПриНачалеРедактирования
|ПередОкончаниемРедактирования
|ПриОкончанииРедактирования
|ОбработкаВыбора
|ПередРазворачиванием
|ПередСворачиванием
|ПослеУдаления
|ПриСменеТекущегоРодителя
|ОбработкаЗаписиНового
|ПриСохраненииПользовательскихНастроекНаСервере
|ПередЗагрузкойПользовательскихНастроекНаСервере
|ПриЗагрузкеПользовательскихНастроекНаСервере
|ПриОбновленииСоставаПользовательскихНастроекНаСервере
|ОбработкаЗапросаОбновления
|ПриПолученииДанныхНаСервере
|НачалоПеретаскивания
|ПроверкаПеретаскивания
|ОкончаниеПеретаскивания
|Перетаскивание";
Для Счетчик = 1 по 28 Цикл
ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
ЭтаФорма.Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Удобно или нет — решать вам. Приведу лишь пример кода, созданного выше с помощью и без помощи общего модуля.
Пример реализации интерфейса без использования функций общего модуля
&НаСервере
Процедура ПрограмноеСозданиеЭлементовРеквизитовКоманд()
//Группы
//Пример создания обычной группы без отображения
ГруппаДатаНомер = ЭтаФорма.Элементы.Добавить("ГруппаОбычная", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаДатаНомер.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДатаНомер.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДатаНомер.ОтображатьЗаголовок = ЛОЖЬ;
ГруппаДатаНомер.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
//Пример создания обычной группы
ГруппаШапка = ЭтаФорма.Элементы.Добавить("ГруппаШапка", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаШапка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаШапка.Заголовок = "Основные реквизиты";
ГруппаШапка.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение;
ГруппаШапка.ОтображатьЗаголовок = ИСТИНА;
ГруппаШапка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ГруппаШапка.РастягиватьПоГоризонтали = ИСТИНА;
//Пример создания группы страниц
ГруппаСтраниц = ЭтаФорма.Элементы.Добавить("ГруппаСтраницы", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаСтраниц.Вид = ВидГруппыФормы.Страницы;
ГруппаСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
ГруппаСтраниц.РастягиватьПоГоризонтали = ИСТИНА;
//Пример создания страниц
СтраницаТовары = ЭтаФорма.Элементы.Добавить("СтраницаТовары", Тип("ГруппаФормы"),ГруппаСтраниц);
СтраницаТовары.Вид = ВидГруппыФормы.Страница;
СтраницаТовары.Заголовок = "Товары";
СтраницаДополнительно = ЭтаФорма.Элементы.Добавить("СтраницаДополнительно", Тип("ГруппаФормы"),ГруппаСтраниц);
СтраницаДополнительно.Вид = ВидГруппыФормы.Страница;
СтраницаДополнительно.Заголовок = "Дополнительно";
//Создание реквизитов
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
НовыйРеквизит = Новый РеквизитФормы("Комментарий",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(500)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Номер",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Дата",Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("Наименование",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
НовыйРеквизит = Новый РеквизитФормы("ПометкаУдаления",Новый ОписаниеТипов("Булево"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
//Создание полей
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Номер", Тип("ПолеФормы"),ГруппаДатаНомер);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Номер";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Дата", Тип("ПолеФормы"),ГруппаДатаНомер);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дата";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Наименование", Тип("ПолеФормы"),ГруппаШапка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Наименование";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Комментарий", Тип("ПолеФормы"),СтраницаДополнительно);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Комментарий";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ПометкаУдаления", Тип("ПолеФормы"),СтраницаДополнительно);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПутьКДанным = "ПометкаУдаления";
//Декорация надпись
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ЗаголовокТовара", Тип("ДекорацияФормы"),СтраницаТовары);
НовыйЭлемент.Вид = ВидДекорацииФормы.Надпись;
НовыйЭлемент.Заголовок = "Глобус";
//Декорация картинка
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("КартинкаТовара", Тип("ДекорацияФормы"),СтраницаТовары);
НовыйЭлемент.Вид = ВидДекорацииФормы.Картинка;
НовыйЭлемент.Картинка = БиблиотекаКартинок.ГеографическаяСхема;
НовыйЭлемент.РазмерКартинки = РазмерКартинки.Растянуть;
НовыйЭлемент.Ширина = 20;
НовыйЭлемент.Высота = 8;
//Создание команды
НоваяКоманда = ЭтаФорма.Команды.Добавить("ОбщаяКоманда");
НоваяКоманда.Заголовок = "Общая команда";
НоваяКоманда.Действие = "ОбщееДействие";
//Создание кнопок
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"),СтраницаТовары);
НовыйЭлемент.Заголовок = "Привет мир!";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка2", Тип("КнопкаФормы"),СтраницаДополнительно);
НовыйЭлемент.Заголовок = "Сложить номер";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("Кнопка3", Тип("КнопкаФормы"),СтраницаДополнительно);
НовыйЭлемент.Заголовок = "Текущее время";
НовыйЭлемент.ИмяКоманды = "ОбщаяКоманда";
КонецПроцедуры
Пример реализации интерфейса с использованием функций общего модуля
&НаСервере
Процедура СозданиеЭлементовФормыЧерезОбщийМодуль()
//Создание обычной группы без отображения
ГруппаДатаНомер = проЭлементы.СоздатьОбычнуюГруппуБезОтображения(ЭтаФорма,"ГруппаДатаНомер",ЭтаФорма,3);
//Создание обычной группы
ГруппаШапка = проЭлементы.СоздатьОбычнуюГруппу(ЭтаФорма,"ГруппаШапка",ЭтаФорма,"Основные реквизиты",1);
//Создание группы страниц
ГруппаСтраницы = проЭлементы.СоздатьГруппуСтраницы(ЭтаФорма,"ГруппаСтраницы",ЭтаФорма,1);
//Создание страниц
СтраницаТовары = проЭлементы.СоздатьСтраницу(ЭтаФорма,"СтраницаТовары",ГруппаСтраницы,"Товары");
СтраницаДополнительно = проЭлементы.СоздатьСтраницу(ЭтаФорма,"СтраницаДополнительно",ГруппаСтраницы,"Дополнительно");
//Пример создания одного реквизита
проЭлементы.СоздатьРеквизит("Комментарий",проЭлементы.ОписаниеТипаСтрока(200),ЭтаФорма);
//Пример создания нескольких реквизитов
структураРеквизитов = Новый Структура;
структураРеквизитов.Вставить("Номер",проЭлементы.ОписаниеТипаЧисло(10,0));
структураРеквизитов.Вставить("Дата",проЭлементы.ОписаниеТипаДатаВремя());
структураРеквизитов.Вставить("Наименование",проЭлементы.ОписаниеТипаСтрока(100));
структураРеквизитов.Вставить("ПометкаУдаления",Новый ОписаниеТипов("Булево"));
проЭлементы.СоздатьРеквизиты(структураРеквизитов,ЭтаФорма);
//Создание полей
проЭлементы.СоздатьПоле(ЭтаФорма,"Номер",ГруппаДатаНомер,1,"Номер");
проЭлементы.СоздатьПоле(ЭтаФорма,"Дата",ГруппаДатаНомер,1,"Дата");
СтруктураСвойства = Новый Структура;
СтруктураСвойства.Вставить("РастягиватьПоГоризонтали",ИСТИНА);
проЭлементы.СоздатьПоле(ЭтаФорма,"Наименование",ГруппаШапка,1,"Наименование",СтруктураСвойства);
проЭлементы.СоздатьПоле(ЭтаФорма,"Комментарий",СтраницаДополнительно,1,"Комментарий");
проЭлементы.СоздатьПоле(ЭтаФорма,"ПометкаУдаления",СтраницаДополнительно,2,"ПометкаУдаления");
//Создаем декорацию - отдельная функция для надписи
проЭлементы.СоздатьДекорациюНадпись(ЭтаФорма,"ЗаголовокТовара",СтраницаТовары,"Глобус");
//Создаем декорацию универсальной функцией, картинка
СтруктураСвойства = Новый Структура;
СтруктураСвойства.Вставить("Вид",ВидДекорацииФормы.Картинка);
СтруктураСвойства.Вставить("Картинка",БиблиотекаКартинок.ГеографическаяСхема);
СтруктураСвойства.Вставить("РазмерКартинки",РазмерКартинки.Растянуть);
СтруктураСвойства.Вставить("Ширина",20);
СтруктураСвойства.Вставить("Высота",8);
проЭлементы.СоздатьДекорацию(ЭтаФорма,"КартинкаТовара",СтраницаТовары,СтруктураСвойства);
//Создаем общую команду
проЭлементы.СоздатьКоманду(ЭтаФорма,"ОбщаяКоманда","Общая команда","ОбщееДействие");
//Создание кнопок
проЭлементы.СоздатьКнопку(ЭтаФорма,"Кнопка1",СтраницаТовары,"Привет мир!","ОбщаяКоманда");
проЭлементы.СоздатьКнопку(ЭтаФорма,"Кнопка2",СтраницаДополнительно,"Сложить номер","ОбщаяКоманда");
проЭлементы.СоздатьКнопку(ЭтаФорма,"Кнопка3",СтраницаДополнительно,"Текущее время","ОбщаяКоманда");
КонецПроцедуры
Всем удачного кодинга!
Другие полезные шпаргалки:
Публикации по работе с интерфейсом:
Related Posts
- Получение логина и пароля техподдержки 1С из базы
- Класс для вывода отчета в Excel
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
Каждый раз при необходимости создать программно элементы формы посещает мысль что надо бы сделать модуль, но все некогда и некогда. А у автора руки, таки, дошли. Полезно!
как шпаргалка неплохо для новичков
пара замечаний, ну куда ж без них
1. Напишите жирным шрифтом
синтаксис ЭтаФорма.Элементы.
использовать только если этот фрагмент кода расположена в методе с параметром
ЭтаФорма, например Функция СоздатьГруппуФормы(ЭтаФорма, ПараметрыГруппы)
если же этот фрагмент кода будет расположен в модуле формы, то достаточно
написать Элементы.
Когда будет копипастить код из этой шпаргалки, то всегда думайте чтобы НЕ рукоягодничить.
2. Практически все примеры представленного функционала можно найти в общих модулях типовых конфигураций и если вы изучите эту шпаргалку, то логичнее не
плодить еще тонну кода в типовой, а использовать аналоги оттуда.
пожалуй все остальное чики-пуки, больше замечаний нет.
Как раз занимался динамическим созданием, полезная инфа
В примере создания полей я бы поменял местами присваивание вида и пути к данным. Сначала устанавливаем путь к данным, потом вид поля формы. По крайней мере раньше при установке пути к данным вид автоматически устанавливался в поле надписи
(2)
Ну вы бы сказали куда смотреть хотя бы для старта.
(6) Ну т.е. как и большинство ваших комментов — вякнуть и всё.
(7) Большинство моих комментариев по существу, но прямолинейно — это неприятно многим.
А от вас пока лишь хамство.
В чем я не прав конкретно в комментарии в (2) или в (6) — разве это не по существу вопроса?
Спасибо, полезная вещь, добавил себе в «Избранное».
(2) этот код вызывается из общего модуля, по другому не получилось. Я знаю, что в модуле формы не обязательно писать ЭтаФорма. Я предлагаю не функции копипастить в модуль формы, а целиком модуль создать для этих целей. И при необходимости вызывать с модуля формы, функцию общего модуля.
Спасибо, полезный материал!
Сам хотел написать подобную статью, Вы меня опередили ))
Для расширений динамическое создание элементов форм — это уже почти стандарт.
Свойство ЭтаФорма объекта УправляемаяФорма удалено и поддерживается для совместимости.https://dl04.1c.ru/content/Platform/8_3_3_641/1cv8upd.htm
Как бы 6ть лет прошло. Пора уже вообще забыть «ЭтаФорма»
(7) А вы, товарисч, не ленитесь, время — оно денег стоит, а опыт по отыскиванию чего-либо в коде БСП и вовсе бесценен. А то вам мало что разжуй, так ещё и пищеварить, а как отказывают, так вы сразу хамите? Ну-ну.
(11) Вот и убивать надо за такой стандарт. Есть же нормальная возможность перегрузить форму своей собственной, нафига такие танцы с бубном? Чтоб ваши последователи тратили втрое больше времени, пытаясь а) спрогнозировать внешний вид, б) поменять, чтоб ничего не сдохло?
(12) хорошее замечание, проверю. Удаленно «условно» выходит 🙃
(14)Позволю себе с Вами не согласиться. Я сам сперва добавлял и изменял реквизиты в загруженной в расширение форме. Но потом перешел на программное создание именно для большей прозрачности и управляемости. Хотя, в целом, я сторонник использования расширений.
(15) Знаете, примерно так же со мной не соглашались, когда я говорил, что концепция «переопределяемых» модулей — это костыль. Мне говорили, ты что, это удобно, прогрессивно и прозрачно, дописал своё в типовой и обновлять легче! А потом появились расширения)
Так что, господа, попрыгаете на грабли программной доработки формы (особенно чужой и криво сделанной), поймёте. Лет через 5 вернёмся к этой теме)
(15)
Если сделана грамотная декомпозиция методов по созданию элементов, команд, реквизитов и обработчиков, то трудозатраты на доработку программно-генерируемого интерфейса формы лишь незначительно больше, чем на изучение и разработку в конструкторе.
(14) Программное создание отлично подходит для подключаемых механизмов, в виде API. Пример. Вы реализовали визуальный инструмент, который нужно подключить к нескольким формам. Вносить интерфейсные изменения во все формы — так себе решение. При каждом изменении внешнего вида и поведения необходимо будет вносить изменения во все экземпляры. Работа же через API — более логичное решение. Условно, при создании формы вызывается конструктор, который дополняет форму. И вся работа инструмента идет через 1-3 обработчика, которые используют единую логику, вынесенную в общий модуль.
Отличная работа, спасибо. Для полноты картины хотелось бы ещё увидеть сложные ЭУ: таблица формы, динамический список, командная панель, контекстное меню таблиц.
(12), это будет до тех пор, пока разработчики типовых сами не избавятся от этого. Так-то, да я сам всегда использую ЭтотОбъект вместо ЭтаФорма и другим рекомендую.
(21) Динамический список включен в код модуля в конце публикации, а писал я про него уже давненькоhttps://infostart.ru/public/728597/
Дима, спасибо за такой качественный контент.
(24) Пожалуйста, Жека 😉
(2) еще для передачи параметра в 8.3 не «ЭтаФорма», а «ЭтотОбъект».
https://its.1c.ru/db/metod8dev/content/5293/hdoc/_top/%D1%8D%D1%82%D0%B0%D1 %84%D0%BE%D1%80%D0%BC%D0%B0
(18) Ну, во-первых 5 лет еще как-то надо прожить, работать и зарабатывать, а не ждать непонятно чего.
А во вторых, кто на этих расширениях уже что называется «собаку съел» советуют новые элементы форм создавать в расширениях программно, что бы потом не было проблем с обновлениями.
(19) Только это уникально редко встречается.
Есть реквизит формы «Таблица значений». При выборе у колонки на форме «ПутьКДанным»
открывается форма «Выбор реквизита» в которой помимо реквизитов (колонки) есть еще реквизит Строка[0]
в которой тоже присутствуют колонки. Может кто то подсказать, как и для чего используется реквизит Сnрока[0]? или ссылку где можно почитать? Изображение прикреплено.
Спасибо заранее.
(29) Т.о. можно, например, реализовать два варианта интерфейса: полный (с таблицей) и упрощенный (реквизиты первой строки отображаются как обычные поля ввода). Такое встречается в типовых конфигурация, например УТ11, документ «Заявка на расходование денежных средств». Он содержит переключатель для расшифровки платежа «Без разбиения / Списком» (см. рис.)
P.S. Я немного слукавил. В УТ используется не первая строка таблицы, а текущая. Подход немного другой, но сути это не меняет.
(30)Спасибо большое за помощь.
Добавлю, что для логичной работы с общим моделем можно добавить ряд инициализированных структур, где перечислены, доступные параметры, например
поможет напомнить, что конкретно можно передать.
Спасибо от новичка в 8-ке
(32)Везде тупой не осмысленный код встречается, а не у только «1С-ников». Вы наверное ошиблись форумом.
(35) «неосмысленный» пишется слитно. Перед и после «наверное» нужны запятые.
(36)Вы точно ошиблись форумом.
Спасибо, думаю пригодится
Очень удобно использовать в общем модуле МодификацияКонфигурацииПереопределяемый — так можно вносить изменения в типовые формы практически не изменяя их модуль (только добавляя процедуры обработчиков событий)