При работе с платформой «1С:Предприятие» многие разработчики сталкиваются с желанием добавить визуальное разнообразие в пользовательский интерфейс, например, используя современные эмодзи. Однако, как мы выяснили, простой вставки символа или использования функции Символ() для эмодзи с высокими кодами Unicode может быть недостаточно. Давайте подробнее разберем, почему это происходит и как мы можем эффективно использовать эмодзи в наших решениях 1С.
Суть проблемы заключается в том, что платформа 1С использует кодировку UTF-16 для работы со строками. Эта кодировка имеет особенности при отображении символов Unicode, особенно тех, чьи числовые коды превышают значение 65535. Мы рассмотрим, как это влияет на отображение эмодзи и предложим универсальные подходы для решения этой задачи.
Как мы уже упоминали, платформа «1С:Предприятие» в своей основе использует кодировку UTF-16 для обработки строк. В рамках этой кодировки символы из так называемой «Базовой многоязыковой плоскости» (Basic Multilingual Plane, BMP), то есть символы с кодами Unicode до 65535, кодируются двумя байтами. Функция Символ() в 1С предназначена для работы именно с такими однословными (16-битными) кодами.
Однако, большинство современных эмодзи, включая такие популярные, как ✨ (U+2728, код 10024) или 🗁 (U+1F5C1, код 128449), имеют коды Unicode, которые значительно превышают 65535. Для таких символов в UTF-16 применяется специальный механизм, известный как суррогатные пары. Это означает, что один такой эмодзи-символ кодируется не одним, а двумя 16-битными значениями, которые в сумме и образуют суррогатную пару. Каждое из этих 16-битных значений, по сути, воспринимается 1С как отдельный символ.
Именно поэтому прямая попытка вывести символ с кодом, например, Символ(128449), не даст ожидаемого результата. Функция Символ() просто не сможет корректно обработать число, выходящее за пределы 65535, так как оно не вписывается в формат одной 16-битной кодовой позиции.
Теперь, когда мы понимаем причину, давайте перейдем к решению.
Для того чтобы корректно отображать эмодзи с кодами Unicode выше 65535, нам необходимо вычислить их суррогатную пару и затем объединить два полученных символа в одну строку. Этот подход является наиболее надежным и универсальным.
Символ() для каждого из них и оператор конкатенации строк.Давайте разберем это на конкретном примере. Возьмем символ папки 🗁, который имеет код Unicode U+1F5C1, или в десятичном представлении 128449. Если мы используем онлайн-инструменты для преобразования, мы получим следующие десятичные значения для его суррогатной пары:
Теперь, зная эти значения, мы можем сформировать строку в 1С. Это будет выглядеть следующим образом:
// Определяем верхнюю и нижнюю части суррогатной пары для символа 🗁 (U+1F5C1)
ВерхняяЧастьСимвола = Символ(55357);
НижняяЧастьСимвола = Символ(56769);
// Объединяем части для получения полного эмодзи
МойСимволЭмодзи = ВерхняяЧастьСимвола + НижняяЧастьСимвола;
// Применяем полученный символ, например, к заголовку кнопки на управляемой форме
// Предположим, у нас есть кнопка с именем "МояКнопка"
Если Элементы.Найти("МояКнопка") Тогда
Элементы.МояКнопка.Заголовок = МойСимволЭмодзи;
КонецЕсли;
// Также можно использовать в других строковых полях или при формировании сообщений
Сообщить("Вот наш эмодзи: " + МойСимволЭмодзи);
Таким образом, мы успешно формируем эмодзи, который состоит из двух отдельных 16-битных символов, но при этом корректно отображается как единый графический элемент. Важно отметить, что для платформы 1С строка, содержащая такую суррогатную пару, будет иметь длину 2 (состоять из двух символов), а не 1, как мы могли бы ожидать.
Даже при правильном формировании строки с эмодзи через суррогатную пару, визуальный результат может значительно отличаться в зависимости от типа клиента 1С, операционной системы и установленных шрифтов. Рассмотрим эти особенности подробнее:
Веб-клиент: Как правило, веб-клиент демонстрирует наиболее качественное и современное отображение эмодзи. Это объясняется тем, что отрисовка символов происходит силами браузера. Современные браузеры обладают развитыми механизмами рендеринга шрифтов и символов, включая поддержку цветных глифов для эмодзи, которые берутся из системных шрифтов или встроенных в браузер. Таким образом, в веб-клиенте эмодзи чаще всего выглядят ярко, цветными и соответствуют современным стандартам.
Тонкий и толстый клиент: В этих клиентах отображение эмодзи в значительной степени зависит от операционной системы (Windows, Linux, macOS) и установленных в ней шрифтов. Часто мы можем заметить, что эмодзи выглядят как черно-белые, контурные или схематичные символы, а их размер может быть значительно меньше ожидаемого. Это связано с тем, что для рендеринга используется системный шрифт по умолчанию или специальный шрифт платформы 1С, в котором может отсутствовать полноценная поддержка цветных или масштабируемых глифов для эмодзи. Возможность их масштабирования или изменения цвета ограничена возможностями системных шрифтов и механизмов отрисовки 1С.
Мобильный клиент: На мобильных устройствах (iOS/Android) операционные системы отлично поддерживают современные эмодзи. Однако, сам мобильный клиент 1С может иметь свои ограничения в рендеринге элементов. В некоторых случаях это может приводить к отсутствию отображения определенных символов или их некорректному виду, несмотря на то, что сама мобильная ОС прекрасно их обрабатывает. Например, как было отмечено в обсуждении, некоторые эмодзи могут совсем не выводиться в мобильном клиенте, даже если их суррогатные пары корректно сформированы.
Поэтому, разрабатывая интерфейсы с использованием эмодзи, нам необходимо учитывать эти различия и проводить тестирование на всех целевых типах клиентов. Хотя подход с суррогатными парами обеспечивает правильную передачу данных символов, их конечное визуальное представление может отличаться.
Помимо основного решения с суррогатными парами, существуют и другие важные моменты, которые следует учесть при работе с эмодзи в 1С:
Простые эмодзи из BMP: Для эмодзи, коды которых не превышают 65535 (например, ✅ U+2705 - галочка, ✨ U+2728 - искорки), достаточно использовать простую конструкцию Символ(код). Например: Элементы.ФормаКоманда1.Заголовок = Символ(10024);. Однако, даже такие символы могут отображаться мелко или черно-белыми в тонком/толстом клиенте.
Проверка кодов: Всегда проверяйте десятичный код интересующего вас эмодзи. Вы можете воспользоваться ресурсами, такими как unicode.org, или онлайн-конвертерами для получения точных кодов и, при необходимости, суррогатных пар. Если инструмент показывает один код (до 65535), используйте Символ(код). Если же он показывает два кода в поле "Surrogates" или "UTF-16 codes", то применяйте метод объединения суррогатных пар.
Интеграция с внешними системами: Метод с использованием суррогатных пар особенно полезен при интеграции 1С с внешними системами, например, с мессенджерами типа Telegram. Поскольку многие API мессенджеров ожидают символы в кодировке UTF-16, передача эмодзи через суррогатные пары гарантирует их корректное отображение в сообщениях или inline-клавиатурах.
Альтернативы: Если нам критично получить единообразное и качественное отображение иконок на всех типах клиентов, возможно, стоит рассмотреть использование традиционных картинок (.png, .svg) вместо эмодзи. Этот подход более предсказуем, хотя и требует больше усилий для подготовки иконкок и управления ими.
Подводя итог, можно сказать, что использование эмодзи в 1С — это вполне реализуемая задача, требующая, однако, понимания особенностей кодировки UTF-16 и механизма суррогатных пар. Применяя описанные методы, мы можем добавить выразительности нашим интерфейсам и сообщениям, делая их более современными и удобными для пользователей.