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

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

При разработке печатных форм или отчетов в 1С:Предприятии программисты часто сталкиваются с необходимостью выделить определенные данные жирным шрифтом. Казалось бы, логично обратиться к свойству Полужирный напрямую через объект Шрифт, однако при попытке выполнить код Обл.Шрифт.Полужирный = Истина; система выдает досадную ошибку: «Поле объекта недоступно для записи». В этой статье мы подробно разберем, почему возникает эта ситуация, и научимся правильно управлять оформлением текста в ячейках.

Выясняем причину: почему нельзя просто изменить свойство?

Проанализируем ситуацию с точки зрения архитектуры платформы 1С. Основная причина ошибки кроется в том, что объект Шрифт (как и некоторые другие объекты оформления, например, Цвет) является неизменяемым (immutable). Это означает, что после того как объект был создан и присвоен области табличного документа, вы не можете модифицировать его отдельные свойства (жирность, наклон, размер).

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

Решение проблемы через конструктор объекта Шрифт

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


Новый Шрифт(<ИмяШрифта>, <Размер>, <Полужирный>, <Наклонный>, <Подчеркнутый>, <Зачеркнутый>, <Масштаб>)

Теперь разберем по шагам, как применить это в коде. Допустим, нам нужно сделать область R1C1:R1C4 жирной, используя шрифт Arial размером 10.


ИнформацияОбмена = "Информация о инициаторе:";
Обл = ТабдокВыгрузка.Область("R1C1:R1C4");
Обл.Текст = ИнформацияОбмена;

// Вместо прямой записи в свойство создаем новый объект
Обл.Шрифт = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь);

Универсальный способ: сохранение исходного оформления

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

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


// Берем текущий шрифт области и создаем на его базе новый с признаком жирности
Обл.Шрифт = Новый Шрифт(Обл.Шрифт, , Истина);

В данном случае мы передаем в конструктор объект Обл.Шрифт в качестве первого параметра. Второй параметр (размер) мы оставляем пустым (запятая), а в третьем параметре указываем Истина для жирности. Система сама подставит все недостающие данные из исходного шрифта.

Оптимизация производительности при работе с большими отчетами

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

Рассмотрим правильный алгоритм оптимизации:

  1. Создаем объект шрифта один раз до начала цикла.
  2. Внутри цикла просто присваиваем уже готовую переменную свойству ячейки.

Посмотрим на пример кода:


// Подготавливаем эталонный жирный шрифт заранее
ЖирныйШрифт = Новый Шрифт(ТабдокВыгрузка.Область("R1C1").Шрифт, , Истина);

Для Каждого СтрокаДанных Из СписокДокументов Цикл
    // Выводим строку...
    ТекущаяОбласть = ТабдокВыгрузка.Область(НомерСтроки, 1);
    ТекущаяОбласть.Текст = СтрокаДанных.Наименование;
    
    // Присваиваем заранее созданный объект (быстро)
    ТекущаяОбласть.Шрифт = ЖирныйШрифт;
КонецЦикла;

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

Для соблюдения единообразия интерфейса в системе 1С рекомендуется использовать не произвольные названия шрифтов (вроде "Times New Roman"), а системные шрифты из библиотеки стилей. Это гарантирует, что на любом компьютере, независимо от установленных шрифтов в операционной системе, ваш отчет будет выглядеть корректно.

Примеры использования системных шрифтов:


// Использование стандартного шрифта текста из стиля
Обл.Шрифт = Новый Шрифт(БиблиотекаСтилей.ШрифтТекста, , Истина);

// Использование специального шрифта для заголовков
Обл.Шрифт = БиблиотекаСтилей.ШрифтЗаголовка;

Альтернативные подходы к оформлению

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

  1. Оформление в макете: Если структура отчета статична, проще всего выделить ячейки жирным непосредственно в конфигураторе, в макете табличного документа. Тогда программный код вообще не потребуется.
  2. Условное оформление в СКД: Если ваш отчет строится на базе Системы компоновки данных, жирность настраивается на вкладке «Условное оформление». Там можно задать условие (например, «Сумма > 100 000») и указать стиль оформления. Это гибко и позволяет пользователю самому менять настройки оформления без участия программиста.
  3. Именованные области: Вы можете создать в макете именованную ячейку с нужным шрифтом и использовать её как шаблон при выводе данных методом Заполнить() или Вывести().

Подведем итоги

Мы выяснили, что ошибка «Поле объекта недоступно для записи» при работе со шрифтом — это не баг, а особенность работы с неизменяемыми объектами в 1С. Чтобы сделать текст жирным, всегда используйте конструктор Новый Шрифт. Помните о производительности и старайтесь не создавать объекты внутри циклов без необходимости. Используя метод создания шрифта на основе существующего, вы сохраните целостность оформления вашего документа и сделаете код более чистым и понятным.

← На главную