Шрифт в табличном документе 1С из кода: макеты, стили, СКД

· 9 мин

Содержание

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

Чаще всего шрифт приходится менять в четырёх местах: в печатной форме из макета, в готовом табличном документе, в отчёте на СКД и в типовой печатной форме, которую нельзя трогать в основной конфигурации. Всё это относится к платформе 8.3 и работает одинаково в любой конфигурации: БП 3.0, ЗУП 3.1, УТ 11.

Как устроен шрифт в табличном документе

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

Что нужно знать до написания кода:

  • 🔒 Шрифт — неизменяемый объект. Строка Область.Шрифт.Размер = 12 упадёт с ошибкой Поле объекта недоступно для записи (Размер).
  • 🧩 Конструктор Новый Шрифт(<Образец>, <Имя>, <Размер>, <Полужирный>, <Наклонный>, <Подчеркивание>, <Зачеркивание>, <Масштаб>) берёт за основу шрифт-образец и меняет только те параметры, которые вы передали. Пропущенные остаются как у образца.
  • 📄 ПолучитьМакет() возвращает копию макета. Правки шрифта в ней живут только до конца процедуры и не попадают в конфигурацию.
  • 🖥 Объект Шрифт доступен и на клиенте, и на сервере, так что печатную форму можно оформлять там, где её формируют, обычно в модуле менеджера на сервере.

Порядок параметров конструктора удобно держать перед глазами:

ПозицияПараметрПример значения
1ОбразецОбласть.Шрифт
2Имя"Arial"
3Размер10
4ПолужирныйИстина
5НаклонныйЛожь
6ПодчеркиваниеЛожь
7ЗачеркиваниеЛожь
8Масштаб100

Смена шрифта в объекте ТабличныйДокумент

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

Шрифт ячейки в области до вывода

Если ячейке в макете дано имя (свойство Имя в палитре свойств ячейки), к ней обращаются через коллекцию Области:

Макет = ПолучитьМакет("ПФ_MXL_Счет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.НомерДокумента = Документ.Номер;

// Заголовок: тот же шрифт, но 14 пт и полужирный
Ячейка = ОбластьШапка.Области.Заголовок;
Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт, , 14, Истина);

ТабДок.Вывести(ОбластьШапка);

Имени у ячейки нет — берите адрес. Координаты считаются от левого верхнего угла полученной области, а не всего макета:

ОбластьШапка.Область("R2C3").Шрифт = Новый Шрифт(, "Times New Roman", 12);

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

Шрифт всего документа после вывода

Когда документ уже собран, его размеры известны из свойств ВысотаТаблицы и ШиринаТаблицы. Один вызов меняет шрифт у всех ячеек:

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

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

Процедура СменитьГарнитуру(ТабДок, ИмяШрифта) Экспорт

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

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

Обход по ячейкам медленный: документ в 2 000 строк и 15 колонок даёт 30 000 обращений. Для больших отчётов меняйте шрифт целыми строками, если в строке одно оформление, или вызывайте процедуру только для нужного диапазона.

Шрифты из элементов стиля

Жёстко прописанное "Arial", 9 плохо переживает смену стиля и вариантов интерфейса. Типовые конфигурации на БСП хранят шрифты в элементах стиля: ветка Общие → Элементы стиля в конфигураторе.

В коде к ним обращаются через глобальное свойство ШрифтыСтиля:

Ячейка = ОбластьИтого.Области.Итого;
Ячейка.Шрифт = Новый Шрифт(ШрифтыСтиля.ВажнаяНадписьШрифт, , 11);

Имя элемента стиля должно реально быть в вашей конфигурации. Посмотреть список можно в той же ветке «Элементы стиля»: элементы с типом «Шрифт» и есть доступные шрифты.

Есть и способ без кода. В редакторе макета у ячейки в свойстве «Шрифт» можно выбрать не конкретную гарнитуру, а элемент стиля. Тогда оформление меняется в одном месте, в самом элементе стиля, и подтягивается во все макеты, где он использован.

ПодходКогда подходитМинус
Шрифт задан в макетеОформление постоянноеПравка только через конфигуратор или расширение
Новый Шрифт(...) в кодеШрифт зависит от данныхГарнитура прописана в коде
Элемент стиляЕдиный вид во всех формахНужен свой элемент стиля в конфигурации

Шрифт в отчётах на системе компоновки данных

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

Условное оформление

Это штатный путь. Шрифт — такой же параметр оформления, как цвет текста. Пример: выделить полужирным строки, где сумма больше 100 000:

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

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

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

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

Если список полей оставить пустым, оформление применится ко всей строке. Тот же элемент можно создать без кода: в пользовательских настройках отчёта на вкладке условного оформления параметр «Шрифт» выбирается из списка.

Макеты в схеме компоновки

На вкладке «Макеты» схемы компоновки создают макет поля, группировки или заголовка и рисуют его так же, как обычный табличный макет, со своим шрифтом. Это удобно, когда оформление итоговой строки или шапки сильно отличается от остального отчёта.

Обработка готового результата

Если отчёт выводится программно, через ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, шрифт можно поправить после вывода. Подойдёт процедура СменитьГарнитуру из раздела выше: на вход идёт тот же ТабличныйДокумент.

В отчётах БСП результат формируется в модуле отчёта, а не в вашей обработке. Править его удобнее в обработчике ПриКомпоновкеРезультата модуля объекта отчёта, если отчёт ваш.

Шрифт, который зависит от данных

Динамическое оформление в печатной форме — это то же присваивание Шрифт, только внутри условия. Пример: в табличной части отрицательные суммы наклонным красным, а позиции с нулевым количеством зачёркнутым.

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

Для Каждого СтрокаТЧ Из Документ.Товары Цикл

	ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
	ЯчейкаСумма = ОбластьСтрока.Области.Сумма;
	ЯчейкаТовар = ОбластьСтрока.Области.Товар;

	// Сначала возвращаем базовое оформление: область переиспользуется
	ЯчейкаСумма.Шрифт = Новый Шрифт(ЯчейкаСумма.Шрифт, , , Ложь, Ложь);
	ЯчейкаСумма.ЦветТекста = Новый Цвет(0, 0, 0);
	ЯчейкаТовар.Шрифт = Новый Шрифт(ЯчейкаТовар.Шрифт, , , , , , Ложь);

	Если СтрокаТЧ.Сумма < 0 Тогда
		ЯчейкаСумма.Шрифт = Новый Шрифт(ЯчейкаСумма.Шрифт, , , , Истина);
		ЯчейкаСумма.ЦветТекста = Новый Цвет(200, 0, 0);
	КонецЕсли;

	Если СтрокаТЧ.Количество = 0 Тогда
		ЯчейкаТовар.Шрифт = Новый Шрифт(ЯчейкаТовар.Шрифт, , , , , , Истина);
	КонецЕсли;

	ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

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

Ещё приёмы, которые встречаются в печатных формах:

  • 📏 Подгонка под длину текста. Если наименование длиннее, например, 80 символов, уменьшите размер на 1-2 пункта: Новый Шрифт(Ячейка.Шрифт, , 8).
  • 🔠 Масштаб шрифта. Восьмой параметр сужает или растягивает буквы по ширине. Значение 90 даёт чуть более узкий текст при том же размере, это спасает колонки с длинными номерами.
  • 🏷 Выбор шрифта пользователем. Сохраните имя и размер в настройках (например, через хранилище общих настроек) и подставляйте при формировании.

Печать и выгрузка: где шрифт ведёт себя иначе

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

Масштаб печати. Если включено ТабДок.АвтоМасштаб = Истина, документ ужимается под ширину листа, и шрифт 10 пт на бумаге становится мельче. Чтобы печатать в натуральную величину, отключите автомасштаб и задайте ТабДок.МасштабПечати = 100, а при необходимости поверните лист: ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.

Высота строки. Шрифт увеличили, а текст обрезан сверху. У строки в макете задана фиксированная высота. Увеличьте её свойством ВысотаСтроки у области строки или снимите фиксацию в свойствах строки в редакторе макета.

Шрифты на сервере. ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) на сервере использует шрифты, установленные на сервере. На Linux-сервере без Arial и Times New Roman в PDF окажется шрифт-заменитель, а ширина колонок поплывёт. Решение — установить нужные TrueType-шрифты на сервер 1С или выбрать гарнитуру, которая там есть.

Выгрузка в Excel и Word. При записи в XLSX и DOCX имя шрифта уходит в файл как есть. Если на компьютере получателя такого шрифта нет, Excel или Word подставит свой. Для документов, которые уходят наружу, надёжнее стандартные гарнитуры.

ФорматГде берутся шрифтыЧто проверить
ПечатьКомпьютер, с которого печатаютАвтомасштаб, поля, ориентация
PDF на сервереСервер 1СУстановлены ли шрифты на сервере
PDF на клиентеКомпьютер пользователяЕсть ли шрифт у пользователя
XLSX, DOCXКомпьютер получателяСтандартная ли гарнитура
MXLКомпьютер, где открываютТо же, что для печати

Типовая печатная форма: шрифт без снятия с поддержки

Править модуль типовой конфигурации ради шрифта в счёте — плохая идея: каждое обновление превращается в сравнение-объединение. Есть два способа обойтись без этого.

1. Пользовательский макет. В БП 3.0, ЗУП 3.1 и УТ 11 макеты печатных форм можно редактировать прямо в режиме «Предприятие»: Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Шрифт ячеек меняют в редакторе, база продолжает обновляться штатно. Минус: это не программная смена, а ручная правка макета, и после обновления типовой формы макет может потребовать сравнения.

2. Расширение конфигурации . Заимствуйте модуль менеджера нужного документа и добавьте обработчик с аннотацией &После к его экспортной процедуре Печать. В ней БСП передаёт таблицу КоллекцияПечатныхФорм, в колонке ТабличныйДокумент лежат уже сформированные документы:

&После("Печать")
Процедура Расш_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм,
	ОбъектыПечати, ПараметрыВывода)

	Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
		Если ПечатнаяФорма.ТабличныйДокумент <> Неопределено Тогда
			СменитьГарнитуру(ПечатнаяФорма.ТабличныйДокумент, "Arial");
		КонецЕсли;
	КонецЦикла;

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

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

Перед выкладкой кода в рабочую базу
Выполнено: 0 / 6

Ошибки при смене шрифта и что с ними делать

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

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

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