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