При динамическом создании элементов интерфейса в обычных формах 1С разработчики часто сталкиваются с ситуацией, когда добавленный элемент управления (например, кнопка) не встает на нужное место либо начинает вести себя непредсказуемо при изменении пользователем размеров окна: налезает на соседние поля, растягивается во весь экран или улетает за пределы видимости. Разберем, как устроен механизм привязок в 1С, почему важен строгий порядок выполнения команд и как написать надежный программный код для позиционирования элементов.
Проанализируем базовую механику работы интерфейса обычной формы. Положение и поведение любого элемента определяются двумя составляющими:
Верх, Лево, Высота и Ширина задают физическое местоположение и размер элемента на форме в текущий момент времени.УстановитьПривязку() указывает платформе, как должны двигаться границы элемента при изменении размеров формы или родительской панели.Критически важная особенность: метод УстановитьПривязку() в момент своего вызова считывает текущие координаты элемента и целевого объекта, вычисляя и фиксируя между ними постоянное смещение (дельту). Если попытаться сначала вызвать УстановитьПривязку(), а затем изменить свойства Верх или Лево, платформа пересчитает внутренние отступы некорректно. Именно поэтому координаты необходимо жестко определять до настройки привязок.
Рассмотрим по шагам правильный алгоритм создания кнопки и внедрения ее в структуру формы:
ЭлементыФормы.Добавить() с указанием типа создаваемого объекта, его имени и родительского контейнера.Верх, Лево, Ширина и Высота.УстановитьДействие().УстановитьПривязку() для нужных сторон элемента управления.Посмотрим на готовый пример добавления кнопки на панель с привязкой к существующим элементам формы:
// 1. Создаем кнопку на панели формы
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), "Взвесить", Истина, ЭлементыФормы.ОсновнаяПанель);
// 2. Обязательно задаем начальные геометрические координаты ДО вызова привязок
НоваяКнопка.Верх = 280;
НоваяКнопка.Лево = 20;
НоваяКнопка.Высота = 30;
НоваяКнопка.Ширина = 100;
// 3. Задаем параметры оформления и логику кнопки
НоваяКнопка.Заголовок = "Взвесить";
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Попытка
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("ДействияФормыДействиеВзвесить"));
Исключение
// Обработка возможного отсутствия экспортной процедуры в модуле формы
КонецПопытки;
// 4. Устанавливаем правила поведения границ при изменении размера окна
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Товары, ГраницаЭлементаУправления.Низ);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Верх);
Разберем логику выбора границ в методе УстановитьПривязку():
ГраницаЭлементаУправления.Лево и ГраницаЭлементаУправления.Право к границе ГраницаЭлементаУправления.Лево соседнего элемента заставит кнопку следовать за ним, строго сохраняя заданную ширину.УстановитьПривязку(ГраницаЭлементаУправления.<ИмяГраницы>) без передачи второго и третьего параметров.Выясним причины распространенных сбоев при программном размещении элементов:
ОсновнаяПанель или внутри страницы панели, его разрешено привязывать только к элементам, находящимся на той же самой странице той же панели, либо к границам самой панели. Привязка к элементам из других вкладок или верхнего уровня формы приведет к некорректному поведению.Проанализируем ситуации, когда сложной программной настройки привязок можно избежать:
Видимость = Ложь. В программном коде останется только включить видимость по условию: ЭлементыФормы.Взвесить.Видимость = Истина;. Это исключает погрешности ручного позиционирования.КоманднаяПанель формы или таблицы. В этом случае платформа берет автоматический расчет координат, переноса и отступов кнопок на себя.