При разработке печатных форм в среде 1С:Предприятие программисты часто сталкиваются с задачей акцентирования внимания на определенных словах или фразах внутри одной ячейки табличного документа. Например, необходимо вывести строку вида: "Договор № 123-ФЗ от 15.01.2024", где сам номер договора должен быть выделен полужирным начертанием.
Долгое время эта тривиальная на первый взгляд задача вызывала серьезные трудности, так как платформа 1С накладывала жесткое ограничение: свойства шрифта применялись только ко всей ячейке целиком. В этой статье мы подробно разберем, как решить эту проблему современными средствами платформы, а также рассмотрим классические обходные пути, которые применимы на старых версиях 1С. Для разработки готовых модулей печати можно использовать пример реализации внешней печатной формы на БСП.
Если вы работаете на актуальной версии платформы (начиная с релиза 8.3.24 и выше), у нас для вас отличные новости. Фирма «1С» официально добавила полноценную поддержку объекта ФорматированнаяСтрока для ячеек и рисунков табличного документа. Больше не нужно использовать сложные «костыли».
Разберем по шагам, как применить это решение на практике с помощью программного кода:
ФорматированнаяСтрока с указанием нужного шрифта.Рассмотрим пример кода в модуле объекта печатной формы:
// 1. Инициализируем массив для составных частей текста
МассивЧастей = Новый Массив;
// Добавляем первую (обычную) часть текста
МассивЧастей.Добавить("Договор № ");
// 2. Создаем шрифт с полужирным начертанием
ШрифтЖирный = Новый Шрифт(,, Истина); // Третий параметр "Истина" отвечает за жирность
// Создаем форматированную часть для номера договора
НомерДоговора = Новый ФорматированнаяСтрока("123-ФЗ", ШрифтЖирный);
МассивЧастей.Добавить(НомерДоговора);
// Добавляем оставшуюся обычную часть текста
МассивЧастей.Добавить(" от 15.01.2024 года.");
// 3. Формируем итоговую форматированную строку
ИтоговыйТекст = Новый ФорматированнаяСтрока(МассивЧастей);
// 4. Выводим результат в параметр макета табличного документа
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.ДоговорТекст = ИтоговыйТекст;
ТабДок.Вывести(ОбластьСтрока);
Этот способ является наиболее предпочтительным, так как он отлично работает во всех типах клиентов (тонкий, толстый, веб-клиент) и корректно переносится при экспорте табличного документа в форматы PDF или Excel. Разобраться в механизмах преобразования текста поможет обзор возможностей форматированного документа и строк.
Если ваша конфигурация работает на платформе версии 8.3.23 и ниже, использовать объект ФорматированнаяСтрока внутри ячейки напрямую не получится. Самый популярный и надежный способ обойти это ограничение без программирования сложных механизмов — это разбиение одной логической ячейки на несколько физических колонок.
Выясним причину популярности этого метода и разберем его реализацию:
Преимущество метода: Абсолютная стабильность работы, корректный экспорт во все сторонние форматы, простота настройки в конфигураторе.
Недостаток: Если длина динамического текста (например, номера договора) сильно меняется от документа к документу, могут возникнуть некрасивые большие пробелы или, наоборот, текст начнет перекрывать друг друга.
Проанализируем ситуацию, когда разбиение на колонки невозможно (например, текст выводится внутри сложного абзаца с автовысотой строки). В этом случае разработчики применяют оригинальный обходной путь с использованием специально подготовленного шрифта TrueType (TTF).
Суть метода заключается в следующем:
За основу берется стандартный шрифт (например, Liberation Serif). С помощью редактора шрифтов неиспользуемые символы кодовой таблицы (например, умляуты или специфические европейские буквы вроде À, Á, Â) перерисовываются под начертания жирных русских букв (А, Б, В).
Для вывода текста в 1С пишется функция транслитерации, которая заменяет обычные буквы в слове на их аналоги-двойники:
Функция СделатьТекстЖирным(ИсходнаяСтрока) Экспорт
Результат = ИсходнаяСтрока;
// Заменяем русские буквы на соответствующие спец-символы "жирного" шрифта
Результат = СтрЗаменить(Результат, "А", "À");
Результат = СтрЗаменить(Результат, "Б", "Á");
Результат = СтрЗаменить(Результат, "В", "Â");
// ... выполняем аналогичные замены для всего алфавита
Возврат Результат;
КонецФункции
В макете для ячейки устанавливается наш модифицированный шрифт. На экране и при печати пользователь видит красивый текст с жирным выделением нужных слов.
Важное предупреждение: У этого метода есть существенный минус. Если пользователь попытается скопировать текст из такой ячейки в буфер обмена, то при вставке в сторонний текстовый редактор (например, Блокнот или Word) вместо жирных букв он получит нечитаемую «кашу» из латинских спец-символов.
Если вам требуется сложное форматирование текста, которое невозможно реализовать стандартными инструментами старых версий платформы, оптимальным выбором станет использование HTML.
Мы можем сформировать печатную форму в виде HTML-кода и вывести её пользователю. Для этого на форму обработки или документа добавляется реквизит с типом Строка и видом Поле HTML документа.
Рассмотрим пример программного заполнения такого поля:
ТекстHTML = "<html><body style='font-family: Arial; font-size: 12pt;'>";
ТекстHTML = ТекстHTML + "<p>Уважаемый клиент! Ваш договор № <strong>123-ФЗ</strong> успешно зарегистрирован.</p>";
ТекстHTML = ТекстHTML + "</body></html>";
// Присваиваем сформированный HTML-код реквизиту формы
Элементы.ПолеПросмотраHTML.Документ.Писать(ТекстHTML);
Использование тегов <strong> или <b> позволяет с легкостью делать жирным абсолютно любую часть текста в пределах одной строки или абзаца. Из такого поля пользователь без проблем сможет копировать текст, а саму форму можно отправить на печать встроенными средствами платформы.
Мы рассмотрели различные варианты решения проблемы форматирования текста в ячейке 1С. При выборе метода руководствуйтесь версией вашей платформы:
ФорматированнаяСтрока — это наиболее быстрое и надежное решение.