Часто при разработке красивых и информативных отчетов в 1С программисты сталкиваются с неприятной ситуацией: вместо ожидаемых иконок, стрелочек или спецсимволов (например, знака молнии ⚡ или различных закрашенных фигур) в табличном документе отображаются пустые прямоугольники, так называемые «тофу». Это происходит потому, что стандартные шрифты не всегда содержат необходимые глифы для отрисовки специфических символов Юникода. Рассмотрим подробнее, как работает механизм вывода символов в 1С и как добиться их корректного отображения.
Разберем первопричину проблемы. Когда мы записываем символ в ячейку табличного документа, платформа 1С пытается отрисовать его, используя шрифт, назначенный этой ячейке (по умолчанию это часто Arial). Если в файле шрифта отсутствует описание конкретного символа (глиф), операционная система или движок отрисовки 1С выводит символ-заглушку.
Проанализируем ситуацию с технической стороны. Существует несколько ключевых факторов, влияющих на этот процесс:
Arial, Verdana или Times New Roman содержат только наиболее востребованные наборы символов (латиница, кириллица, базовые знаки пунктуации). Специфические символы из расширенных плоскостей Юникода в них просто отсутствуют.International Components for Unicode. Версия этой библиотеки в платформе напрямую влияет на то, как программный код обрабатывает сложные символы (например, суррогатные пары).Выясним, какие шрифты лучше всего подходят для вывода пиктограмм текстом. Если мы хотим минимизировать проблемы, нам нужно использовать шрифты с максимально полным покрытием таблиц Unicode. Рассмотрим наиболее надежные варианты:
Посмотрим на пример кода, как программно назначить правильный шрифт ячейке для вывода спецсимвола:
// Создадим область и выведем в нее символ молнии (высокое напряжение)
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ЯчейкаИконки = ОбластьМакета.Область("R1C1");
// Код символа молнии в Unicode - U+26A1
ЯчейкаИконки.Текст = Символ(9889);
// Устанавливаем шрифт, гарантированно поддерживающий этот символ
ЯчейкаИконки.Шрифт = Новый Шрифт("Lucida Sans Unicode", 10, Истина);
ТабДок.Вывести(ОбластьМакета);
Для того чтобы понять, сможет ли выбранный шрифт отобразить нужный символ, проанализируем доступные инструменты:
Arial) и пролистайте список. Если вы не видите там нужного знака, значит, 1С его тоже не выведет этим шрифтом.unicode-table.com позволяют быстро найти код символа, но помните, что наличие символа на сайте не гарантирует его наличие в шрифтах на компьютере пользователя.Важно помнить, что отображение в конфигураторе или тонком клиенте на вашем компьютере — это только половина дела. Проанализируем риски, возникающие при эксплуатации отчета:
Веб-клиент: Здесь отрисовкой занимается браузер. Браузеры (Chrome, Firefox, Edge) обычно гораздо лучше справляются с подбором шрифтов (fallback). Поэтому в веб-клиенте символ может отображаться корректно, даже если в тонком клиенте на той же машине виден квадрат.
Экспорт в PDF: При сохранении табличного документа в PDF платформа 1С пытается внедрить (embed) используемые шрифты в файл. Если вы используете редкий Unicode-шрифт, будьте готовы к тому, что размер PDF-файла значительно увеличится. Кроме того, старые версии платформы могут некорректно обрабатывать внедрение символов из дополнительных плоскостей.
Linux-клиенты: Если часть ваших пользователей работает под Linux, шрифты Arial или Lucida Sans Unicode могут отсутствовать. В этом случае система заменит их на аналоги (например, из семейства Liberation), где набор символов может отличаться. В таких случаях рекомендуется использовать стандартные шрифты Java или устанавливать пакеты шрифтов Microsoft в систему.
Если ваша задача — создать матрицу прав или сложный визуальный отчет (как обсуждалось в теме форума), придерживайтесь следующих правил:
Рассмотрим, как можно реализовать выбор символа в зависимости от условий, используя системные шрифты:
Если ПравоРедактирования Тогда
// Используем закрашенный круг
ТекстСтатуса = Символ(9679);
ИначеЕсли ПравоЧтения Тогда
// Используем пустой круг
ТекстСтатуса = Символ(9675);
Иначе
// Используем крестик
ТекстСтатуса = Символ(10006);
КонецЕсли;
Область.Текст = ТекстСтатуса;
Область.Шрифт = Новый Шрифт("Arial Unicode MS", 12);
Таким образом, успех вывода Unicode в 1С зависит не от возможностей платформы (она поддерживает Юникод в полной мере), а от наличия соответствующих шрифтов в операционной системе и правильного их назначения в макете табличного документа. Всегда проверяйте финальный вид отчета на разных клиентах и при выгрузке в сторонние форматы.