Как на управляемой форме вывести многострочную надпись с автоматической высотой?

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

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

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

Причина проблемы: как 1С рассчитывает высоту

Прежде чем переходить к решениям, проанализируем ситуацию. В управляемом интерфейсе 1С 8.3 компоновка элементов происходит динамически. Когда мы устанавливаем свойство РастягиватьПоВертикали в значение Да, платформа не просто подстраивается под текст, она пытается занять максимум свободного места в родительском контейнере. Если текста мало, а группа большая — появляются те самые пустые строки.

Способ 1. Использование Поля ввода со свойством «Автовысота»

Начиная с версии платформы 8.3.10, разработчики получили штатный инструмент для решения этой проблемы. Вместо обычной декорации (надписи) мы будем использовать Поле ввода.

Разберем по шагам, как это настроить:

  1. Добавим на форму реквизит с типом Строка и вынесем его на форму.
  2. В свойствах элемента установим Вид — Поле надписи (или оставим Поле ввода).
  3. Обязательно установим флажок Только просмотр, чтобы пользователь не мог редактировать текст.
  4. Включим свойство Многострочный режим.
  5. И самое главное — установим флажок Автовысота.

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

Способ 2. Компоновка с «заполнителем»

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

Для этого выполним следующие действия:

  1. У самой надписи установим свойство Растягивать по вертикали в значение Нет.
  2. Поместим надпись в вертикальную группу.
  3. Сразу после надписи добавим элемент Декорация-пояснение (пустую) или другой элемент, у которого свойство Растягивать по вертикали установлено в Да.

В этой конфигурации нижний элемент «вытолкнет» надпись вверх, заставляя её принять минимально возможную высоту, необходимую для отображения текста. Также полезно установить у родительской группы свойство Распределение содержимого в значение Компактное.

Способ 3. Программный расчет высоты через Табличный документ

Это самый точный способ, который позволяет вычислить высоту с учетом шрифтов, межстрочных интервалов и текущей ширины формы. Мы воспользуемся невидимым табличным документом как «измерительным прибором».

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


&НаСервере
Процедура РассчитатьВысотуНадписи(ТекстСообщения)
    
    // Создаем временный табличный документ для замеров
    ТабДок = Новый ТабличныйДокумент;
    
    // Получаем область и записываем в нее текст
    Область = ТабДок.Область("R1C1");
    Область.Текст = ТекстСообщения;
    
    // Устанавливаем параметры шрифта как у элемента формы
    // Важно: шрифт должен совпадать!
    Область.Шрифт = Элементы.ГруппаНадписи.Шрифт; 
    
    // Задаем ширину колонки, соответствующую ширине надписи на форме
    // Приблизительный расчет: 1 символ ~ 1.3 единицы ширины колонки
    Область.ШиринаКолонки = Элементы.ДекорацияНадпись.Ширина / 1.3;
    
    // Включаем перенос текста
    Область.Размещать = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    
    // Выводим область и измеряем высоту
    ТабДок.Вывести(Область);
    
    // Рассчитываем количество строк. Метод ПроверитьВывод поможет понять,
    // умещается ли текст в заданные параметры.
    // Но проще установить высоту напрямую в строках:
    НужнаяВысота = СтрЧислоСтрок(ТекстСообщения); // Базовый вариант
    
    // Для более точного позиционирования используем свойство Высота элемента
    Элементы.ДекорацияНадпись.Высота = ?(НужнаяВысота < 2, 2, НужнаяВысота);
    
КонецПроцедуры

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

Способ 4. Поле HTML-документа

Если требуется сложная верстка или абсолютно предсказуемое поведение высоты, рассмотрим использование элемента с видом Поле HTML-документа. HTML-движок гораздо гибче справляется с потоковой версткой текста.

Для реализации этого метода выполним следующие шаги:

  1. Создадим реквизит формы с типом Строка (в нем будет храниться HTML-код).
  2. Разместим его на форме с видом Поле HTML-документа.
  3. Сформируем простейший HTML-контейнер:

ТекстHTML = "<html><body style='margin:0; padding:0; font-family:Arial; font-size:10pt;'>" 
          + ТекстСообщения 
          + "</body></html>";

В свойствах поля HTML-документа также можно включить Автовысоту. Платформа будет опрашивать содержимое HTML и подстраивать размер контейнера под body документа.

Рекомендации по выбору решения

Выясним, какой метод лучше подходит для вашей ситуации:

Помните, что при расчете высоты важно учитывать настройки масштабирования экрана (DPI) у пользователя. На мониторах с масштабом 125% или 150% текст может занимать чуть больше места, чем планировалось, поэтому всегда рекомендуется оставлять небольшой запас по высоте (плюс 1 строка) или устанавливать минимальную высоту элемента.

← На главную