Работа с управляемыми формами в 1С:Предприятии 8.3 иногда преподносит сюрпризы, которые на первый взгляд кажутся ошибками платформы. Одной из таких проблем является внезапное появление огромных пустых пространств между группами элементов или внутри них. Это происходит из-за особенностей работы движка автоматической расстановки элементов (layout engine). В рамках данной статьи мы подробно разберем, почему форма может вести себя «странно», как найти виновника «раздувания» интерфейса и в чем заключаются визуальные отличия между старым интерфейсом 8.2 и современным «Такси».
Основным механизмом, управляющим распределением пространства на форме, является свойство РастягиватьПоВертикали. Проанализируем ситуацию: когда вы добавляете новый реквизит или меняете структуру групп, платформа пересчитывает доступную высоту формы. Если у одного из элементов или групп установлено свойство РастягиватьПоВертикали в значение Да или Авто, этот элемент стремится занять все свободное место.
Рассмотрим так называемый «принцип жадности»:
Часто «виновником» становится элемент, который вы даже не подозревали. Например, многострочное поле ввода или декорация. Чтобы решить проблему, проанализируем дерево элементов формы. Нам необходимо пройтись по каждому элементу в проблемной ветке и принудительно установить РастягиватьПоВертикали в значение Нет для тех полей, которые должны иметь фиксированную высоту.
Выясним, как влияют на верстку типы данных. Если на форме размещено поле, связанное с реквизитом типа Строка неограниченной длины, платформа по умолчанию считает, что пользователю может понадобиться много места для ввода текста. Даже если свойство МногострочныйРежим выключено, такое поле в режиме Авто может пытаться резервировать дополнительное вертикальное пространство.
Особенно коварны такие поля, когда у них отключена видимость. Рассмотрим важный нюанс: свойство Видимость может быть установлено в конфигураторе или изменено программно.
// Пример программного управления видимостью, которое может повлиять на компоновку
Элементы.ГруппаРасчетСтоимости.Видимость = Ложь;
Иногда программисты используют элементы типа Декорация (вид — Надпись или Картинка) для создания отступов. Если в такой декорации случайно оставить включенным растягивание, она превратится в «черную дыру», поглощающую экранное пространство. Проанализируем свойства всех декораций в группе: убедимся, что их высота фиксирована (например, равна 1 или 2), а растягивание отключено.
Часто возникает вопрос, почему одна и та же форма выглядит по-разному в зависимости от используемого интерфейса. Рассмотрим ситуацию с «лишними линиями» или рамками в старом интерфейсе 8.2, которых нет в «Такси».
Это связано с изменением логики свойства Отображение у групп. Разберем варианты:
Авто часто интерпретируется как Линия или Рамка, если группа содержит заголовок или вложена в другие элементы. Это было сделано для визуального разделения блоков данных в более «плотном» интерфейсе прошлого поколения.Авто для групп чаще всего означает полное отсутствие визуальных границ. Платформа минимизирует количество линий, чтобы интерфейс выглядел чище.Если вы видите нежелательную рамку в старом интерфейсе, проверьте свойство ОтображениеГруппы. Вместо Авто установите значение Нет. Также обратите внимание на свойство Выделение. В интерфейсе 8.2 даже «слабое выделение» имело четкую визуальную границу, в то время как в «Такси» оно может быть практически незаметным или отличаться лишь легким изменением фона.
Проанализируем последовательность действий, которая поможет вам быстро привести форму в порядок:
РастягиватьПоВертикали. Если вы нашли элемент, у которого стоит Да, попробуйте временно поставить Нет и обновить форму.Высота должно быть либо пустым (авто), либо иметь минимальное значение (например, 1). Свойство РастягиватьПоВертикали у таких групп также должно быть Нет.Вертикальная на ГруппировкаКолонок или использование вложенных групп с типом Горизонтальная позволяет более жестко зафиксировать положение элементов.Если визуальный поиск в конфигураторе не дает результатов, мы можем проанализировать свойства элементов в коде при открытии формы. Рассмотрим пример обхода элементов группы для поиска подозрительных настроек:
&НаСервере
Процедура ПроверитьРастягиваниеЭлементов(ИмяГруппы)
Группа = Элементы[ИмяГруппы];
Для Каждого ТекущийЭлемент Из Группа.ПодчиненныеЭлементы Цикл
// Проверяем настройки, которые могут влиять на высоту
Сообщить("Элемент: " + ТекущийЭлемент.Имя
+ " РастягиватьПоВертикали: " + ТекущийЭлемент.РастягиватьПоВертикали);
КонецЦикла;
КонецПроцедуры
Подведем итог: «Странное» поведение формы почти всегда объясняется логикой автоматического размещения. Внимательный аудит свойств вертикального растягивания и понимание различий в рендеринге интерфейсов — ключ к созданию профессионального и удобного интерфейса 1С.