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

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

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

Основная проблема, с которой столкнулся автор вопроса, заключалась в попытке изменить шрифт для одного из нескольких параметров внутри одной ячейки-шаблона. Сразу отметим важный момент: стандартные средства 1С не позволяют форматировать разными шрифтами отдельные части текста в пределах одной ячейки. Однако для достижения нужного визуального эффекта есть проверенные подходы, которые мы и проанализируем.

Шаг 1: Правильное получение области для форматирования

Первая и самая частая ошибка — неправильный метод для получения объекта области. В исходном коде использовался метод ТабДок.Области.Индекс(). Давайте разберемся, почему это неверно.

Метод КоллекцияОбластейТабличногоДокумента.Индекс() предназначен для поиска и возвращает число — порядковый номер (индекс) области в коллекции. Он не возвращает саму область, с которой можно было бы работать. Для получения объекта области, свойства которой мы хотим изменить (например, шрифт), следует использовать метод ТабличныйДокумент.Область().

Этот метод может принимать в качестве параметра адрес области или ее имя.

Примеры получения области:

  1. По адресу одной ячейки:
    
    Ячейка = ТабДок.Область("R2C5"); // Получаем область ячейки из 2-й строки и 5-й колонки
    
  2. По адресу прямоугольной области:
    
    ПрямоугольнаяОбласть = ТабДок.Область("R2C2:R3C5"); // Область от R2C2 до R3C5
    
  3. По имени области (если оно задано в макете):
    
    ИменованнаяОбласть = ТабДок.Область("Шапка");
    

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

Шаг 2: Создание и применение нового шрифта

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

Способ 1: Создание шрифта с нуля
Вы можете задать все параметры шрифта явно: имя, размер, начертание.


// Новый Шрифт("ИмяШрифта", Размер, Жирный, Курсив, Подчеркнутый, Зачеркнутый)
мШрифт = Новый Шрифт("Arial", 12, Истина, Ложь, Ложь, Ложь);

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

Первым параметром в конструктор передается текущий шрифт области. Остальные параметры, которые не нужно менять, просто опускаются (остаются пустыми).

Посмотрим на пример. Допустим, нам нужно сделать шрифт в ячейке жирным, не меняя ничего другого.


// Получаем область
ОбластьЯчеек = ТабДок.Область("R5C1");

// Создаем новый шрифт на основе существующего, но делаем его жирным
// Новый Шрифт(ИсходныйШрифт, Имя, Размер, Жирный, Курсив, Подчеркнутый, Зачеркнутый)
НовыйШрифт = Новый Шрифт(ОбластьЯчеек.Шрифт, , , Истина);

// Применяем новый шрифт к области
ОбластьЯчеек.Шрифт = НовыйШрифт;

Аналогично можно изменить только размер:


// Получаем область
ОбластьИнформации = ТабДок.Область("Информация");
НовыйРазмер = 14;

// Создаем новый шрифт на основе существующего, но с новым размером
ОбластьИнформации.Шрифт = Новый Шрифт(ОбластьИнформации.Шрифт, , НовыйРазмер);

Шаг 3: Макет или Табличный документ — что и когда изменять?

Существует два основных подхода к программному изменению форматирования, и выбор зависит от задачи.

Подход 1: Изменение свойств области Макета (перед выводом)
Этот способ считается более правильным и гибким, когда форматирование зависит от данных в цикле. Вы получаете область из объекта Макет, изменяете ее свойства, заполняете параметрами и только потом выводите в итоговый ТабличныйДокумент.

Пример:


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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Получаем область строки из макета
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(Выборка);

    // По условию делаем шрифт жирным
    Если Выборка.Сумма > 100000 Тогда
        ОбластьСтрока.Шрифт = Новый Шрифт(ОбластьСтрока.Шрифт, , , Истина);
    КонецЕсли;

    // Выводим уже отформатированную область
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Подход 2: Изменение свойств области Табличного документа (после вывода)
Этот способ применяется, когда весь документ уже сформирован, и нужно внести изменения в уже выведенные ячейки. Например, изменить шрифт во всем документе или в определенном диапазоне после его генерации.

Пример:


// Отчет уже сформирован в переменной ДокументРезультат
// Устанавливаем для всех ячеек в диапазоне с 1 по 1000 строку и с 1 по 20 колонку шрифт размером 8
ДокументРезультат.Область(1,1,1000,20).Шрифт = Новый Шрифт(ДокументРезультат.Область(1,1).Шрифт, , 8);

Решение исходной задачи: форматирование части текста в ячейке

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

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

Рассмотрим по шагам:

  1. В макете вместо одной ячейки с текстом "Счет на оплату №[Номер] от [Дата]" создаем три смежные ячейки в одной строке.
  2. В первой ячейке размещаем текст "Счет на оплату №".
  3. Во второй ячейке размещаем параметр [Номер]. Даем этой области уникальное имя, например, `НомерДокумента`.
  4. В третьей ячейке размещаем текст " от [Дата]".
  5. Чтобы ячейки выглядели как единое целое, в макете убираем у них вертикальные границы.
  6. В коде получаем каждую область, но шрифт меняем только для средней.

Пример кода:


Макет = ПолучитьМакет("СчетНаОплату");

// Получаем части одной логической строки
ОбластьТекстДо = Макет.ПолучитьОбласть("ТекстДо");
ОбластьНомер = Макет.ПолучитьОбласть("НомерДокумента");
ОбластьТекстПосле = Макет.ПолучитьОбласть("ТекстПосле");

// Заполняем параметры
ОбластьТекстДо.Параметры.Заполнить(ДанныеШапки);
ОбластьНомер.Параметры.Заполнить(ДанныеШапки);
ОбластьТекстПосле.Параметры.Заполнить(ДанныеШапки);

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

// Выводим области последовательно в одну строку
ТабДок.Вывести(ОбластьТекстДо);
ТабДок.Присоединить(ОбластьНомер);
ТабДок.Присоединить(ОбластьТекстПосле);

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

← На главную