Почему урезается текст надписи при установке жирного шрифта в 1С и как это исправить?

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

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

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

Выясняем причину: почему графический движок обрезает текст?

Для того чтобы эффективно решить проблему, проанализируем ситуацию с точки зрения работы графической подсистемы платформы 1С. В Обычных формах отрисовка элементов во многом опирается на стандартные API-функции операционной системы Windows (GDI/GDI+). Когда мы программно меняем начертание шрифта, происходят следующие процессы:

  1. Изменение метрик символов: При применении жирного начертания (когда свойство Полужирный устанавливается в значение Истина) физическая ширина каждого отдельного глифа (символа) в пикселях увеличивается. Суммарная длина строки в пикселях может вырасти на 15–30% в зависимости от используемого шрифта.
  2. Отсутствие динамического пересчета границ элемента: В отличие от Управляемых форм, где интерфейс является декларативным и рассчитывается динамически, элементы Обычных форм имеют жестко заданные размеры (свойства Ширина и Высота), зафиксированные в пикселях или относительных единицах конфигуратора. Платформа 1С при изменении параметров шрифта не производит автоматический пересчет геометрических размеров самого контейнера Надпись.
  3. Механизм принудительного отсечения: Когда длина отрисовываемой строки превышает фактическую внутреннюю ширину области элемента управления, операционная система задействует стандартный флаг отрисовки текста с усечением. Текст обрезается по границе элемента, а в конец строки добавляется символ троеточия, сигнализирующий пользователю о том, что данные выведены не полностью.

Многие начинающие разработчики пытаются решить эту проблему настройкой привязок элемента формы, например, устанавливая привязку "Растягивать по горизонтали". Разберем по шагам, почему это не работает. Данная привязка отвечает исключительно за поведение элемента при изменении размеров всего окна пользователем. Если само окно не меняет размер, элемент управления сохраняет свои первоначальные размеры, заданные в Конфигураторе, и никак не адаптируется под динамически изменившуюся длину текста.

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

Решение 1. Резервирование ширины элемента в Конфигураторе

Самый простой и наименее трудозатратный способ — это превентивное увеличение размеров элемента управления непосредственно на этапе проектирования интерфейса. Если дизайн формы позволяет выделить дополнительное пространство, выполним следующие действия:

  1. Откроем форму в редакторе Конфигуратора.
  2. Выделим проблемный элемент Надпись.
  3. В палитре свойств или визуально с помощью мыши увеличим его ширину с запасом примерно в 20–30% от максимальной предполагаемой длины текста.

Преимущества: Не требует написания кода, не нагружает систему вычислениями при открытии формы.

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

Решение 2. Программный расчет ширины элемента

Если выводимый текст формируется динамически (например, получается из справочника или вычисляется в процессе работы алгоритма), нам потребуется написать код для динамического изменения свойства Ширина элемента формы.

Давайте посмотрим на пример реализации такого алгоритма:


// Получаем текст, который необходимо вывести на форму
ТекстНадписи = ВидЗаготовкиТекущийИнфо["Размер" + сч];
ДлинаТекста = СтрДлина(ТекстНадписи);

// Коэффициент подбирается экспериментально под конкретный шрифт и его размер.
// Для обычного шрифта Arial 8pt это примерно 6-7 пикселей на символ, 
// для жирного Arial 8pt коэффициент стоит увеличить до 9-10 пикселей.
КоэффициентШирины = 10; 

// Устанавливаем заголовок и новый шрифт
ЭлементыФормы["НадписьРазмер" + сч].Заголовок = ТекстНадписи;
ЭлементыФормы["НадписьРазмер" + сч].Шрифт = Новый Шрифт(ЭлементыФормы["НадписьРазмер" + сч].Шрифт, , , Истина);

// Динамически корректируем ширину элемента формы
ЭлементыФормы["НадписьРазмер" + сч].Ширина = ДлинаТекста * КоэффициентШирины;

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

Решение 3. Использование моноширинных шрифтов

Если дизайн вашей формы допускает использование технических шрифтов, отличных от стандартного Arial или MS Sans Serif, отличным решением станет переход на моноширинный шрифт (например, Courier New or Consolas).

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


ШрифтМоно = Новый Шрифт("Courier New", 9, Истина); // Жирный моноширинный шрифт
ЭлементыФормы["НадписьРазмер" + сч].Шрифт = ШрифтМоно;

ШиринаСимволаПиксели = 8; // Фиксированная ширина одного символа для данного размера шрифта
ЭлементыФормы["НадписьРазмер" + сч].Ширина = СтрДлина(ТекстНадписи) * ШиринаСимволаПиксели;

Решение 4. Замена надписи на Поле табличного документа

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

Проанализируем этот подход по шагам:

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

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


ТабДок = ЭлементыФормы.ПолеТабличногоДокументаРазмер;
ТабДок.Очистить();

// Создаем область для вывода текста
Область = ТабДок.ПолучитьОбласть("R1C1");
Ячейка = Область.ТекущаяОбласть;
Ячейка.Текст = ВидЗаготовкиТекущийИнфо["Размер" + сч];

// Задаем параметры шрифта
Ячейка.Шрифт = Новый Шрифт("Arial", 10, Истина); // Устанавливаем жирный шрифт

// Включаем автоматический перенос текста
Ячейка.РазмещениеТекста = РазмещениеТекстаТабличногоДокумента.Автоперенос;

// Выводим область в документ
ТабДок.Вывести(Область);

// Используем встроенный метод платформы для автоматического расчета высоты строк
ТабДок.АвтовысотаСтроки = Истина;

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

Решение 5. Использование Поля HTML-документа

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

Разберем пример реализации:


ТекстHTML = "<html><body style='font-family: Arial; font-size: 12px; margin: 0; padding: 0;'>"
          + "<strong>" + ВидЗаготовкиТекущийИнфо["Размер" + сч] + "</strong>"
          + "</body></html>";

ЭлементыФормы.ПолеHTMLНадпись.УстановитьТекст(ТекстHTML);

Использование HTML-разметки гарантирует, что текст никогда не будет некорректно обрезан операционной системой с выводом троеточия в неподходящем месте. Браузер автоматически перенесет длинный текст на новую строку или адаптирует его под границы контейнера.

Резюме и рекомендации

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

← На главную