При разработке печатных форм в 1С программисты часто сталкиваются с задачей выделить полужирным начертанием только одно слово или фразу внутри длинного абзаца (например, ФИО сотрудника в тексте трудового договора или сумму в акте). Исторически в платформе 1С это ограничение было одним из самых непреодолимых, поскольку оформление (шрифт, цвет, жирность) применялось исключительно ко всей ячейке табличного документа целиком.
В этой статье мы подробно разберем, как обстоят дела с решением этой задачи на сегодняшний день. Мы изучим современный штатный механизм, появившийся в последних версиях платформы, а также детально проанализируем классические обходные пути («костыли»), которые выручат вас, если вы вынуждены работать на старых релизах или в режиме совместимости.
Начнем с отличных новостей. Начиная с версии платформы 8.3.24, разработчики 1С добавили полноценную встроенную поддержку объекта ФорматированнаяСтрока в ячейках и рисунках табличного документа.
Если ваша конфигурация работает на актуальной платформе и режим совместимости установлен в значение 8.3.24 или выше, вам больше не нужно изобретать сложные обходные пути. Теперь разнородное форматирование текста внутри одной ячейки доступно «из коробки».
Рассмотрим, как применить это решение на практике:
ФорматированнаяСтрока.Давайте разберем пример программного вывода текста с выделением ключевого слова жирным шрифтом:
// Создаем массив для частей нашей будущей форматированной строки
МассивЧастей = Новый Массив;
// Добавляем обычный текст
МассивЧастей.Добавить("Уважаемый ");
// Создаем шрифт с установленным признаком "Полужирный"
ШрифтВыделения = Новый Шрифт(,, Истина);
// Создаем форматированную часть текста (ФИО) с жирным шрифтом и синим цветом для наглядности
ВыделенныйТекст = Новый ФорматированнаяСтрока("Иванов Иван Иванович", ШрифтВыделения, WebЦвета.Синий);
МассивЧастей.Добавить(ВыделенныйТекст);
// Добавляем финальную часть обычного текста
МассивЧастей.Добавить(", уведомляем Вас о необходимости погасить задолженность.");
// Объединяем все части в одну форматированную строку
ИтоговаяСтрока = Новый ФорматированнаяСтрока(МассивЧастей);
// Заполняем параметр в области табличного документа
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");
ОбластьМакета.Параметры.ТекстПретензии = ИтоговаяСтрока;
ТабличныйДокумент.Вывести(ОбластьМакета);
Важное ограничение: Если вы попытаетесь вывести объект ФорматированнаяСтрока в базу данных или макет при включенном режиме совместимости ниже 8.3.24, система автоматически преобразует этот объект в обычную строку. При этом все оформление, включая жирность и цвет отдельных слов, будет безвозвратно утеряно. В таком случае придется использовать один из альтернативных методов.
В более свежей версии платформы 8.3.27 возможности форматированных строк вышли на новый уровень. Теперь этот механизм поддерживается непосредственно в Системе компоновки данных (СКД):
ФорматированнаяСтрока.Что делать, если ваша база работает в режиме совместимости (например, со старыми версиями УПП или старыми релизами ERP) и перейти на версию 8.3.24 невозможно? Проанализируем самые популярные и жизнеспособные методы обхода ограничений.
Этот прием пришел к нам еще со времен платформы 1С 7.7. Он часто применяется, когда нужно сымитировать подпись на документе или выделить конкретное слово поверх стандартного макета.
Суть метода по шагам:
УзорЦвет в значение «Без цвета» (чтобы сделать его полностью прозрачным).Недостатки метода: Этот способ крайне нестабилен в эксплуатации. Стоит пользователю изменить масштаб отображения документа на экране, отправить форму на печать на другой принтер или сохранить документ в формате PDF — текст на рисунке неизбежно сместится относительно базовой ячейки. В результате текст может либо наложиться друг на друга, либо разъехаться с образованием огромных пустых промежутков.
Это очень изящное программистское решение, основанное на тонкостях кодировки символов. Метод позволяет обойти ограничения платформы без использования графических элементов.
Принцип работы:
Берется бесплатный стандартный шрифт (например, Liberation Serif) и открывается в специальном редакторе шрифтов (например, FontForge). В этом шрифте находят неиспользуемые символы расширенной латиницы с диакритическими знаками (например, буквы вроде À, Á, Â, Ã) и заменяют их внутреннее графическое представление (глифы) на символы русской кириллицы, но отрисованные в полужирном начертании.
При формировании печатной формы в 1С специальная программная функция заменяет обычные буквы в тех словах, которые требуется выделить, на соответствующие им латинские спецсимволы. Для движка платформы вся строка выводится одним и тем же обычным шрифтом, однако на экране и при печати подмененные символы будут выглядеть как жирные русские буквы.
Пример схемы замены в коде:
Функция ПреобразоватьВЖирныйКириллический(ВходнаяСтрока)
// Строим таблицу соответствия обычных русских букв спецсимволам измененного шрифта
ТаблицаСоответствия = Новый Соответствие;
ТаблицаСоответствия.Вставить("А", "À");
ТаблицаСоответствия.Вставить("Б", "Á");
ТаблицаСоответствия.Вставить("В", "Â");
// ... и так далее для всего алфавита
Результат = "";
Для Индекс = 1 По СтрДлина(ВходнаяСтрока) Цикл
Символ = Сред(ВходнаяСтрока, Индекс, 1);
СпецСимвол = ТаблицаСоответствия.Получить(Символ);
Если СпецСимвол <> Неопределено Тогда
Результат = Результат + СпецСимвол;
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Недостатки метода:
Самый простой и надежный с точки зрения стабильности вывода метод — разбиение одной логической строки на несколько физических ячеек табличного документа.
Вы разделяете строку на три части: первая часть текста (обычный шрифт), выделяемый параметр (жирный шрифт) и концовка строки (обычный шрифт). Каждую часть вы выводите в отдельную колонку макета, убрав границы между ними.
Недостатки метода: Этот способ отлично работает только для коротких однострочных записей. Если ваш текст занимает несколько строк и должен переноситься по словам, данный подход неприменим. Автоматический перенос длинного текста по словам внутри разрозненных ячеек настроить невозможно — текст получится «рваным» и некрасивым.
Если требования заказчика к оформлению печатной формы жесткие, а версия платформы не позволяет использовать ФорматированнаяСтрока, лучшим решением будет полный отказ от классического табличного документа mxl.
Вместо этого мы рекомендуем использовать альтернативные макеты:
<strong> или <b> для выделения любой части текста. Платформа 1С позволяет отображать HTML-документы на формах и выводить их на печать.Подводя итог, можно сказать: эпоха неудобных «костылей» уходит в прошлое. Переход на современную платформу версии 8.3.24+ полностью закрывает эту старую проблему, позволяя разработчикам легко и красиво форматировать текст любой сложности с помощью штатных объектов встроенного языка 1С.