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