Как решить проблему с разной высотой и смещением декораций-надписей в управляемых формах 1С?

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

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

В этой статье мы подробно проанализируем причины такого поведения платформы 8.3, разберем проверенные практические способы решения этой проблемы и рассмотрим примеры кода для корректного программного выравнивания элементов.

Причины возникновения визуального смещения элементов

Выясним причину, почему платформа 1С визуально смещает декорации относительно полей ввода:

  1. Расчет базовой линии шрифта: В управляемом интерфейсе выравнивание текста элементов различается в зависимости от типа элемента. У объекта ДекорацияФормы внутренние отступы (padding) и расчет высоты шрифта отличаются от аналогичных параметров у полей ввода и полей надписей. При горизонтальной группировке платформа пытается скомпоновать элементы по базовой линии текста, что приводит к визуальному сдвигу декорации вверх или вниз.
  2. Особенности алгоритма компоновки интерфейса «Такси»: Механизм автоматического расстановки элементов рассчитывает ширину и высоту динамически. Если элементы создаются программно без явного указания правил вертикального положения, система применяет дефолтные параметры, которые дают погрешность в несколько пикселей при комбинации текстовых декораций и полей ввода.
  3. Отход от рекомендаций стандартов разработки: Начиная с версии 8.3.7, фирма 1С рекомендует минимизировать использование отдельных декораций в качестве заголовков к полям, отдавая предпочтение штатным заголовкам реквизитов формы.

Рассмотрим подробнее эффективные способы устранения этой проблемы.

Способ 1. Использование отдельных групп для строк с настройкой «ВертикальноеПоложениеПодчиненных»

Разберем наиболее надежный способ выравнивания элементов по вертикали, который отлично подходит при программном формировании структуры формы.

Суть метода заключается в том, что каждая логическая строка элементов помещается в отдельную родительскую группу с горизонтальной группировкой, а у самой группы принудительно задается свойство выравнивания подчиненных элементов по нижней границе (или по центру).

Посмотрим на пример программной реализации этого подхода:


// Создаем горизонтальную группу для строки
ГруппаСтрока = Элементы.Добавить("ГруппаСтрока1", Тип("ОбычнаяГруппаФормы"), ЭтаФорма);
ГруппаСтрока.Вид = ВидОбычнойГруппыФормы.БезОтображения;
ГруппаСтрока.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
ГруппаСтрока.ОтображатьЗаголовок = Ложь;

// Ключевая настройка для предотвращения смещения:
ГруппаСтрока.ВертикальноеПоложениеПодчиненных = ВертикальноеПоложениеПодчиненныхЭлементовФормы.Низ;

// Добавляем декорацию-надпись в созданную группу
ДекорацияЗаголовок = Элементы.Добавить("ДекорацияЗаголовок1", Тип("ДекорацияФормы"), ГруппаСтрока);
ДекорацияЗаголовок.Вид = ВидДекорацииФормы.Надпись;
ДекорацияЗаголовок.Заголовок = "Заголовок колонки:";

// Добавляем поле ввода или надпись
ПолеФормы = Элементы.Добавить("ПолеЗначение1", Тип("ПолеФормы"), ГруппаСтрока);
ПолеФормы.Вид = ВидПоляФормы.ПолеВвода;
ПолеФормы.ПутьКДанным = "Объект.ЗначениеРеквизита";

Установка свойства ВертикальноеПоложениеПодчиненных = ВертикальноеПоложениеПодчиненныхЭлементовФормы.Низ заставляет платформу отказаться от расчета динамической базовой линии шрифта и выравнивает нижние границы контейнеров всех подчиненных элементов строго по одной линии.

Способ 2. Замена «Декорации» на «Поле надписи»

Проанализируем альтернативный подход, который позволяет полностью избежать разницы во внутренних отступах элементов.

Вместо элемента ДекорацияФормы с видом Надпись мы можем использовать элемент ПолеФормы с видом ПолеНадписи. Поскольку ПолеНадписи использует тот же самый контейнер отображения, что и обычное ПолеВвода, платформа отрисовывает их с одинаковыми внутренними отступами и идеальной вертикальной геометрией.

Рассмотрим пример создания такого элемента:


// Создаем поле надписи вместо декорации
ПолеНадпись = Элементы.Добавить("ПолеНадписьЗаголовок", Тип("ПолеФормы"), РодительскаяГруппа);
ПолеНадпись.Вид = ВидПоляФормы.ПолеНадписи;
ПолеНадпись.Заголовок = "Описание реквизита";
ПолеНадпись.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; // Отключаем собственный заголовок

// Задаем текст через реквизит формы или свойство заголовка
ПолеНадпись.Гиперссылка = Ложь;

Данный способ устраняет сдвиг базовой линии, так как элементы одного базового типа (поля формы) обрабатываются интерфейсным движком по единому алгоритму.

Способ 3. Использование сквозного выравнивания и объединенных групп

Посмотрим, как правильно настроить свойства родительских групп, если форма имеет сложную сеточную структуру из нескольких колонок и строк.

Для корректного выравнивания нескольких полей и надписей по вертикали и горизонтали выполним следующие шаги:

  1. Для контейнера (родительской группы верхнего уровня) установим свойство Объединенная = Истина.
  2. В свойстве СквозноеВыравнивание выберем значение Использовать.
  3. Убедимся, что для внутренних горизонтальных групп свойство ОтображениеЗаголовка установлено в Ложь.

Пример кода настройки свойств групп:


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

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

Способ 4. Точечная настройка свойств выравнивания у самих элементов

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

У каждого элемента управления на форме присутствует свойство ВертикальноеПоложениеВГруппе. По умолчанию оно находится в значении Авто, из-за чего 1С пытается рассчитать положение самостоятельно. Если принудительно задать всем декорациям и полям в строке идентичное значение, разброс по высоте исчезнет.


// Принудительно задаем одинаковое вертикальное положение для элементов в строке
Декорация1 = Элементы.ДекорацияЗаголовок1;
Декорация1.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлементаФормы.Центр;

ПолеВвода1 = Элементы.ПолеЗначение1;
ПолеВвода1.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлементаФормы.Центр;

Способ 5. Альтернативный метод: Использование колончатых версий групп и переносов строк

Рассмотрим еще один практический вариант, применяемый при верстке сложных таблицеподобных блоков управляемой формы:

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

Рекомендации по оформлению и предотвращению ошибок выравнивания

Проанализируем дополнительные нюансы, о которых важно помнить при разработке управляемых форм:

  1. Контроль скрытых отступов заголовков групп: Если у группы включено отображение заголовка (даже если сам заголовок не заполнен и равен пустой строке), платформа резервирует скрытый отступ в 2–4 пикселя. Всегда явно отключайте заголовок служебных групп: Группа.ОтображатьЗаголовок = Ложь.
  2. Ограничение динамической высоты и растягивания: Чтобы декорация не растягивалась некорректно при изменении размеров окна, используйте свойства РастягиватьПоВертикали = Ложь и АвтоМаксимальнаяШирина = Ложь, либо ограничивайте высоту родительской группы.
  3. Единообразие шрифтов и форматированных строк: При использовании объекта ФорматированнаяСтрока или при изменении начертания текста (например, выделении жирным) платформа автоматически увеличивает межстрочный интервал. Чтобы избежать разницы в высоте, применяйте одинаковые параметры шрифта для всех текстовых элементов одной строки.

Таким образом, для быстрого и надежного решения проблемы со смещением декораций рекомендуется использовать сочетание индивидуальных горизонтальных групп для каждой строки с параметром ВертикальноеПоложениеПодчиненных = Низ либо заменять элементы типа ДекорацияФормы на ПолеНадписи.

← На главную