Как программно добавить элементы на форму 1С, чтобы ширина группы увеличивалась, а не сжимала соседние поля

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

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

Почему происходит сжатие элементов?

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

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

Шаг 1: Настройка родительской группы

Первым делом обратим внимание на свойства группы, в которую добавляются элементы. Если это ГруппаФормы с видом ГруппаЭлементов, проверьте следующие параметры:

  1. Группировка: Всегда устанавливайте значение Горизонтальная всегда. В режиме Горизонтальная если возможно платформа может в любой момент перенести элементы на новую строку, что нарушит логику расширения вширь.
  2. Растягивать по горизонтали: У самой группы это свойство должно быть установлено в значение Да. Если группа не стремится занять все доступное пространство или не сообщает платформе о своей готовности расширяться, внутренние элементы будут зажаты.
  3. Горизонтальная полоса прокрутки: Если вы планируете добавить так много элементов, что они заведомо не поместятся на экран, убедитесь, что у родительского контейнера (или самой формы) разрешена прокрутка.

Шаг 2: Правильная настройка программно добавляемых элементов

Когда мы добавляем элемент кодом, недостаточно просто вызвать метод Элементы.Добавить(). Необходимо явно инициализировать свойства, отвечающие за геометрические размеры. Разберем пример кода:


// Добавление нового поля в группу
НовоеПоле = Элементы.Добавить("Реквизит_Программный_" + Индекс, Тип("ПолеФормы"), ГруппаРодитель);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Объект.ДополнительныйРеквизит";

// Настройка размеров (КРИТИЧЕСКИ ВАЖНО)
НовоеПоле.РастягиватьПоГоризонтали = Ложь; 
НовоеПоле.Ширина = 15; // Устанавливаем фиксированную ширину
НовоеПоле.АвтоМаксимальнаяШирина = Ложь;

Выясним причину, почему это важно: если у элемента стоит РастягиватьПоГоризонтали = Истина, платформа считает его «пластичным» и сжимает его в первую очередь, чтобы освободить место для других. Установив Ложь и задав конкретную Ширина, мы даем движку понять, что этот элемент требует строго определенного места.

Шаг 3: Настройка существующих («соседних») элементов

Часто программисты забывают, что новые элементы взаимодействуют со старыми. Если у элементов, которые были созданы в конфигураторе, стоят настройки Авто, они будут сжиматься. Рассмотрим алгоритм действий для стабилизации всей группы:

  1. Обойдите в цикле все элементы группы перед добавлением новых.
  2. Установите им фиксированную ширину (свойство Ширина).
  3. Отключите РастягиватьПоГоризонтали.
  4. Отключите АвтоМаксимальнаяШирина.

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

Шаг 4: Особенности работы с табличными частями

Если вы добавляете колонки в таблицу (например, в «Группу Итого» или непосредственно в ТЧ документа), ситуация усложняется. У таблиц есть свойство «Автоматическая ширина колонок». Если оно включено, платформа игнорирует ваши программные настройки ширины и пытается сбалансировать таблицу самостоятельно.

Для решения проблемы в таблицах:

  1. У самой таблицы установите Автоматическая ширина колонок = Ложь.
  2. Для каждой колонки (ПолеФормы) задайте Ширина и РастягиватьПоГоризонтали = Ложь.

Шаг 5: Форсирование пересчета интерфейса (Лайфхаки)

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

Вариант А: Переключение видимости. Сразу после программного создания элементов попробуйте кратковременно изменить видимость родительской группы. Это инициирует полный цикл перестроения элементов.


ГруппаРодитель.Видимость = Ложь;
ГруппаРодитель.Видимость = Истина;

Вариант Б: Использование вложенных контейнеров. Попробуйте обернуть программно добавляемые элементы в еще одну вложенную группу с типом «Без отображения». Задайте этой промежуточной группе свойство РастягиватьПоГоризонтали = Да, а внутренним элементам — жесткую ширину. Это создаст дополнительный уровень изоляции для расчета координат.

Шаг 6: Управление шириной самой формы

Если группа расширяется, но упирается в границы окна, форма может начать обрезать содержимое. Посмотрим на свойство формы ВариантУправленияШириной. Если установить его в значение «Больше содержимого», платформа будет охотнее увеличивать размер окна при появлении новых данных. Также в некоторых версиях платформы (начиная с 8.3.15+) доступно программное изменение ширины всей формы через ЭтаФорма.Ширина, однако помните, что это свойство измеряется в «символах», а не пикселях, и его использование должно быть оправдано.

Подведем итог: секрет стабильной ширины программных элементов заключается в отказе от автоматических настроек платформы. Как только вы переходите к программному управлению интерфейсом, вы берете на себя ответственность за расчет размеров каждого элемента в цепочке «Форма -> Группа -> Подгруппа -> Элемент».

← На главную