При разработке интерфейсов на платформе 1С:Предприятие в режиме Обычных форм разработчики часто сталкиваются с неприятным визуальным багом: при программном изменении начертания шрифта элемента управления Надпись на жирный, текст неожиданно усекается, а в конце строки появляется многоточие. Это происходит даже в тех случаях, когда визуально на форме кажется достаточно свободного места для размещения всей строки.
В рамках данной статьи мы подробно разберем физические причины возникновения этой проблемы, выясним, почему стандартные привязки и свойства формы не помогают в данном сценарии, а также рассмотрим пять практических способов решения этой проблемы без необходимости перевода конфигурации на Управляемые формы.
Для того чтобы эффективно решить проблему, проанализируем ситуацию с точки зрения работы графической подсистемы платформы 1С. В Обычных формах отрисовка элементов во многом опирается на стандартные API-функции операционной системы Windows (GDI/GDI+). Когда мы программно меняем начертание шрифта, происходят следующие процессы:
Полужирный устанавливается в значение Истина) физическая ширина каждого отдельного глифа (символа) в пикселях увеличивается. Суммарная длина строки в пикселях может вырасти на 15–30% в зависимости от используемого шрифта.Ширина и Высота), зафиксированные в пикселях или относительных единицах конфигуратора. Платформа 1С при изменении параметров шрифта не производит автоматический пересчет геометрических размеров самого контейнера Надпись.Многие начинающие разработчики пытаются решить эту проблему настройкой привязок элемента формы, например, устанавливая привязку "Растягивать по горизонтали". Разберем по шагам, почему это не работает. Данная привязка отвечает исключительно за поведение элемента при изменении размеров всего окна пользователем. Если само окно не меняет размер, элемент управления сохраняет свои первоначальные размеры, заданные в Конфигураторе, и никак не адаптируется под динамически изменившуюся длину текста.
Поскольку встроенного свойства Автоширина для надписей в Обычных формах не существует, нам придется использовать обходные пути. Рассмотрим подробнее каждый из них.
Самый простой и наименее трудозатратный способ — это превентивное увеличение размеров элемента управления непосредственно на этапе проектирования интерфейса. Если дизайн формы позволяет выделить дополнительное пространство, выполним следующие действия:
Надпись.Преимущества: Не требует написания кода, не нагружает систему вычислениями при открытии формы.
Недостатки: Подходит только для статического текста или строк с заранее известной максимальной длиной. Если текст формируется динамически и может быть очень длинным, этот метод не гарантирует стопроцентного решения проблемы.
Если выводимый текст формируется динамически (например, получается из справочника или вычисляется в процессе работы алгоритма), нам потребуется написать код для динамического изменения свойства Ширина элемента формы.
Давайте посмотрим на пример реализации такого алгоритма:
// Получаем текст, который необходимо вывести на форму
ТекстНадписи = ВидЗаготовкиТекущийИнфо["Размер" + сч];
ДлинаТекста = СтрДлина(ТекстНадписи);
// Коэффициент подбирается экспериментально под конкретный шрифт и его размер.
// Для обычного шрифта Arial 8pt это примерно 6-7 пикселей на символ,
// для жирного Arial 8pt коэффициент стоит увеличить до 9-10 пикселей.
КоэффициентШирины = 10;
// Устанавливаем заголовок и новый шрифт
ЭлементыФормы["НадписьРазмер" + сч].Заголовок = ТекстНадписи;
ЭлементыФормы["НадписьРазмер" + сч].Шрифт = Новый Шрифт(ЭлементыФормы["НадписьРазмер" + сч].Шрифт, , , Истина);
// Динамически корректируем ширину элемента формы
ЭлементыФормы["НадписьРазмер" + сч].Ширина = ДлинаТекста * КоэффициентШирины;
При использовании этого метода важно учитывать, что разные символы имеют разную ширину (например, буква "Ш" значительно шире буквы "І" или знака точки). Поэтому коэффициент подбирается с некоторым запасом, чтобы исключить обрезание строки при неблагоприятном наборе символов.
Если дизайн вашей формы допускает использование технических шрифтов, отличных от стандартного Arial или MS Sans Serif, отличным решением станет переход на моноширинный шрифт (например, Courier New or Consolas).
В моноширинных шрифтах ширина каждого символа строго одинакова. Это позволяет нам рассчитать идеальную ширину элемента с точностью до пикселя без необходимости закладывать избыточные коэффициенты запаса. Формула расчета ширины элемента в этом случае становится линейной и предсказуемой:
ШрифтМоно = Новый Шрифт("Courier New", 9, Истина); // Жирный моноширинный шрифт
ЭлементыФормы["НадписьРазмер" + сч].Шрифт = ШрифтМоно;
ШиринаСимволаПиксели = 8; // Фиксированная ширина одного символа для данного размера шрифта
ЭлементыФормы["НадписьРазмер" + сч].Ширина = СтрДлина(ТекстНадписи) * ШиринаСимволаПиксели;
Для реализации сложных интерфейсных решений, где текст может не только обрезаться, но и требовать переноса по словам или частичного выделения жирным шрифтом, стандартный элемент Надпись не подходит. Вместо него мы можем использовать элемент управления Поле табличного документа.
Проанализируем этот подход по шагам:
Поле табличного документа вместо стандартной надписи.Рассмотрим пример кода для программного вывода форматированного текста через табличный документ:
ТабДок = ЭлементыФормы.ПолеТабличногоДокументаРазмер;
ТабДок.Очистить();
// Создаем область для вывода текста
Область = ТабДок.ПолучитьОбласть("R1C1");
Ячейка = Область.ТекущаяОбласть;
Ячейка.Текст = ВидЗаготовкиТекущийИнфо["Размер" + сч];
// Задаем параметры шрифта
Ячейка.Шрифт = Новый Шрифт("Arial", 10, Истина); // Устанавливаем жирный шрифт
// Включаем автоматический перенос текста
Ячейка.РазмещениеТекста = РазмещениеТекстаТабличногоДокумента.Автоперенос;
// Выводим область в документ
ТабДок.Вывести(Область);
// Используем встроенный метод платформы для автоматического расчета высоты строк
ТабДок.АвтовысотаСтроки = Истина;
Этот метод полностью нивелирует проблему усечения текста, так как движок табличного документа 1С спроектирован для корректного расчета размеров ячеек под любые параметры шрифтов.
Еще один продвинутый способ создания адаптивных надписей в Обычных формах — применение элемента управления Поле HTML-документа. Этот контейнер использует для рендеринга движок встроенного браузера, который великолепно справляется с расчетом метрик любых шрифтов, включая жирные, курсивные и нестандартные начертания.
Разберем пример реализации:
ТекстHTML = "<html><body style='font-family: Arial; font-size: 12px; margin: 0; padding: 0;'>"
+ "<strong>" + ВидЗаготовкиТекущийИнфо["Размер" + сч] + "</strong>"
+ "</body></html>";
ЭлементыФормы.ПолеHTMLНадпись.УстановитьТекст(ТекстHTML);
Использование HTML-разметки гарантирует, что текст никогда не будет некорректно обрезан операционной системой с выводом троеточия в неподходящем месте. Браузер автоматически перенесет длинный текст на новую строку или адаптирует его под границы контейнера.
Мы рассмотрели различные варианты решения проблемы усечения текста при использовании жирного шрифта. Выбор конкретного метода зависит от архитектуры вашей формы: