Как правильно программно создать кнопку и настроить её привязки в обычных формах 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При динамическом создании элементов интерфейса в обычных формах 1С разработчики часто сталкиваются с ситуацией, когда добавленный элемент управления (например, кнопка) не встает на нужное место либо начинает вести себя непредсказуемо при изменении пользователем размеров окна: налезает на соседние поля, растягивается во весь экран или улетает за пределы видимости. Разберем, как устроен механизм привязок в 1С, почему важен строгий порядок выполнения команд и как написать надежный программный код для позиционирования элементов.

Принцип работы позиционирования и механизма привязок

Проанализируем базовую механику работы интерфейса обычной формы. Положение и поведение любого элемента определяются двумя составляющими:

  1. Начальные геометрические координаты: свойства Верх, Лево, Высота и Ширина задают физическое местоположение и размер элемента на форме в текущий момент времени.
  2. Правила привязок: метод УстановитьПривязку() указывает платформе, как должны двигаться границы элемента при изменении размеров формы или родительской панели.

Критически важная особенность: метод УстановитьПривязку() в момент своего вызова считывает текущие координаты элемента и целевого объекта, вычисляя и фиксируя между ними постоянное смещение (дельту). Если попытаться сначала вызвать УстановитьПривязку(), а затем изменить свойства Верх или Лево, платформа пересчитает внутренние отступы некорректно. Именно поэтому координаты необходимо жестко определять до настройки привязок.

Пошаговый порядок программного добавления элемента

Рассмотрим по шагам правильный алгоритм создания кнопки и внедрения ее в структуру формы:

  1. Создание элемента в коллекции: вызываем метод ЭлементыФормы.Добавить() с указанием типа создаваемого объекта, его имени и родительского контейнера.
  2. Установка начальных координат: явно прописываем свойства Верх, Лево, Ширина и Высота.
  3. Настройка отображения и обработчиков событий: назначаем заголовок, подсказку, параметры выравнивания и действие на нажатие через метод УстановитьДействие().
  4. Настройка привязок границ: вызываем метод УстановитьПривязку() для нужных сторон элемента управления.

Разбор практического примера кода

Посмотрим на готовый пример добавления кнопки на панель с привязкой к существующим элементам формы:


// 1. Создаем кнопку на панели формы
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), "Взвесить", Истина, ЭлементыФормы.ОсновнаяПанель);

// 2. Обязательно задаем начальные геометрические координаты ДО вызова привязок
НоваяКнопка.Верх = 280; 
НоваяКнопка.Лево = 20; 
НоваяКнопка.Высота = 30; 
НоваяКнопка.Ширина = 100; 

// 3. Задаем параметры оформления и логику кнопки
НоваяКнопка.Заголовок = "Взвесить"; 
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; 

Попытка 
    НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("ДействияФормыДействиеВзвесить")); 
Исключение 
    // Обработка возможного отсутствия экспортной процедуры в модуле формы
КонецПопытки; 

// 4. Устанавливаем правила поведения границ при изменении размера окна
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Лево); 
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Лево); 
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Товары, ГраницаЭлементаУправления.Низ); 
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ИнфНадписьТекущаяСумма, ГраницаЭлементаУправления.Верх);

Как настроить поведение: фиксация размера или растягивание

Разберем логику выбора границ в методе УстановитьПривязку():

  1. Сохранение постоянной ширины (или высоты) элемента при движении: если элемент должен перемещаться вместе с формой, но не менять свой размер, привяжите обе его противоположные границы к одной и той же границе целевого элемента. Например, привязка границ ГраницаЭлементаУправления.Лево и ГраницаЭлементаУправления.Право к границе ГраницаЭлементаУправления.Лево соседнего элемента заставит кнопку следовать за ним, строго сохраняя заданную ширину.
  2. Растягивание элемента («резиновость»): если элемент должен динамически изменять ширину или высоту, противоположные границы привязываются к противоположным границам (например, левая граница кнопки — к левой границе формы, а правая граница кнопки — к правой границе формы).
  3. Сброс установленной привязки: если необходимо отменить привязку для определенной стороны, вызывается метод УстановитьПривязку(ГраницаЭлементаУправления.<ИмяГраницы>) без передачи второго и третьего параметров.

Типичные ошибки и платформенные ограничения

Выясним причины распространенных сбоев при программном размещении элементов:

  1. Привязка между разными контейнерами: если элемент размещен на панели ОсновнаяПанель или внутри страницы панели, его разрешено привязывать только к элементам, находящимся на той же самой странице той же панели, либо к границам самой панели. Привязка к элементам из других вкладок или верхнего уровня формы приведет к некорректному поведению.
  2. Циклические зависимости: категорически запрещено настраивать взаимные привязки (когда элемент А привязан к элементу Б, а элемент Б — к элементу А). Это ломает механизм компоновки при изменении габаритов окна.

Альтернативные архитектурные решения

Проанализируем ситуации, когда сложной программной настройки привязок можно избежать:

  1. Предварительное создание в конфигураторе: если состав интерфейса известен заранее, гораздо надежнее разместить элемент в интерактивном редакторе формы, визуально настроить привязки через окно свойств и установить свойство Видимость = Ложь. В программном коде останется только включить видимость по условию: ЭлементыФормы.Взвесить.Видимость = Истина;. Это исключает погрешности ручного позиционирования.
  2. Использование командных панелей: если речь идет о функциональной кнопке, оптимальнее добавлять ее в существующую КоманднаяПанель формы или таблицы. В этом случае платформа берет автоматический расчет координат, переноса и отступов кнопок на себя.
← На главную