При формировании отчетов и печатных форм в 1С часто возникает задача динамически изменять оформление ячеек: например, выделять определенные данные жирным шрифтом, увеличивать размер текста или менять его цвет в зависимости от условий — для этого есть редактор макетов и печатных форм без программирования. Рассмотрим, как это сделать правильно, и разберем частые ошибки, с которыми сталкиваются разработчики.
Основная проблема, с которой столкнулся автор вопроса, заключалась в попытке изменить шрифт для одного из нескольких параметров внутри одной ячейки-шаблона. Сразу отметим важный момент: стандартные средства 1С не позволяют форматировать разными шрифтами отдельные части текста в пределах одной ячейки. Однако для достижения нужного визуального эффекта есть проверенные подходы, которые мы и проанализируем.
Первая и самая частая ошибка — неправильный метод для получения объекта области. В исходном коде использовался метод ТабДок.Области.Индекс(). Давайте разберемся, почему это неверно.
Метод КоллекцияОбластейТабличногоДокумента.Индекс() предназначен для поиска и возвращает число — порядковый номер (индекс) области в коллекции. Он не возвращает саму область, с которой можно было бы работать. Для получения объекта области, свойства которой мы хотим изменить (например, шрифт), следует использовать метод ТабличныйДокумент.Область().
Этот метод может принимать в качестве параметра адрес области или ее имя.
Примеры получения области:
Ячейка = ТабДок.Область("R2C5"); // Получаем область ячейки из 2-й строки и 5-й колонки
ПрямоугольнаяОбласть = ТабДок.Область("R2C2:R3C5"); // Область от R2C2 до R3C5
ИменованнаяОбласть = ТабДок.Область("Шапка");
Именно с объектом, полученным через метод Область(), можно в дальнейшем работать и изменять его свойства — для этого подойдет модуль вывода факсимиле в печатные формы 1С.
Для установки шрифта используется объект Шрифт. Его можно создать с помощью конструктора Новый Шрифт(). Существует два основных способа его использования.
Способ 1: Создание шрифта с нуля
Вы можете задать все параметры шрифта явно: имя, размер, начертание.
// Новый Шрифт("ИмяШрифта", Размер, Жирный, Курсив, Подчеркнутый, Зачеркнутый)
мШрифт = Новый Шрифт("Arial", 12, Истина, Ложь, Ложь, Ложь);
Способ 2: Создание на основе существующего шрифта (рекомендуется)
Чаще всего нам не нужно менять все атрибуты, а только один-два (например, сделать текст жирным или увеличить кегль). В этом случае гораздо удобнее создавать новый шрифт на основе уже существующего у ячейки. Это позволяет сохранить исходное имя шрифта, его начертание и т.д., изменив лишь нужные параметры.
Первым параметром в конструктор передается текущий шрифт области. Остальные параметры, которые не нужно менять, просто опускаются (остаются пустыми).
Посмотрим на пример. Допустим, нам нужно сделать шрифт в ячейке жирным, не меняя ничего другого.
// Получаем область
ОбластьЯчеек = ТабДок.Область("R5C1");
// Создаем новый шрифт на основе существующего, но делаем его жирным
// Новый Шрифт(ИсходныйШрифт, Имя, Размер, Жирный, Курсив, Подчеркнутый, Зачеркнутый)
НовыйШрифт = Новый Шрифт(ОбластьЯчеек.Шрифт, , , Истина);
// Применяем новый шрифт к области
ОбластьЯчеек.Шрифт = НовыйШрифт;
Аналогично можно изменить только размер:
// Получаем область
ОбластьИнформации = ТабДок.Область("Информация");
НовыйРазмер = 14;
// Создаем новый шрифт на основе существующего, но с новым размером
ОбластьИнформации.Шрифт = Новый Шрифт(ОбластьИнформации.Шрифт, , НовыйРазмер);
Существует два основных подхода к программному изменению форматирования, и выбор зависит от задачи.
Подход 1: Изменение свойств области Макета (перед выводом)
Этот способ считается более правильным и гибким, когда форматирование зависит от данных в цикле. Вы получаете область из объекта Макет, изменяете ее свойства, заполняете параметрами и только потом выводите в итоговый ТабличныйДокумент.
Пример:
Макет = ПолучитьМакет("МакетОтчета");
ТабДок.Очистить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем область строки из макета
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Заполнить(Выборка);
// По условию делаем шрифт жирным
Если Выборка.Сумма > 100000 Тогда
ОбластьСтрока.Шрифт = Новый Шрифт(ОбластьСтрока.Шрифт, , , Истина);
КонецЕсли;
// Выводим уже отформатированную область
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Подход 2: Изменение свойств области Табличного документа (после вывода)
Этот способ применяется, когда весь документ уже сформирован, и нужно внести изменения в уже выведенные ячейки. Например, изменить шрифт во всем документе или в определенном диапазоне после его генерации.
Пример:
// Отчет уже сформирован в переменной ДокументРезультат
// Устанавливаем для всех ячеек в диапазоне с 1 по 1000 строку и с 1 по 20 колонку шрифт размером 8
ДокументРезультат.Область(1,1,1000,20).Шрифт = Новый Шрифт(ДокументРезультат.Область(1,1).Шрифт, , 8);
Как мы уже выяснили, отформатировать часть текста внутри одной ячейки нельзя. Правильный подход для решения этой задачи — использование нескольких смежных ячеек.
Идея заключается в том, чтобы разбить исходный шаблон на несколько частей и поместить каждую часть в свою ячейку в макете. Затем для ячейки с нужным параметром программно установить требуемый шрифт.
Рассмотрим по шагам:
[Номер]. Даем этой области уникальное имя, например, `НомерДокумента`.Пример кода:
Макет = ПолучитьМакет("СчетНаОплату");
// Получаем части одной логической строки
ОбластьТекстДо = Макет.ПолучитьОбласть("ТекстДо");
ОбластьНомер = Макет.ПолучитьОбласть("НомерДокумента");
ОбластьТекстПосле = Макет.ПолучитьОбласть("ТекстПосле");
// Заполняем параметры
ОбластьТекстДо.Параметры.Заполнить(ДанныеШапки);
ОбластьНомер.Параметры.Заполнить(ДанныеШапки);
ОбластьТекстПосле.Параметры.Заполнить(ДанныеШапки);
// Меняем шрифт только для области с номером, делаем его жирным и крупнее
ОбластьНомер.Шрифт = Новый Шрифт(ОбластьНомер.Шрифт, , 12, Истина);
// Выводим области последовательно в одну строку
ТабДок.Вывести(ОбластьТекстДо);
ТабДок.Присоединить(ОбластьНомер);
ТабДок.Присоединить(ОбластьТекстПосле);
Таким образом, мы добиваемся нужного визуального эффекта, используя стандартные и надежные механизмы платформы 1С — если вам нужно более простое решение, воспользуйтесь готовым конструктором произвольных печатных форм без программирования.