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