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

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

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

Разберем основную причину: свойство АвтоВысота

Первое, на что необходимо обратить внимание при программном создании элементов, — это свойство АвтоВысота. В Обычных формах для многих элементов управления это свойство по умолчанию может принимать значение Истина. Проанализируем логику работы платформы: если АвтоВысота включена, 1С самостоятельно вычисляет размер поля, исходя из установленного шрифта и системных настроек отображения. Любые ваши попытки присвоить значение напрямую в Высота будут перетерты платформой в момент отрисовки.

Для решения задачи нам нужно принудительно отключить этот механизм:


НовоеПоле = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "ПолеТест", Истина, ЭлементыФормы.ПанельГлавная);
НовоеПоле.АвтоВысота = Ложь;
НовоеПоле.Высота = 13;

Влияние многострочного режима на геометрию поля

Выясним еще одну важную деталь. В Обычных формах стандартное однострочное ПолеВвода имеет жесткую привязку к высоте системного шрифта. Платформа старается сделать так, чтобы рамки поля не «обрезали» текст. Если вы хотите сделать поле очень узким (ниже стандартных 19–21 пикселей) или, наоборот, сделать его высоким без изменения шрифта, вам потребуется включить МногострочныйРежим. Даже если вы не планируете вводить текст в несколько строк, этот флаг снимает часть ограничений на визуальное изменение высоты контейнера.

Посмотрим на пример правильной инициализации:


Примечание = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "Примечание", Истина);
Примечание.МногострочныйРежим = Истина;
Примечание.АвтоВысота = Ложь;
Примечание.Высота = 40; // Теперь высота установится корректно

Связь высоты со шрифтом и системными рамками

Проанализируем ситуацию, когда даже при отключенной автовысоте поле «сопротивляется» уменьшению. Это происходит из-за того, что у элемента установлен шрифт, размер которого требует большего пространства, чем вы выделяете. Платформа 1С в ОФ всегда оставляет небольшой запас (padding) сверху и снизу от текста.

Если ваша задача — сделать максимально компактный интерфейс (например, высотой 13 или 15 пикселей), необходимо сначала уменьшить кегль шрифта. Рассмотрим последовательность действий:

  1. Создаем элемент управления через ЭлементыФормы.Добавить().
  2. Назначаем шрифт меньшего размера (например, 7 или 6).
  3. Устанавливаем АвтоВысота = Ложь.
  4. Задаем требуемую Высота.

Пример кода для компактного поля:


Примечание.Шрифт = Новый Шрифт(Примечание.Шрифт, , 7); // Устанавливаем кегль 7
Примечание.АвтоВысота = Ложь;
Примечание.Высота = 13;

Использование метода УстановитьГраницы

Опытные разработчики знают, что поочередное изменение свойств Верх, Лево, Ширина и Высота может вызывать цепочку перерисовок формы, что иногда приводит к «скачкам» координат. Для стабильного программного позиционирования в Обычных формах рекомендуется использовать метод УстановитьГраницы(). Он позволяет задать все геометрические параметры одним вызовом, что обрабатывается движком форм более атомарно.

Синтаксис метода: Элемент.УстановитьГраницы(Лево, Верх, Ширина, Высота).

Рассмотрим, как это применить в цикле при динамическом построении чеклиста или таблицы:


Для Каждого Стр Из СписокОбъектов Цикл
    ТекущийВерх = НачальныйОтступ + (Индекс * Шаг);
    НоваяНадпись = ЭлементыФормы.Добавить(Тип("Надпись"), "Надпись_" + Индекс, Истина);
    // Вместо четырех присвоений используем одно:
    НоваяНадпись.УстановитьГраницы(10, ТекущийВерх, 200, 15);
КонецЦикла;

Проблема «плавающих» координат (эффект 825 -> 814)

Проанализируем ситуацию, описанную в сообщениях форума, когда вы устанавливаете Верх = 825, а платформа тут же меняет значение на 814. Это не ошибка в коде, а следствие работы алгоритмов компоновки Обычных форм. Выделим основные причины такого поведения:

  1. Ограничение родительского контейнера: Если вы добавляете элемент на Панель, высота которой составляет 830 пикселей, а сам элемент имеет высоту 20, то при установке координаты Верх = 825 элемент «вылезет» за границы панели (825 + 20 = 845). Платформа принудительно «подтягивает» элемент вверх, чтобы он полностью помещался в границы родителя.
  2. Масштабирование (DPI): В современных версиях Windows при масштабе экрана отличном от 100% (например, 125% или 150%) 1С пересчитывает пиксели в логические единицы. Это может приводить к округлениям координат.
  3. Привязки (Anchors): Если у элемента или его родителя настроены сложные привязки к границам формы, любое изменение размеров формы может динамически менять координаты вложенных элементов.

Совет: Если вам нужно разместить много элементов, которые не помещаются на экран, не пытайтесь уменьшать их высоту до нечитаемого состояния. Вместо этого используйте Панель со свойством АвтоПрокрутка = Истина. В этом случае вы сможете программно расставлять элементы по любым координатам, а панель просто обзаведется полосой прокрутки, не пытаясь сжать ваши поля ввода.

Правильный порядок инициализации свойств

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

  1. Добавление: Создаем объект методом Добавить().
  2. Родитель: Указываем контейнер (панель или саму форму).
  3. Содержимое: Устанавливаем Данные (путь к реквизиту).
  4. Режим: Включаем МногострочныйРежим, если нужна нестандартная высота.
  5. Шрифт: Назначаем шрифт (он критически влияет на расчет минимально возможной высоты).
  6. Отключение автоматики: Устанавливаем АвтоВысота = Ложь.
  7. Геометрия: Применяем УстановитьГраницы().

Соблюдая эти правила, вы получите полный контроль над внешним видом ваших динамических форм и избежите проблем с «самовольным» изменением размеров элементов платформой 1С.

← На главную