При разработке интеграции 1С с Telegram часто возникает задача сделать интерфейс бота более живым и дружелюбным. Самый простой способ добиться этого — добавить эмодзи. Однако разработчики часто сталкиваются с проблемой: вместо ожидаемого смайлика в чате отображается странный набор символов вроде %F0%9F%98%81 или 😁. В рамках данной статьи мы подробно разберем, почему это происходит, и изучим надежные методы вывода эмодзи как в тексте сообщений, так и на кнопках клавиатуры.
Проанализируем ситуацию, с которой сталкивается большинство программистов 1С. Основная сложность заключается в смешивании способов передачи данных. Telegram API принимает данные двумя основными путями:
%F0%9F%98%81 будут успешно декодированы сервером Telegram в соответствующий символ, что полезно при автоматизации записи WebHook.parse_mode).Если мы отправляем JSON и вставляем туда %F0..., бот воспримет это как обычный текст, так как внутри JSON-парсера автоматическое URL-декодирование не происходит.
Это один из самых простых способов, если вы отправляете текстовое сообщение и используете режим разметки HTML. Суть метода заключается в передаче десятичного или шестнадцатеричного кода символа Unicode.
Рассмотрим пример формирования строки (это поможет, если вы решили реализовать прогресс-бар в Telegram):
Эмоджи = "😁"; // Код смайла 😁
Текст = "Привет! Вот ваш заказ " + Эмоджи;
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ИдентификаторЧата);
ПараметрыЗапроса.Вставить("text", Текст);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Важный нюанс: Как было отмечено в обсуждении, всегда необходимо ставить точку с запятой ; в конце кода сущности. Без неё Telegram может не распознать код, особенно если сразу за ним следует цифра или другой текст. Например, �руб превратится в нечитаемую кашу, так как парсер заберет лишние цифры в код символа. Правильно писать: 😁100руб.
Платформа 1С внутри себя работает со строками в кодировке UTF-16. Большинство привычных нам символов (буквы, цифры) занимают 2 байта. Однако эмодзи находятся в "верхних" плоскостях Unicode и требуют 4 байта. В UTF-16 такие символы представляются в виде суррогатных пар — двух идущих подряд 16-битных кодов.
Посмотрим на пример, который успешно решили участники сообщества:
// Смайл "SOS" (🆘)
Эмоджи = Символ(55357) + Символ(57005);
Текст = Эмоджи + " Срочное сообщение!";
Этот метод хорош тем, что он универсален. Полученная таким образом строка содержит "настоящий" символ, который можно передавать и в text сообщения, и — что критически важно — в текст кнопок (ReplyKeyboardMarkup или InlineKeyboardMarkup), где HTML-разметка не поддерживается.
Если вы работаете в современных версиях 1С (начиная с 8.3.10), платформа корректно поддерживает Unicode в текстах модулей. Вы можете просто скопировать смайлик из Telegram Desktop или любого сайта и вставить его прямо в кавычки в коде 1С.
Проанализируем пример:
Процедура ОтправитьУведомление(ЧатИд)
Текст = "✅ Операция выполнена успешно!";
// 1С сохранит этот символ корректно внутри строки
ОтправитьВТелеграм(ЧатИд, Текст);
КонецПроцедуры
Этот способ самый наглядный и удобный для поддержки кода другими разработчиками, так как сразу видно, какой именно смайл будет отправлен.
Выясним причину, по которой у многих разработчиков эмодзи работают в тексте сообщения, но не отображаются на кнопках. В Telegram API для объектов кнопок (KeyboardButton) параметр text не поддерживает parse_mode. Это значит, что HTML-коды там не работают.
Чтобы вывести смайл на кнопке, нужно использовать либо способ с Символ(), либо прямую вставку символа в строку. Рассмотрим правильное формирование клавиатуры через ЗаписьJSON:
Кнопка = Новый Структура;
Кнопка.Вставить("text", "🚀 Запустить процесс");
МассивКнопок = Новый Массив;
МассивКнопок.Добавить(Кнопка);
СтрокаКнопок = Новый Массив;
СтрокаКнопок.Добавить(МассивКнопок);
Клавиатура = Новый Структура;
Клавиатура.Вставить("keyboard", СтрокаКнопок);
Клавиатура.Вставить("resize_keyboard", Истина);
// Преобразуем структуру в JSON для отправки в POST-запросе
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Клавиатура);
РезультатJSON = ЗаписьJSON.Закрыть();
Использование объекта ЗаписьJSON гарантирует, что 1С правильно упакует суррогатные пары эмодзи в формат, понятный Telegram API.
Для тех, кто предпочитает использовать программное формирование через функцию Символ(), приведем несколько популярных кодов:
Символ(55357) + Символ(56613)Символ(55357) + Символ(56449)Символ(9888) (этот символ входит в базовую плоскость и не требует пары)Символ(9989)Рассмотрев все варианты, мы можем сделать следующие выводы. Для обычных текстовых сообщений удобнее всего использовать HTML-сущности с обязательным указанием parse_mode: "HTML". Если же вам необходимо добавить эмодзи в меню или на кнопки, используйте прямую вставку символа в строку 1С или формируйте его через суррогатные пары. Помните, что при использовании метода POST и формата JSON нельзя использовать URL-кодирование (знаки процента), так как они не будут распознаны как спецсимволы.