При разработке печатных форм или отчетов в 1С:Предприятии программисты часто сталкиваются с необходимостью выделить определенные данные жирным шрифтом. Казалось бы, логично обратиться к свойству Полужирный напрямую через объект Шрифт, однако при попытке выполнить код Обл.Шрифт.Полужирный = Истина; система выдает досадную ошибку: «Поле объекта недоступно для записи». В этой статье мы подробно разберем, почему возникает эта ситуация, и научимся правильно управлять оформлением текста в ячейках.
Проанализируем ситуацию с точки зрения архитектуры платформы 1С. Основная причина ошибки кроется в том, что объект Шрифт (как и некоторые другие объекты оформления, например, Цвет) является неизменяемым (immutable). Это означает, что после того как объект был создан и присвоен области табличного документа, вы не можете модифицировать его отдельные свойства (жирность, наклон, размер).
Для того чтобы изменить начертание текста в ячейке, нам необходимо не редактировать старый шрифт, а создать совершенно новый экземпляр объекта Шрифт с нужными нам параметрами и присвоить его свойству Шрифт выбранной области. Это фундаментальное правило работы с табличными документами, которое нужно запомнить.
Рассмотрим основной способ решения задачи, предложенный в обсуждении. Платформа предоставляет нам специальный конструктор для создания новых шрифтов. Мы можем задать все параметры вручную. Посмотрим на синтаксис конструктора, который описан в синтакс-помощнике:
Новый Шрифт(<ИмяШрифта>, <Размер>, <Полужирный>, <Наклонный>, <Подчеркнутый>, <Зачеркнутый>, <Масштаб>)
Теперь разберем по шагам, как применить это в коде. Допустим, нам нужно сделать область R1C1:R1C4 жирной, используя шрифт Arial размером 10.
ИнформацияОбмена = "Информация о инициаторе:";
Обл = ТабдокВыгрузка.Область("R1C1:R1C4");
Обл.Текст = ИнформацияОбмена;
// Вместо прямой записи в свойство создаем новый объект
Обл.Шрифт = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь);
Зачастую мы не хотим заново указывать название шрифта и его размер, особенно если они уже настроены в макете. В 1С существует очень удобная форма конструктора, которая позволяет создать новый шрифт на основании существующего. Это позволяет изменить только одно свойство (например, сделать текст жирным), сохранив все остальные настройки (размер, имя шрифта, наклон) нетронутыми.
Проанализируем следующий пример, который является наиболее предпочтительным в профессиональной разработке:
// Берем текущий шрифт области и создаем на его базе новый с признаком жирности
Обл.Шрифт = Новый Шрифт(Обл.Шрифт, , Истина);
В данном случае мы передаем в конструктор объект Обл.Шрифт в качестве первого параметра. Второй параметр (размер) мы оставляем пустым (запятая), а в третьем параметре указываем Истина для жирности. Система сама подставит все недостающие данные из исходного шрифта.
Если вам необходимо вывести тысячи строк и в каждой из них выделить ячейку жирным шрифтом, крайне не рекомендуется вызывать Новый Шрифт внутри цикла. Создание объекта — это ресурсозатратная операция. Если делать это 10 000 раз, формирование отчета может существенно замедлиться.
Рассмотрим правильный алгоритм оптимизации:
Посмотрим на пример кода:
// Подготавливаем эталонный жирный шрифт заранее
ЖирныйШрифт = Новый Шрифт(ТабдокВыгрузка.Область("R1C1").Шрифт, , Истина);
Для Каждого СтрокаДанных Из СписокДокументов Цикл
// Выводим строку...
ТекущаяОбласть = ТабдокВыгрузка.Область(НомерСтроки, 1);
ТекущаяОбласть.Текст = СтрокаДанных.Наименование;
// Присваиваем заранее созданный объект (быстро)
ТекущаяОбласть.Шрифт = ЖирныйШрифт;
КонецЦикла;
Для соблюдения единообразия интерфейса в системе 1С рекомендуется использовать не произвольные названия шрифтов (вроде "Times New Roman"), а системные шрифты из библиотеки стилей. Это гарантирует, что на любом компьютере, независимо от установленных шрифтов в операционной системе, ваш отчет будет выглядеть корректно.
Примеры использования системных шрифтов:
// Использование стандартного шрифта текста из стиля
Обл.Шрифт = Новый Шрифт(БиблиотекаСтилей.ШрифтТекста, , Истина);
// Использование специального шрифта для заголовков
Обл.Шрифт = БиблиотекаСтилей.ШрифтЗаголовка;
Помимо программного назначения шрифта через объект Область, существуют и другие способы, которые в определенных ситуациях будут более правильными:
Заполнить() или Вывести().Мы выяснили, что ошибка «Поле объекта недоступно для записи» при работе со шрифтом — это не баг, а особенность работы с неизменяемыми объектами в 1С. Чтобы сделать текст жирным, всегда используйте конструктор Новый Шрифт. Помните о производительности и старайтесь не создавать объекты внутри циклов без необходимости. Используя метод создания шрифта на основе существующего, вы сохраните целостность оформления вашего документа и сделаете код более чистым и понятным.