Как реализовать автоматическое изменение высоты поля ввода в 1С (Управляемые формы) в зависимости от содержимого?

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

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

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

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

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

Рассмотрим по шагам основные стратегии преодоления этого ограничения.

Решение 1: Использование декорации «Поле надписи» (для режима просмотра)

Если ваша задача — просто вывести текст программно, чтобы пользователь мог его прочитать и скопировать, но не редактировать интерактивно, то лучше всего отказаться от Поля ввода в пользу декорации типа Поле надписи.

Выясним преимущества этого подхода:

  1. У декорации есть штатное свойство Автовысота. Если установить его в значение Истина, элемент будет автоматически расширяться вниз, отодвигая нижние элементы формы.
  2. Необходимо включить Многострочный режим.
  3. Для возможности выделения текста пользователем, установите свойство Гиперссылка в значение Истина (хотя это может изменить визуальный стиль) или просто используйте программную установку текста в реквизит, связанный с декорацией.

Решение 2: Программный расчет высоты через Табличный документ

Это один из самых надежных «хаков», который используют опытные разработчики. Суть метода заключается в том, чтобы заставить движок печати 1С рассчитать высоту текста за нас. Рассмотрим этот алгоритм подробнее:

Разберем последовательность действий в коде:

  1. Создаем в памяти объект ТабличныйДокумент.
  2. Записываем нужный текст в ячейку этого документа.
  3. Устанавливаем для области ячеек свойство АвтоВысотаСтроки.
  4. Измеряем полученную высоту и передаем ее в свойство Высота элемента формы.

Пример кода для реализации такого расчета:


// Функция вычисляет необходимую высоту поля в строках
&НаСервере
Функция РассчитатьВысотуТекста(Знач ИсходныйТекст, Знач ШиринаПоля)
    ТабДок = Новый ТабличныйДокумент;
    Область = ТабДок.Область(1, 1);
    Область.Текст = ИсходныйТекст;
    Область.ШиринаКолонки = ШиринаПоля; // Примерная ширина поля на форме
    Область.АвтоВысотаСтроки = Истина;
    Область.ПереноситьТекст = Истина;
    
    // Просим платформу рассчитать реальный вывод
    ТабДок.ПроверитьВывод(Новый Массив); 
    
    // Возвращаем высоту, сконвертированную в условные единицы формы
    Возврат Цел(ТабДок.Область(1, 1).ВысотаСтроки / 12); // Коэффициент подбирается опытным путем
КонецФункции

Решение 3: Динамическое управление через Поле HTML-документа

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

Посмотрим, как это реализовать:

Этот метод позволяет избежать проблем с «лаптями» (неточными расчетами), так как учитывает шрифты, межстрочные интервалы и масштаб DPI монитора пользователя. Для готовой реализации такого подхода подойдёт расширяемый редактор форматированного текста для управляемых форм.

Решение 4: Математический расчет по количеству символов

Рассмотрим более простой, но менее точный способ, предложенный участниками форума. Он подходит, если вы используете моноширинный шрифт (например, Courier New), где ширина каждого символа одинакова.

Алгоритм действий:

  1. Определяем ширину поля в символах (сколько букв помещается в одну строку при текущей ширине элемента).
  2. Делим общее количество символов в тексте на ширину строки.
  3. Учитываем количество принудительных переносов строк (символы ПС).
  4. Умножаем полученное количество строк на высоту одной строки.

Пример упрощенного расчета:


&НаКлиенте
Процедура УстановитьВысотуПоля()
    Текст = Объект.ДлинныйТекст;
    СимволовВСтроке = 50; // Определяется экспериментально для конкретной ширины
    КоличествоСтрок = СтрЧислоСтрок(Текст);
    
    // Дополнительно учитываем длинные строки без переносов
    МассивСтрок = СтрРазделить(Текст, Символы.ПС);
    Для Каждого СтрокаТекста Из МассивСтрок Цикл
        Если СтрДлина(СтрокаТекста) > СимволовВСтроке Тогда
            КоличествоСтрок = КоличествоСтрок + Цел(СтрДлина(СтрокаТекста) / СимволовВСтроке);
        КонецЕсли;
    КонецЦикла;
    
    Элементы.ПолеВводаТекста.Высота = КоличествоСтрок;
КонецПроцедуры

Важные нюансы и ограничения

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

1. Настройки группировки: Чтобы поле ввода действительно «расталкивало» другие элементы, оно должно находиться в группе с вертикальной компоновкой. Если родительская группа имеет фиксированную высоту, то увеличение высоты поля внутри нее просто приведет к появлению прокрутки у самой группы, а не к растяжению формы.

2. Масштабирование (DPI): Помните, что пользователи могут изменять масштаб формы (Ctrl + колесо мыши). Расчеты, сделанные в пикселях или пунктах через ТабличныйДокумент, могут потребовать корректировки на коэффициент масштаба текущего окна.

3. Интерактивный ввод: Если вам нужно, чтобы поле растягивалось прямо в процессе печати текста пользователем, используйте обработчик события ИзменениеТекстаРедактирования. Однако будьте осторожны: частый пересчет высоты и обновление формы могут вызвать «мерцание» интерфейса или задержки ввода (лаги).

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

← На главную