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

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

Многие разработчики сталкиваются с ситуацией, когда необходимо отобразить объемный текст на форме, но элемент управления ведет себя непредсказуемо. Всякие сочетания галочек и настроек свойств часто не дают нужного результата: многострочное поле либо схлопывается до 2-3 строк, скрывая большую часть текста, либо неконтролируемо растягивается на всю свободную область формы. Рассмотрим подробнее, почему так происходит, и разберем способы решения этой задачи для управляемых форм.

Почему многострочное поле не подстраивается под текст?

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

Выясним причину такого поведения. Оно обусловлено комбинацией настроек свойств самого элемента и его родительских групп:

  1. Растягивание на всю форму: Происходит из-за того, что у поля или у группы, в которой оно находится, свойство РастягиватьПоВертикали установлено в значение "Да" или "Авто". В этом случае платформа пытается заполнить элементом всё свободное пространство на экране.
  2. Ограничение в 3 строки: Возникает, когда растягивание по вертикали запрещено, а платформа применяет высоту по умолчанию. Свойство АвтоМаксимальнаяВысота для одиночных полей вне таблиц часто игнорируется платформой в зависимости от общих привязок других элементов формы.

Решение 1: Вывод текста в отдельную форму (типовой подход)

Посмотрим на пример того, как эта задача решается в типовых конфигурациях (например, в "1С:Бухгалтерии"). Там реализовано редактирование или просмотр поля неограниченной длины (например, поля "Комментарий") в отдельной многострочной форме.

Мы рекомендуем сделать аналогичный функционал через расширение и подключать для необходимых полей. Это очень удобно как для разработчика, так и для пользователя. На основной форме выводится лишь превью в несколько строк, а по кнопке открытия вызывается просторная форма для комфортного чтения всего текста.

Решение 2: Программное управление свойством "Высота"

Разберем по шагам вариант с программным вычислением. Высоту в строках можно задавать динамически при открытии формы или после чтения данных. Для этого программно подсчитывается количество строк в тексте с помощью функции СтрЧислоСтрок(). Обратите внимание, что для идеального результата иногда требуется оценить среднюю длину строки для учета автоматических переносов слов.

Посмотрим на пример кода для установки высоты элемента:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Вычисляем количество строк в текстовом реквизите
    ВычисленноеКоличествоСтрок = СтрЧислоСтрок(Объект.ТекстовоеПоле);
    
    // Предусмотрим минимальную высоту, чтобы поле не исчезло, если текст пустой
    Если ВычисленноеКоличествоСтрок < 2 Тогда
        ВычисленноеКоличествоСтрок = 2;
    КонецЕсли;

    // Устанавливаем высоту элемента формы
    Элементы.ТекстовоеПоле.Высота = ВычисленноеКоличествоСтрок;
КонецПроцедуры

Решение 3: Комбинирование ограничений свойств

Если программное вычисление вам не подходит, попробуем принудительно задать жесткие рамки для компоновщика форм. Для этого необходимо в свойствах элемента отключить свойство РастягиватьПоВертикали (установить значение "Нет"). Затем в свойстве Высота задать минимальное значение (например, 2 или 3), а в свойстве МаксимальнаяВысота установить разумный лимит (например, 10 или 15 строк).

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

Альтернативные элементы управления для режима "Только просмотр"

Если в вашей задаче поле используется исключительно для вывода информации (установлено ТолькоПросмотр = Истина), целесообразно использовать другие типы элементов управления, алгоритмы компоновки которых работают иначе:

  1. Декорация-надпись. Замените поле ввода на элемент формы с типом "Декорация" (Надпись). При включенном автоматическом переносе слов высота декорации часто подстраивается под текст гораздо более гибко, чем у поля ввода, не требуя выделения под себя всего экрана. Это идеальный вариант для вывода справочной информации на форму.
  2. Вывод текста через таблицу. Платформа отлично умеет подстраивать высоту строк в таблицах. Создайте на форме вспомогательную Таблицу Значений (как реквизит формы), состоящую из одной колонки и одной строки. Если для колонки включить свойства "Многострочный режим" и "Автовысота ячейки", текст гарантированно растянет эту единственную ячейку ровно по объему содержимого.
  3. Поле HTML-документа. Форматирование и вывод объемных текстов в HTML работает стабильнее, если требуется сложное оформление. Текст будет корректно переноситься, а при необходимости через DOM-объекты (например, считывая свойство clientHeight) можно получать реальную высоту отрисованного контента для идеальной подстройки размеров элемента.

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

← На главную