При разработке в конфигурациях на базе обычных форм (например, 1С:Бухгалтерия предприятия 2.0) программисты часто сталкиваются с необходимостью динамического добавления элементов управления. Однако просто добавить элемент недостаточно: при изменении размеров окна формы элементы могут «наезжать» друг на друга или оставаться на месте, когда вся форма растягивается. Для решения этой задачи используется механизм программных привязок. Разберем подробно, как правильно настроить поведение элементов при изменении масштаба формы.
Прежде чем переходить к привязкам, вспомним, как добавляется сам элемент. Важно понимать, что привязки начинают работать корректно только тогда, когда у элемента уже заданы начальные координаты (геометрия). Рассмотрим пример добавления флажка и надписи, как это было предложено в обсуждении. Проанализируем типичный сценарий: нам нужно добавить флажок «Проверен» рядом с существующей табличной частью.
// Добавляем надпись
ЭлементФормы_НадписьПроверен = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Надпись"), "ФР_НадписьПроверен", Истина);
ЭлементФормы_НадписьПроверен.Заголовок = "Проверен";
ЭлементФормы_НадписьПроверен.Верх = 100; // Условные координаты
ЭлементФормы_НадписьПроверен.Лево = 600;
ЭлементФормы_НадписьПроверен.Ширина = 50;
ЭлементФормы_НадписьПроверен.Высота = 19;
// Добавляем флажок
ЭлементФормы_Проверен = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Флажок"), "ФР_Проверен", Истина);
ЭлементФормы_Проверен.Верх = 100;
ЭлементФормы_Проверен.Лево = 585;
ЭлементФормы_Проверен.Ширина = 15;
ЭлементФормы_Проверен.Высота = 19;
Важный нюанс: как только мы вызываем метод УстановитьПривязку хотя бы для одной границы, автоматический механизм расстановки привязок 1С для этого элемента отключается. Это означает, что нам придется вручную определить поведение для всех четырех сторон (Лево, Право, Верх, Низ), иначе элемент может повести себя непредсказуемо.
Для управления поведением границ используется метод УстановитьПривязку. Рассмотрим его параметры подробнее, так как именно здесь кроется большинство ошибок:
УстановитьПривязку(Граница, ПривязываемыйЭлемент, ПривязываемаяГраница, ПропорциональныйЭлемент, ПропорциональнаяГраница)
ГраницаЭлементаУправления. Указывает, какую сторону нашего нового элемента мы привязываем (Лево, Право, Верх или Низ).ГраницаЭлементаУправления. К какой именно стороне «чужого» элемента мы привязываемся.Рассмотрим ситуацию, когда нам нужно привязать новый флажок к правому краю формы, чтобы он «ездил» вместе с ней при растягивании окна. Выясним, как это реализовать на практике.
// Установим привязку левой границы флажка к правой границе существующего элемента (например, Флажок1)
ЭлементФормы_Проверен.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭлементыФормы.Флажок1, ГраницаЭлементаУправления.Право);
// Установим привязку правой границы флажка к правой границе всей формы
// Для этого вторым параметром передаем Неопределено или саму форму
ЭлементФормы_Проверен.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭтаФорма, ГраницаЭлементаУправления.Право);
Проанализируем ситуацию, описанную в сообщениях форума. Если мы хотим, чтобы надпись не перекрывала другие элементы, мы должны привязать ее Верх к низу вышестоящего элемента, а Низ — к верхнему краю элемента, расположенного ниже. Если же мы привязываем элемент к пустой области, программа по умолчанию может привязать его к левому верхнему углу, и при разворачивании формы на весь экран ваша «галочка» останется в маленьком квадрате слева, пока остальные данные растягиваются.
Выясним, что произойдет, если привязки настроены неверно. Как справедливо отмечено в обсуждении, форма будет вести себя «отвратно» при изменении масштаба. Основные проблемы:
Панели, его нельзя привязывать к элементам, находящимся вне этой панели. Привязкой в данном случае должен выступать либо другой элемент на этой же закладке панели, либо сама панель.Рассмотрим пошагово правильную последовательность действий при программной работе с формой:
Панели).Лево, Верх, Ширина и Высота. Это критически важно сделать до вызова привязок.Лево и Право.Верх и Низ.РастягиватьПоГоризонтали = Истина.Посмотрим на пример из сообщения №12 с исправлениями. Автор пытался привязать надпись к табличной части и панели. Чтобы это работало корректно, код должен выглядеть примерно так:
// Привязываем левый край к табличной части
ЭлементФормы_НадписьПреверен.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭлементыФормы.ЗатратыВТабличнойЧасти, ГраницаЭлементаУправления.Лево);
// Привязываем правый край (жестко к левому, чтобы ширина не менялась при растягивании)
ЭлементФормы_НадписьПреверен.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭлементыФормы.ЗатратыВТабличнойЧасти, ГраницаЭлементаУправления.Лево);
// Привязываем верх к верхней границе табличной части (чтобы двигалась вместе с ней)
ЭлементФормы_НадписьПреверен.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.ЗатратыВТабличнойЧасти, ГраницаЭлементаУправления.Верх);
// Привязываем низ к верху той же табличной части
ЭлементФормы_НадписьПреверен.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ЗатратыВТабличнойЧасти, ГраницаЭлементаУправления.Верх);
Такой подход гарантирует, что надпись будет всегда «приклеена» к левому верхнему углу табличной части ЗатратыВТабличнойЧасти и будет перемещаться вместе с ней, сохраняя свои размеры.
Поскольку в коде трудно визуализировать итоговый результат, рекомендуем использовать проверенный прием: временно назначьте создаваемому элементу яркий цвет фона (например, Элемент.ЦветФона = ЦветаСтиля.ОсобыйТекст). Запустите программу и попробуйте потянуть за края окна. Если цветной прямоугольник ведет себя адекватно — не исчезает и не перекрывает важные данные — значит, привязки настроены верно.
И помните, что механизм УстановитьПривязку является наследием платформы 8.2 для обычных форм. В управляемых формах (8.3) этот процесс автоматизирован через группы и свойства растягивания, но знание классических методов необходимо для поддержки исторических конфигураций, таких как БП 2.0 или УПП 1.3.