Проблема автоматического подбора высоты под произвольный текст в управляемых формах 1С — это классическая задача, с которой сталкивается практически каждый разработчик. Стандартное поведение элемента Декорация-надпись часто разочаровывает: либо текст обрезается, либо при включении растягивания по вертикали форма «раздувается» лишними пустыми строками, пытаясь занять всё доступное пространство группы или окна.
В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько эффективных способов решения задачи — от простых настроек свойств в конфигураторе до «профессионального» программного расчета высоты.
Прежде чем переходить к решениям, проанализируем ситуацию. В управляемом интерфейсе 1С 8.3 компоновка элементов происходит динамически. Когда мы устанавливаем свойство РастягиватьПоВертикали в значение Да, платформа не просто подстраивается под текст, она пытается занять максимум свободного места в родительском контейнере. Если текста мало, а группа большая — появляются те самые пустые строки.
Начиная с версии платформы 8.3.10, разработчики получили штатный инструмент для решения этой проблемы. Вместо обычной декорации (надписи) мы будем использовать Поле ввода.
Разберем по шагам, как это настроить:
Строка и вынесем его на форму.Поле надписи (или оставим Поле ввода).Важный нюанс: Свойство Автовысота работает корректно только в том случае, если у элемента или его родительских групп не установлено принудительное вертикальное растягивание. Платформа сама вычислит необходимую высоту исходя из содержимого реквизита и ширины элемента.
Если по каким-то причинам использование поля ввода невозможно, рассмотрим метод управления компоновкой через свойства группы. Рассмотрим ситуацию, когда надпись должна быть ровно по тексту, а всё остальное место на форме должен занимать другой элемент.
Для этого выполним следующие действия:
Нет.Да.В этой конфигурации нижний элемент «вытолкнет» надпись вверх, заставляя её принять минимально возможную высоту, необходимую для отображения текста. Также полезно установить у родительской группы свойство Распределение содержимого в значение Компактное.
Это самый точный способ, который позволяет вычислить высоту с учетом шрифтов, межстрочных интервалов и текущей ширины формы. Мы воспользуемся невидимым табличным документом как «измерительным прибором».
Проанализируем пример кода, который можно разместить в обработчике изменения текста или при открытии формы:
&НаСервере
Процедура РассчитатьВысотуНадписи(ТекстСообщения)
// Создаем временный табличный документ для замеров
ТабДок = Новый ТабличныйДокумент;
// Получаем область и записываем в нее текст
Область = ТабДок.Область("R1C1");
Область.Текст = ТекстСообщения;
// Устанавливаем параметры шрифта как у элемента формы
// Важно: шрифт должен совпадать!
Область.Шрифт = Элементы.ГруппаНадписи.Шрифт;
// Задаем ширину колонки, соответствующую ширине надписи на форме
// Приблизительный расчет: 1 символ ~ 1.3 единицы ширины колонки
Область.ШиринаКолонки = Элементы.ДекорацияНадпись.Ширина / 1.3;
// Включаем перенос текста
Область.Размещать = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
// Выводим область и измеряем высоту
ТабДок.Вывести(Область);
// Рассчитываем количество строк. Метод ПроверитьВывод поможет понять,
// умещается ли текст в заданные параметры.
// Но проще установить высоту напрямую в строках:
НужнаяВысота = СтрЧислоСтрок(ТекстСообщения); // Базовый вариант
// Для более точного позиционирования используем свойство Высота элемента
Элементы.ДекорацияНадпись.Высота = ?(НужнаяВысота < 2, 2, НужнаяВысота);
КонецПроцедуры
Примечание: Метод СтрЧислоСтрок() считает только явные переносы (символы ПС). Если строка длинная и переносится платформой автоматически, этот метод вернет "1". Поэтому использование ТабличногоДокумента с установленной шириной является более надежным «профессиональным» подходом.
Если требуется сложная верстка или абсолютно предсказуемое поведение высоты, рассмотрим использование элемента с видом Поле HTML-документа. HTML-движок гораздо гибче справляется с потоковой версткой текста.
Для реализации этого метода выполним следующие шаги:
Строка (в нем будет храниться HTML-код).Поле HTML-документа.
ТекстHTML = "<html><body style='margin:0; padding:0; font-family:Arial; font-size:10pt;'>"
+ ТекстСообщения
+ "</body></html>";
В свойствах поля HTML-документа также можно включить Автовысоту. Платформа будет опрашивать содержимое HTML и подстраивать размер контейнера под body документа.
Выясним, какой метод лучше подходит для вашей ситуации:
Поле ввода с включенной Автовысотой. Это самый быстрый и стабильный вариант.ТабличныйДокумент.Поле HTML-документа.Помните, что при расчете высоты важно учитывать настройки масштабирования экрана (DPI) у пользователя. На мониторах с масштабом 125% или 150% текст может занимать чуть больше места, чем планировалось, поэтому всегда рекомендуется оставлять небольшой запас по высоте (плюс 1 строка) или устанавливать минимальную высоту элемента.