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

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

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

Анализ проблемы: почему стандартные настройки не помогают

В управляемом приложении 1С за компоновку элементов отвечает автоматический механизм. Когда мы размещаем поле надписи с типом Строка (особенно неограниченной длины) в горизонтальной группе, платформа пытается выделить ему достаточно места. Даже если мы установим РастягиватьПоГоризонтали = Ложь, поле часто резервирует под себя стандартную ширину, которая значительно превышает длину короткого текста. В результате между текстом и следующим элементом (например, флажком) образуется некрасивая «дыра».

Проанализируем ситуацию: если текст короткий (например, «Организация»), а поле зарезервировало место под 50 символов, ваши флажки окажутся в конце этого невидимого блока. Настройка АвтоМаксимальнаяШирина также не всегда решает вопрос «схлопывания» поля до минимально необходимого размера, так как она лишь ограничивает рост элемента вверх, но не заставляет его сжиматься под контент.

Решение 1: Программная установка ширины на основе длины строки

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


&НаСервере
Процедура УстановитьШиринуНадписи()
    // Получаем длину текста из данных, связанных с полем
    ТекстНадписи = Строка(Объект.ВидОрганизацииПредставление);
    КоличествоСимволов = СтрДлина(ТекстНадписи);
    
    // Используем поправочный коэффициент, так как ширина 1 единицы 
    // в 1С примерно равна средней ширине символа системного шрифта.
    // Коэффициент 1.1 - 1.3 обычно подбирается опытным путем.
    НужнаяШирина = Цел(КоличествоСимволов / 1.2);
    
    // Устанавливаем свойства программно
    ЭлементПеред = Элементы.ВидОрганизацииПредставление;
    ЭлементПеред.АвтоМаксимальнаяШирина = Ложь;
    ЭлементПеред.РастягиватьПоГоризонтали = Ложь;
    ЭлементПеред.Ширина = НужнаяШирина;
КонецПроцедуры

Разберем по шагам, что здесь происходит. Мы отключаем автоматическое управление шириной (АвтоМаксимальнаяШирина = Ложь) и запрещаем растягивание. Затем мы вычисляем значение Ширина. Важно помнить, что в 1С единица ширины — это не пиксель, а некая условная величина. Именно поэтому применяется деление на коэффициент (в примере 1.2), чтобы учесть разницу между «узкими» и «широкими» буквами.

Решение 2: Использование декораций вместо полей ввода

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

  1. Поместим надпись и флажки в одну Группу — Без отображения с группировкой Горизонтальная.
  2. Для самой группы установим РастягиватьПоГоризонтали = Ложь.
  3. Для элемента декорации установим свойство АвтоМаксимальнаяШирина = Истина и РастягиватьПоГоризонтали = Ложь.
  4. В некоторых случаях помогает установка свойства Ширина = 1. Платформа не сможет сжать текст меньше его фактического размера, но при этом минимизирует «пустое» пространство справа.

Решение 3: Точный расчет через табличный документ (продвинутый метод)

Если точность «на глаз» с коэффициентом 1.2 вас не устраивает (например, если в строке много широких букв «Ш» или узких «i»), можно применить метод «виртуальной печати». Выясним причину, почему это работает: табличный документ умеет вычислять ширину контента в зависимости от шрифта.

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

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

Этот метод более трудозатратен для сервера, поэтому его рекомендуется вызывать только при открытии формы или при редком изменении данных.

Нюансы работы в веб-клиенте

Проанализируем ситуацию с веб-клиентом. В браузере верстка управляемых форм преобразуется в HTML/CSS. Часто «лишняя» ширина возникает из-за того, что платформа назначает элементам минимальную ширину через стили (min-width). Если программная установка Ширина = 1 обрезает текст в тонком клиенте, то в веб-клиенте она может сработать идеально, так как браузер расширит div контейнера под содержимое. Однако для универсального решения лучше придерживаться программной установки расчетной ширины, как было описано в первом решении.

Важное замечание о производительности

При динамическом изменении свойств элементов формы (таких как Ширина) происходит перерисовка интерфейса. Если вы будете пересчитывать ширину в событии ПриИзменении поля, которое редактируется пользователем очень часто, это может привести к визуальным «скачкам» формы. Рекомендуем выполнять такие корректировки только для тех полей, которые заполняются программно или при инициализации формы.

Также стоит учитывать режим совместимости конфигурации. В версиях платформы ниже 8.3.15 поведение некоторых событий (например, связанных с активацией строк или обновлением элементов) может отличаться. Проверьте, что в вашей версии платформы свойство Ширина доступно для изменения и корректно интерпретируется интерфейсным движком.

← На главную