Многие разработчики сталкиваются с ситуацией, когда необходимо отобразить объемный текст на форме, но элемент управления ведет себя непредсказуемо. Всякие сочетания галочек и настроек свойств часто не дают нужного результата: многострочное поле либо схлопывается до 2-3 строк, скрывая большую часть текста, либо неконтролируемо растягивается на всю свободную область формы. Рассмотрим подробнее, почему так происходит, и разберем способы решения этой задачи для управляемых форм.
Проанализируем ситуацию с точки зрения ограничений платформы 1С. В механизме компоновки управляемых форм отсутствует встроенное свойство, которое бы автоматически, динамически и точно подстраивало высоту одиночного многострочного поля ввода строго под текущий объем отображаемого текста. Свойства автовысоты работают со значительными ограничениями.
Выясним причину такого поведения. Оно обусловлено комбинацией настроек свойств самого элемента и его родительских групп:
РастягиватьПоВертикали установлено в значение "Да" или "Авто". В этом случае платформа пытается заполнить элементом всё свободное пространство на экране.АвтоМаксимальнаяВысота для одиночных полей вне таблиц часто игнорируется платформой в зависимости от общих привязок других элементов формы.Посмотрим на пример того, как эта задача решается в типовых конфигурациях (например, в "1С:Бухгалтерии"). Там реализовано редактирование или просмотр поля неограниченной длины (например, поля "Комментарий") в отдельной многострочной форме.
Мы рекомендуем сделать аналогичный функционал через расширение и подключать для необходимых полей. Это очень удобно как для разработчика, так и для пользователя. На основной форме выводится лишь превью в несколько строк, а по кнопке открытия вызывается просторная форма для комфортного чтения всего текста.
Разберем по шагам вариант с программным вычислением. Высоту в строках можно задавать динамически при открытии формы или после чтения данных. Для этого программно подсчитывается количество строк в тексте с помощью функции СтрЧислоСтрок(). Обратите внимание, что для идеального результата иногда требуется оценить среднюю длину строки для учета автоматических переносов слов.
Посмотрим на пример кода для установки высоты элемента:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вычисляем количество строк в текстовом реквизите
ВычисленноеКоличествоСтрок = СтрЧислоСтрок(Объект.ТекстовоеПоле);
// Предусмотрим минимальную высоту, чтобы поле не исчезло, если текст пустой
Если ВычисленноеКоличествоСтрок < 2 Тогда
ВычисленноеКоличествоСтрок = 2;
КонецЕсли;
// Устанавливаем высоту элемента формы
Элементы.ТекстовоеПоле.Высота = ВычисленноеКоличествоСтрок;
КонецПроцедуры
Если программное вычисление вам не подходит, попробуем принудительно задать жесткие рамки для компоновщика форм. Для этого необходимо в свойствах элемента отключить свойство РастягиватьПоВертикали (установить значение "Нет"). Затем в свойстве Высота задать минимальное значение (например, 2 или 3), а в свойстве МаксимальнаяВысота установить разумный лимит (например, 10 или 15 строк).
При таких настройках текст перестанет раздвигать форму до бесконечности. Поле будет увеличиваться до достижения лимита, а при превышении максимальной высоты у поля появится аккуратная полоса прокрутки.
Если в вашей задаче поле используется исключительно для вывода информации (установлено ТолькоПросмотр = Истина), целесообразно использовать другие типы элементов управления, алгоритмы компоновки которых работают иначе:
clientHeight) можно получать реальную высоту отрисованного контента для идеальной подстройки размеров элемента.Выбор конкретного метода зависит от ваших требований к интерфейсу. Для простых задач отлично подойдет использование Декорации или ограничение Максимальной высоты, а для сложных и длинных текстов лучше применить отдельную форму по аналогии с типовыми решениями 1С.