Разработчики 1С часто сталкиваются с ситуацией, когда стандартное Поле ввода в управляемых формах ведет себя не совсем так, как ожидается в современных интерфейсах. Даже если мы установим свойство Многострочный режим в значение Да, платформа не будет автоматически увеличивать высоту самого элемента при заполнении его текстом. Вместо этого в поле просто появится вертикальная полоса прокрутки, а высота останется фиксированной (обычно в одну или несколько строк, заданных в свойствах).
В этой статье мы подробно разберем, почему так происходит, и проанализируем несколько проверенных способов решения этой задачи: от использования альтернативных элементов управления до программного расчета высоты через скрытые объекты платформы.
Проанализируем механику работы управляемых форм. Позиционирование элементов в 1С 8.3 строится на принципах автоматического размещения. Свойство Растягивать по вертикали позволяет элементу занять все свободное место в своей группе, но оно не заставляет элемент менять свой размер в зависимости от объема данных внутри него. Для Поля ввода приоритетом является сохранение структуры формы, поэтому платформа «прячет» лишний текст за прокрутку. Для интерактивной проверки и отладки параметров элементов прямо в пользовательском сеансе можно использовать обработку для редактирования свойств открытых управляемых форм.
Рассмотрим по шагам основные стратегии преодоления этого ограничения.
Если ваша задача — просто вывести текст программно, чтобы пользователь мог его прочитать и скопировать, но не редактировать интерактивно, то лучше всего отказаться от Поля ввода в пользу декорации типа Поле надписи.
Выясним преимущества этого подхода:
Истина, элемент будет автоматически расширяться вниз, отодвигая нижние элементы формы.Истина (хотя это может изменить визуальный стиль) или просто используйте программную установку текста в реквизит, связанный с декорацией.Это один из самых надежных «хаков», который используют опытные разработчики. Суть метода заключается в том, чтобы заставить движок печати 1С рассчитать высоту текста за нас. Рассмотрим этот алгоритм подробнее:
Разберем последовательность действий в коде:
ТабличныйДокумент.Высота элемента формы.Пример кода для реализации такого расчета:
// Функция вычисляет необходимую высоту поля в строках
&НаСервере
Функция РассчитатьВысотуТекста(Знач ИсходныйТекст, Знач ШиринаПоля)
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область(1, 1);
Область.Текст = ИсходныйТекст;
Область.ШиринаКолонки = ШиринаПоля; // Примерная ширина поля на форме
Область.АвтоВысотаСтроки = Истина;
Область.ПереноситьТекст = Истина;
// Просим платформу рассчитать реальный вывод
ТабДок.ПроверитьВывод(Новый Массив);
// Возвращаем высоту, сконвертированную в условные единицы формы
Возврат Цел(ТабДок.Область(1, 1).ВысотаСтроки / 12); // Коэффициент подбирается опытным путем
КонецФункции
Если требуется максимальная гибкость, проанализируем вариант с использованием Поля HTML-документа. Этот элемент работает на движке браузера и позволяет использовать свойство scrollHeight, которое возвращает точную высоту контента в пикселях.
Посмотрим, как это реализовать:
<div> или <textarea> с прозрачными границами.ОписаниеОповещения или событие ПриНажатии.Этот метод позволяет избежать проблем с «лаптями» (неточными расчетами), так как учитывает шрифты, межстрочные интервалы и масштаб DPI монитора пользователя. Для готовой реализации такого подхода подойдёт расширяемый редактор форматированного текста для управляемых форм.
Рассмотрим более простой, но менее точный способ, предложенный участниками форума. Он подходит, если вы используете моноширинный шрифт (например, Courier New), где ширина каждого символа одинакова.
Алгоритм действий:
ПС).Пример упрощенного расчета:
&НаКлиенте
Процедура УстановитьВысотуПоля()
Текст = Объект.ДлинныйТекст;
СимволовВСтроке = 50; // Определяется экспериментально для конкретной ширины
КоличествоСтрок = СтрЧислоСтрок(Текст);
// Дополнительно учитываем длинные строки без переносов
МассивСтрок = СтрРазделить(Текст, Символы.ПС);
Для Каждого СтрокаТекста Из МассивСтрок Цикл
Если СтрДлина(СтрокаТекста) > СимволовВСтроке Тогда
КоличествоСтрок = КоличествоСтрок + Цел(СтрДлина(СтрокаТекста) / СимволовВСтроке);
КонецЕсли;
КонецЦикла;
Элементы.ПолеВводаТекста.Высота = КоличествоСтрок;
КонецПроцедуры
Работая с динамической высотой, важно помнить о нескольких критических моментах, которые могут испортить интерфейс:
1. Настройки группировки: Чтобы поле ввода действительно «расталкивало» другие элементы, оно должно находиться в группе с вертикальной компоновкой. Если родительская группа имеет фиксированную высоту, то увеличение высоты поля внутри нее просто приведет к появлению прокрутки у самой группы, а не к растяжению формы.
2. Масштабирование (DPI): Помните, что пользователи могут изменять масштаб формы (Ctrl + колесо мыши). Расчеты, сделанные в пикселях или пунктах через ТабличныйДокумент, могут потребовать корректировки на коэффициент масштаба текущего окна.
3. Интерактивный ввод: Если вам нужно, чтобы поле растягивалось прямо в процессе печати текста пользователем, используйте обработчик события ИзменениеТекстаРедактирования. Однако будьте осторожны: частый пересчет высоты и обновление формы могут вызвать «мерцание» интерфейса или задержки ввода (лаги).
Подводя итог, можно сказать: наиболее стабильным и визуально приятным решением для отображения текста является Поле надписи с включенной Автовысотой. Если же требуется полноценное редактирование, оптимальным выбором будет программный пересчет высоты через скрытый Табличный документ при открытии формы или изменении значения реквизита.