3 универсальные функции программного управления формой
Стас ГаниевВ последнее время всё чаще приходится работать с формами, делая что-то с ними из кода (привет расширениям!). Всё это я упаковываю в подключаемое расширение Простые алгоритмы, и скоро выйдет его новая версия. А пока хочу поделиться тремя алгоритмами, которые, на мой взгляд, являются "китами" инструментария разработчика интерфейсов.
1 Добавление команды формы
Чтобы предоставить пользователю возможность что-то сделать нажатием кнопки, нужна команда формы:

Процедура ДобавитьКомандуФормы(ЭтаФорма, ИмяКоманды, Действие, Заголовок, ДополнительныеСвойства = Неопределено) Экспорт Команда = ЭтаФорма.Команды.Добавить(ИмяКоманды); Команда.Действие = Действие; Команда.Заголовок = Заголовок; Если ДополнительныеСвойства <> Неопределено Тогда ЗаполнитьЗначенияСвойств(Команда, ДополнительныеСвойства); КонецЕсли; КонецПроцедуры
Среди дополнительных свойств наиболее часто используются Картинка, Отображение и Подсказка. При желании можно их добавить в формальные параметры процедуры, чтобы точно не забыть.
2 Добавление реквизита формы
Эти товарищи нам нужны для отображения дополнительной информации на форме, либо хранения переменных в контекстве формы.

Процедура ДобавитьРеквизитФормы(ЭтаФорма, ИмяРеквизита, ТипРеквизита, Путь = "", Заголовок = "", ДополнительныеСвойства = Неопределено, СохраняемыеДанные = Ложь) Экспорт РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, Заголовок, СохраняемыеДанные); ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(РеквизитФормы); ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); Если ДополнительныеСвойства <> Неопределено Тогда РеквизитФормы = ЭтаФорма[ИмяРеквизита]; ЗаполнитьЗначенияСвойств(РеквизитФормы, ДополнительныеСвойства); КонецЕсли; КонецПроцедуры
Данный вариант предусматривает добавление одного реквизита формы, однако массив ДобавляемыеРеквизиты может содержать и больше одного значения, для обработки за один раз.
3 Добавление элемента диалога
Как же без них родимых? Из этого же и состоят формы :)
Элеметны бывают разных типов, и для каждого есть свои нюансы при программном добавлении. Так, свойство Вид нужно установить в первую очередь, поскольку только после этого доступна установка других свойств элемента, специфичных для конкретного вида.
В коде ниже в отдельном условии собраны необходимые свойства по типам элемента, а в комментариях указаны их типы (извините за тафтологию). Другой вариант реализации - создать для каждого типа элемента отдельную функцию, с выводом требуемых свойств в формальные параметры.
Функция ДобавитьЭлементДиалогаФормы(Элементы, Имя, ТипЭлемента, ГруппаРодитель, ПередЭлементом, ДопСвойства = Неопределено) Экспорт
Если ПередЭлементом = Неопределено Тогда
Элемент = Элементы.Добавить(Имя, ТипЭлемента, ГруппаРодитель);
Иначе
Элемент = Элементы.Вставить(Имя, ТипЭлемента, ГруппаРодитель, ПередЭлементом);
КонецЕсли;
Если ТипЭлемента = Тип("ГруппаФормы") Тогда
Элемент.Вид = ДопСвойства.Вид; // ВидГруппыФормы
Элемент.Группировка = ДопСвойства.Группировка; // ГруппировкаПодчиненныхЭлементовФормы
ИначеЕсли ТипЭлемента = Тип("ПолеФормы") Тогда
Элемент.Вид = ДопСвойства.Вид; // ВидПоляФормы
Элемент.ПутьКДанным = ДопСвойства.ПутьКДанным; // Строка
ИначеЕсли ТипЭлемента = Тип("КнопкаФормы") Тогда
Элемент.Вид = ДопСвойства.Вид; // ВидКнопкиФормы
Элемент.ИмяКоманды = ДопСвойства.ИмяКоманды; // Строка
ИначеЕсли ТипЭлемента = Тип("ДекорацияФормы") Тогда
Элемент.Вид = ДопСвойства.Вид; // ВидДекорацииФормы
ИначеЕсли ТипЭлемента = Тип("ТаблицаФормы") Тогда
Элемент.ПутьКДанным = ДопСвойства.ПутьКДанным; // Строка
КонецЕсли;
Если ДопСвойства <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Элемент, ДопСвойства);
КонецЕсли;
Возврат Элемент;
КонецФункции