Как установить жирный шрифт для ячейки в ТабличномПоле 1С++

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Анализ типичных ошибок при настройке жирности шрифта

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


// Попытка 1:
ОформлениеСтроки.Ячейки.КолвоФакт.Жирный = 1;
// Ошибка: Поле агрегатного объекта не обнаружено (Жирный)

// Попытка 2:
ОформлениеСтроки.Ячейки.КолвоФакт.Шрифт.Жирный = 1;
// Ошибка: Попытка присвоить значение недоступной для записи переменной (Жирный)

Выясним причину такого поведения компоненты:

  1. Объект ОформлениеЯчейки не содержит отдельного свойства Жирный. Все типографические параметры текста (гарнитура, размер, начертание) инкапсулированы внутри объекта Шрифт.
  2. Свойства самого объекта Шрифт (такие как Жирный, Размер, Имя) являются свойствами только для чтения. Компонента защищает экземпляр шрифта от динамической модификации «на лету», чтобы не нарушать отрисовку интерфейса.

Следовательно, для изменения начертания текста нельзя просто изменить флаг жирности у текущего шрифта — необходимо присвоить свойству Шрифт ячейки заранее подготовленный экземпляр нового шрифта.

Создание и инициализация объекта шрифта

Новые шрифты в 1С++ формируются с использованием служебного механизма — ФабрикаОбъектов. Рассмотрим два основных способа создания шрифта с жирным начертанием.

Способ 1. Создание шрифта с явным указанием параметров

Если параметры шрифта жестко заданы стандартами оформления, вызовем метод фабрики, передав имя шрифта, размер и флаг жирности:


Фабрика = СоздатьОбъект("ФабрикаОбъектов");
ШрифтЖирный = Фабрика.Шрифт("Arial", 10, 1);

Метод Шрифт принимает параметры в следующем порядке: имя гарнитуры, размер в пунктах, жирность (1 — жирный, 0 — обычный), наклонный, подчеркнутый, зачеркнутый.

Способ 2. Клонирование на основе базового шрифта (рекомендуемый подход)

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


Фабрика = СоздатьОбъект("ФабрикаОбъектов");
ШрифтЖирный = Фабрика.Шрифт(ТаблПоле.Шрифт, , , 1);

В этом случае первым параметром передается исходный объект-образец, а четвертым параметром устанавливается признак жирности.

Критически важное правило: предотвращение утечек ресурсов GDI

Обратите особое внимание на производительность и стабильность работы приложения. Процедура ТаблПолеПриВыводеСтроки вызывается платформой непрерывно: при каждом скролле, перерисовке окна или перемещении курсора по списку.

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

  1. Существенное падение скорости прокрутки и подвисание интерфейса.
  2. Быстрое исчерпание пула дескрипторов Windows (GDI handles), что неминуемо приведет к аварийному завершению работы 1С:Предприятия с критической ошибкой.

Экземпляры шрифтов создаются ровно один раз при инициализации формы (например, в предопределенной процедуре ПриОткрытии) и сохраняются в переменных модуля формы.

Пошаговый пример реализации в модуле формы

Соберем все элементы воедино и рассмотрим готовый рабочий пример оформления ячейки в табличном поле.


Перем мШрифтЖирный;
Перем мШрифтОбычный;

Процедура ПриОткрытии()
    // Инициализируем шрифты один раз при открытии формы
    Фабрика = СоздатьОбъект("ФабрикаОбъектов");
    
    // Получаем базовый шрифт таблицы для возврата обычного состояния
    мШрифтОбычный = ТаблПоле.Шрифт;
    
    // Создаем жирную копию шрифта табличного поля
    мШрифтЖирный = Фабрика.Шрифт(ТаблПоле.Шрифт, , , 1);
КонецПроцедуры

Процедура ТаблПолеПриВыводеСтроки(ТаблПоле, ОформлениеСтроки, ДанныеСтроки, Регион)
    // Проверяем условие, по которому требуется выделить ячейку
    Если ДанныеСтроки.КолвоФакт <> ДанныеСтроки.КолвоПоДок Тогда
        ОформлениеСтроки.Ячейки.КолвоФакт.Шрифт = мШрифтЖирный;
        ОформлениеСтроки.Ячейки.КолвоФакт.ЦветТекста = RGB(255, 69, 0);
    Иначе
        // Обязательно возвращаем стандартное оформление при невыполнении условия
        ОформлениеСтроки.Ячейки.КолвоФакт.Шрифт = мШрифтОбычный;
        ОформлениеСтроки.Ячейки.КолвоФакт.ЦветТекста = RGB(0, 0, 0);
    КонецЕсли;
КонецПроцедуры

Особенности поведения и рекомендации по отображению

При работе со шрифтами в табличном поле учтем несколько важных нюансов:

  1. Иерархия приоритетов: оформление отдельной ячейки (ОформлениеСтроки.Ячейки.<Имя>.Шрифт) имеет наивысший приоритет. Оно перекрывает оформление всей строки (ОформлениеСтроки.Шрифт) и базовый шрифт самого элемента управления (ТабличноеПоле.Шрифт).
  2. Сброс оформления: табличное поле оптимизирует память и переиспользует объекты строк при скролле. Если не предусмотреть ветку Иначе со сбросом шрифта в исходное состояние, ячейки могут оставаться жирными даже в тех строках, где условие не выполнено.
  3. Ширина колонок: полужирные символы занимают больше пикселей по ширине, чем стандартные. Если колонка настроена без запаса ширины, длинный текст с жирным начертанием может перестать помещаться и начнет обрезаться. При этом высота строки рассчитывается по базовому шрифту таблицы и не увеличивается автоматически при изменении начертания в конкретной ячейке.
← На главную