Шрифт ячеек из кода: объект Шрифт, области, стили и оформление СКД

· 9 мин

Содержание

Чтобы программно изменить шрифт в табличном документе 1С, возьмите нужную область и присвойте её свойству Шрифт новый объект: ТабДок.Область("R2C3").Шрифт = Новый Шрифт("Arial", 12, Истина). Менять свойства существующего шрифта по одному нельзя: строка Область.Шрифт.Жирный = Истина упадёт с ошибкой, потому что Жирный, Размер и Имя у шрифта только для чтения.

Если нужно поменять одну характеристику и сохранить остальные, создайте шрифт на основании текущего: Новый Шрифт(Область.Шрифт, , , Истина). Так ячейка станет жирной, но сохранит гарнитуру и размер из макета. Всё ниже относится к платформе 8.3 и работает одинаково в любой конфигурации: БП, ЗУП, УТ или самописной.

Объекты встроенного языка, которые управляют шрифтом

В работе со шрифтом табличного документа участвуют четыре сущности. Их стоит различать, иначе код будет работать «через раз».

ОбъектЧто этоКак получить
ТабличныйДокументСам документ: реквизит формы, результат отчёта, печатная формаНовый ТабличныйДокумент, реквизит формы, ПолучитьМакет()
ОбластьЯчеекТабличногоДокументаПрямоугольник ячеек: одна ячейка, строка, колонка, диапазонМетод Область()
ШрифтНеизменяемый объект: имя, размер, жирность, курсив и т.д.Конструктор Новый Шрифт(...) или свойство области
ШрифтыСтиляШрифты из элементов стиля конфигурации и платформыШрифтыСтиля.ИмяЭлемента

У области кроме Шрифт есть соседние свойства оформления: ЦветТекста, ЦветФона, ГоризонтальноеПоложение. Их часто меняют вместе со шрифтом, например для подсветки строк.

Два конструктора шрифта

📌 По параметрам. Порядок такой: Новый Шрифт(Имя, Размер, Жирный, Наклонный, Подчеркивание, Зачеркивание, Масштаб). Любой параметр можно пропустить запятой.

📌 На основании другого шрифта. Первым идёт исходный шрифт, дальше тот же список: Новый Шрифт(ИсходныйШрифт, Имя, Размер, Жирный, ...). Незаданные параметры берутся из исходного.

Из-за сдвига на одну позицию во втором варианте Жирный стоит четвёртым, а не третьим. На этом спотыкаются чаще всего.

Прочитать текущие значения можно свободно: Область.Шрифт.Имя, Область.Шрифт.Размер, Область.Шрифт.Жирный. Запрещена только запись.

Как изменить шрифт одной ячейки программно

Ячейку адресуют тремя способами:

  • 🔹 по имени в формате RC: ТабДок.Область("R2C3") — строка 2, колонка 3;
  • 🔹 по координатам: ТабДок.Область(2, 3, 2, 3) — верх, лево, низ, право;
  • 🔹 по имени области из макета, если ячейке дали имя в конфигураторе.

Пример для формы с реквизитом ТабличныйДокумент типа «Табличный документ»:

&НаСервере
Процедура СформироватьНаСервере()

    ТабДок = ТабличныйДокумент;
    ТабДок.Очистить();

    Заголовок = ТабДок.Область("R1C1");
    Заголовок.Текст = "Остатки по складу";
    Заголовок.Шрифт = Новый Шрифт("Arial", 14, Истина);

    Примечание = ТабДок.Область("R2C1");
    Примечание.Текст = "Данные на начало дня";
    // Курсив, размер и гарнитура остаются как были
    Примечание.Шрифт = Новый Шрифт(Примечание.Шрифт, , , , Истина);

КонецПроцедуры

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

Размер задаётся в пунктах, как в Word. Параметр Масштаб — это ширина символов в процентах (100 — обычная), а не размер. Если хотите крупнее, меняйте Размер.

Массовое изменение шрифта: строки, колонки, диапазон

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

Диапазон, строка и колонка

// Диапазон: строки 5–20, колонки 1–6
ТабДок.Область(5, 1, 20, 6).Шрифт = Новый Шрифт("Arial", 9);

// То же через строковое имя
ТабДок.Область("R5C1:R20C6").Шрифт = Новый Шрифт("Arial", 9);

// Вся строка 3 и вся колонка 2
ТабДок.Область("R3").Шрифт = Новый Шрифт(, , Истина);
ТабДок.Область("C2").Шрифт = Новый Шрифт("Courier New", 10);

Новый Шрифт(, , Истина) без имени и размера даёт жирный автошрифт. Ячейки получат стандартную гарнитуру и размер, но станут жирными.

Весь документ целиком

Границы заполненной части дают свойства ВысотаТаблицы и ШиринаТаблицы:

ВесьДок = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
ВесьДок.Шрифт = Новый Шрифт("Arial", 8);

Учтите: такая замена сотрёт жирность заголовков и итогов. Ячейки получат один и тот же шрифт целиком.

Сменить размер и сохранить остальное оформление

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

Для НомСтр = 1 По ТабДок.ВысотаТаблицы Цикл
    Для НомКол = 1 По ТабДок.ШиринаТаблицы Цикл
        Ячейка = ТабДок.Область(НомСтр, НомКол, НомСтр, НомКол);
        Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт, , 8);
    КонецЦикла;
КонецЦикла;

На документе в 2 000 строк и 10 колонок это 20 000 обращений к областям. Работает, но ощутимо медленнее, поэтому такой цикл выполняйте на сервере и один раз, а не при каждом обновлении формы.

Если шрифт уменьшают только ради того, чтобы таблица влезла на лист, проще включить ТабДок.АвтоМасштаб = Истина или задать ТабДок.МасштабПечати. Экранный вид при этом не меняется, а печатная форма ужимается до ширины страницы.

Шрифт в макете и шрифты стиля

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

Изменение области макета перед выводом

Обычная схема печатной формы: получить макет, взять область, заполнить параметры, вывести. Шрифт можно поменять прямо в полученной области:

Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Область("R1C2").Шрифт = Новый Шрифт(ОбластьСтрока.Область("R1C2").Шрифт, , , Истина);
ТабДок.Вывести(ОбластьСтрока);

ПолучитьОбласть() возвращает отдельный маленький табличный документ, поэтому нумерация ячеек в нём начинается с R1C1, а не с номера строки в макете.

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

Изменение уже выведенных строк

Второй путь — вывести область как есть, а потом найти её в итоговом документе. После Вывести() номер последней строки равен ТабДок.ВысотаТаблицы:

ТабДок.Вывести(ОбластьИтог);
ТабДок.Область(ТабДок.ВысотаТаблицы, 1, ТабДок.ВысотаТаблицы, 6).Шрифт = Новый Шрифт(, 11, Истина);

Это удобно, когда решение об оформлении принимается после подсчёта, например после итога по группе.

Шрифты стиля

Жёстко заданное имя "Arial" не меняется вместе с темой оформления. Если нужна единая гарнитура по всей конфигурации, создайте в ветке Общие → Элементы стиля элемент с видом «Шрифт», например ШрифтИтогов, и используйте его:

ТабДок.Область("R10C1:R10C6").Шрифт = ШрифтыСтиля.ШрифтИтогов;

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

Шрифт в тонком клиенте, веб-клиенте и при выводе на сервере

Объекты ТабличныйДокумент и Шрифт доступны и на клиенте, и на сервере. Но где выполнять код, влияет на скорость и на то, как шрифт будет выглядеть.

Где выполняетсяЧто учесть
Сервер (&НаСервере)Лучшее место для формирования и массового оформления: один серверный вызов вместо сотен
Тонкий клиент WindowsОтрисовка шрифтами, установленными на компьютере пользователя
Тонкий клиент Linux / macOSНет Windows-шрифтов, будет подмена, ширина текста может измениться
Веб-клиентРисует браузер. Размеры и межстрочные интервалы чуть отличаются, ширину колонок делайте с запасом
Запись в PDF на сервереИспользуются шрифты сервера, а не пользователя

Главная ловушка в последней строке. Документ, который на экране выглядит правильно, при ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) на сервере под Linux выходит с другой гарнитурой или с поехавшей вёрсткой. На сервере просто нет Arial и Times New Roman.

Решение — установить на сервер те же шрифты, что используются в макетах. В Ubuntu это пакет ttf-mscorefonts-installer. После установки перезапустите службу сервера 1С, чтобы рабочие процессы увидели новые шрифты.

Перезапуск службы сервера 1С обрывает сеансы всех пользователей. Делайте это вечером или в согласованное технологическое окно, предупредив людей заранее.

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

Ошибки при программном изменении шрифта

Диагностика: выберите симптом

Готовые решения для типовых задач

Отрицательные суммы красным жирным

Классическая задача для отчёта по взаиморасчётам. Исходные шрифт и цвет запоминаем до цикла, чтобы не протащить оформление на следующие строки:

Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ЯчейкаСумма = ОбластьСтрока.Область("R1C4");

ШрифтОбычный = ЯчейкаСумма.Шрифт;
ШрифтЖирный = Новый Шрифт(ШрифтОбычный, , , Истина);
ЦветОбычный = ЯчейкаСумма.ЦветТекста;

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
    Если СтрокаДанных.Сумма < 0 Тогда
        ЯчейкаСумма.Шрифт = ШрифтЖирный;
        ЯчейкаСумма.ЦветТекста = WebЦвета.Красный;
    Иначе
        ЯчейкаСумма.Шрифт = ШрифтОбычный;
        ЯчейкаСумма.ЦветТекста = ЦветОбычный;
    КонецЕсли;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Шрифт ШрифтЖирный создаётся один раз до цикла. Создавать его на каждой итерации нет смысла: объект неизменяемый, и одним экземпляром можно оформить сколько угодно ячеек.

Итоговая строка крупнее и жирнее

ТабДок.Вывести(ОбластьИтого);
НомерИтога = ТабДок.ВысотаТаблицы;
ОбластьИтогаВДок = ТабДок.Область(НомерИтога, 1, НомерИтога, 6);
ОбластьИтогаВДок.Шрифт = Новый Шрифт(ОбластьИтогаВДок.Шрифт, , 11, Истина);

Здесь шрифт строится на основании шрифта первой ячейки строки и присваивается всем шести. Если ячейки итоговой строки в макете оформлены по-разному, используйте цикл по колонкам.

Отчёт на СКД: шрифт через условное оформление

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

Настройки = КомпоновщикНастроек.Настройки;
ЭлементУО = Настройки.УсловноеОформление.Элементы.Добавить();

ПолеУО = ЭлементУО.Поля.Элементы.Добавить();
ПолеУО.Поле = Новый ПолеКомпоновкиДанных("Сумма");

Отбор = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
Отбор.ПравоеЗначение = 0;

ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина));
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

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

Моноширинный шрифт для кодов и номеров

Артикулы, номера счетов и коды удобнее читать моноширинным шрифтом: символы стоят ровно друг под другом.

ТабДок.Область(2, 1, ТабДок.ВысотаТаблицы, 1).Шрифт = Новый Шрифт("Courier New", 9);

Колонка 1 со второй строки до конца документа получит Courier New, шапка в первой строке останется как была.

Частые вопросы

Можно ли сделать жирным только одно слово внутри ячейки?
Свойство Шрифт задаёт оформление ячейки целиком. Если нужно выделить часть текста, разнесите его по двум соседним ячейкам или объедините ячейки в макете и оформите каждую часть отдельно.
Как узнать, какой шрифт сейчас стоит в ячейке?
Прочитайте свойства шрифта области: Область.Шрифт.Имя, Область.Шрифт.Размер, Область.Шрифт.Жирный. Читать их можно, запрещена только запись.
Как вернуть ячейке исходный шрифт после изменений?
Сохраните шрифт в переменную до изменения и присвойте его обратно. Объект неизменяемый, поэтому сохранённая ссылка не испортится от последующих правок.
Почему в печатной форме шрифт другой, чем на экране?
Чаще всего PDF или печать формируются на сервере, где нет нужного шрифта, и платформа подставляет замену. Установите на сервер шрифты, используемые в макетах.
Можно ли поменять шрифт отчёта без изменения конфигурации?
Для отчётов на СКД — да: условное оформление настраивается в настройках варианта отчёта прямо в пользовательском режиме. Для печатных форм на макетах без доработки или расширения шрифт не поменять.