При разработке в обычном интерфейсе 1С:Предприятие 8 программисты нередко сталкиваются с необходимостью динамического создания элементов управления. В отличие от управляемых форм, где компоновка элементов во многом автоматизирована, на обычных формах разработчик полностью управляет геометрией и позиционированием каждого контрола. Разберем по шагам, как правильно добавить кнопку на обычную форму, задать ее размеры, настроить координаты и связать событие нажатия с процедурой-обработчиком.
Рассмотрим типовую ситуацию: разработчик создает элемент через коллекцию ЭлементыФормы, устанавливает заголовок, свойство Видимость равно Истина, однако на форме кнопка визуально отсутствует.
Выясним причину такого поведения. По умолчанию при программном вызове метода ЭлементыФормы.Добавить() элемент создается в верхнем левом углу с координатами (0, 0) и имеет нулевые геометрические размеры — свойства Ширина и Высота равны нулю. Из-за нулевого размера кнопка физически существует на форме, но остается невидимой для пользователя.
Чтобы кнопка отобразилась, необходимо обязательно задать ее физические размеры и расположение на форме:
Высота.Ширина.Лево и Верх.Для того чтобы кнопка реагировала на действия пользователя, необходимо связать ее событие с процедурой модуля формы. Для этого проанализируем работу метода УстановитьДействие() и объекта Действие.
Событие кнопки при клике называется Нажатие. Создадим связь между кнопкой и процедурой следующим образом:
ДействиеПоКоманде = Новый Действие("ВыполнитьКоманду");
КнопкаКоманды.УстановитьДействие("Нажатие", ДействиеПоКоманде);
Важные требования к процедуре-обработчику:
Действие нельзя (необходимо создать процедуру-обертку в форме, которая уже вызывает общий модуль).Нажатие процедура обязана принимать один входной параметр — ссылку на сам элемент управления:
Процедура ВыполнитьКоманду(Элемент)
// Код обработки нажатия кнопки
Предупреждение("Команда успешно выполнена!");
КонецПроцедуры
Разберем частую ошибку: попытку выстроить элементы в ряд исключительно с помощью метода УстановитьПривязку(). Метод УстановитьПривязку() управляет только поведением границ элемента при изменении пользователем размеров самого окна формы. Он не производит первоначальный расчет координат.
Если не задать координаты Лево и Верх, все новые кнопки наложатся друг на друга в точке с координатами (0, 0). Поэтому начальные координаты необходимо вычислять в коде явно, добавляя отступы между соседними элементами.
Посмотрим на пример правильного создания двух соседних кнопок с динамическим расчетом отступов и настройкой привязок:
// Создаем обработчик
ДействиеПоКоманде = Новый Действие("ВыполнитьКоманду");
Отступ = 5;
ТекущийЛево = 10;
ТекущийВерх = 10;
// Создаем первую кнопку
Кнопка1 = ЭлементыФормы.Добавить(Тип("Кнопка"), "КнопкаЗакрыть", Истина);
Кнопка1.Заголовок = "Закрыть";
Кнопка1.УстановитьДействие("Нажатие", ДействиеПоКоманде);
Кнопка1.Лево = ТекущийЛево;
Кнопка1.Верх = ТекущийВерх;
Кнопка1.Высота = 25;
Кнопка1.Ширина = 80;
// Рассчитываем координаты для следующей кнопки
ТекущийЛево = Кнопка1.Лево + Кнопка1.Ширина + Отступ;
// Создаем вторую кнопку рядом с первой
Кнопка2 = ЭлементыФормы.Добавить(Тип("Кнопка"), "КнопкаЗаписатьИЗакрыть", Истина);
Кнопка2.Заголовок = "Записать и закрыть";
Кнопка2.УстановитьДействие("Нажатие", ДействиеПоКоманде);
Кнопка2.Лево = ТекущийЛево;
Кнопка2.Верх = ТекущийВерх;
Кнопка2.Высота = 25;
Кнопка2.Ширина = 140;
// Настраиваем привязку, чтобы при изменении размеров формы кнопка следовала за первой
Кнопка2.УстановитьПривязку(ГраницаЭлементаУправления.Лево, Кнопка1, ГраницаЭлементаУправления.Право);
Если кнопку требуется добавить не на свободную плоскость формы, а на конкретную страницу объекта Панель или в ТабличноеПоле, используем четвертый параметр метода Добавить():
// Добавление кнопки на конкретную панель
РодительскийЭлемент = ЭлементыФормы.ОсновнаяПанель;
КнопкаНаПанели = ЭлементыФормы.Добавить(Тип("Кнопка"), "КнопкаНаПанели", Истина, РодительскийЭлемент);
КнопкаНаПанели.Заголовок = "Панельная кнопка";
КнопкаНаПанели.Высота = 25;
КнопкаНаПанели.Ширина = 100;
КнопкаНаПанели.Лево = 10;
КнопкаНаПанели.Верх = 10;
При передаче родительского элемента координаты Лево и Верх начинают отсчитываться относительно левого верхнего угла этого родительского контейнера, а не формы целиком.
Если задача состоит в добавлении стандартной командной кнопки, удобнее воспользоваться объектом КоманднаяПанель. В таком случае отпадает необходимость вручную вычислять пиксельные координаты, ширину и настраивать привязки — кнопки выстраиваются платформой автоматически с учетом системных стилей интерфейса.
Рассмотрим добавление кнопки в существующую командную панель:
ДействиеКоманды = Новый Действие("ВыполнитьКоманду");
КнопкаКП = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Добавить(
"КнопкаКП_Выполнить",
ТипКнопкиКоманднойПанели.Действие,
"Выполнить",
ДействиеКоманды
);
Если генерация интерфейса происходит в обработчиках открытия формы или при динамическом переключении режимов работы, важно проверять наличие элемента перед созданием, чтобы избежать ошибки попытки создания дубликата:
ИмяКнопки = "КнопкаЗакрыть";
ЭлементСуществует = ЭлементыФормы.Найти(ИмяКнопки);
Если ЭлементСуществует = Неопределено Тогда
Кнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ИмяКнопки, Истина);
// Настройка свойств элемента
Иначе
// Если кнопка уже есть, можно обновить ее свойства или удалить
// ЭлементыФормы.Удалить(ЭлементСуществует);
КонецЕсли;