При интеграции 1С с Telegram-ботами разработчики часто сталкиваются с тем, что стандартные текстовые сообщения проходят успешно, но попытка добавить эмодзи приводит либо к ошибке, либо к отображению некорректных символов. Давайте разберемся, почему это происходит и как правильно передавать графические значки в сообщениях.
Основная сложность заключается в том, что функция Символ() в платформе 1С ограничена символами Юникода, входящими в базовую многоязычную плоскость (BMP). Большинство современных эмодзи находятся за пределами этого диапазона и в кодировке UTF-16 представлены суррогатными парами. При попытке передать код такого символа напрямую, 1С не может корректно интерпретировать его как единый элемент, что приводит к «пустым» результатам или ошибкам типизации.
Один из самых надежных способов передачи нестандартных символов через GET или POST запросы к Telegram API — это использование URL-кодирования байтовой последовательности в формате UTF-8. Рассмотрим этот метод по шагам.
\xXX.\x на % для приведения к стандартному URL-кодированию.Рассмотрим конкретный пример для синего шарика (код \xF0\x9F\x93\x88):
// Пример формирования строки с эмодзи
ЭмодзиСинийШарик = "\xF0\x9F\x93\x88";
ЭмодзиСинийШарик = СтрЗаменить(ЭмодзиСинийШарик, "\x", "%");
ТекстСообщения = "Баланс сошелся" + ЭмодзиСинийШарик;
АдресЗапроса = "https://api.telegram.org/bot<Токен>/sendMessage?chat_id=<ID>&parse_mode=Markdown&text=" + ТекстСообщения;
После такой замены 1С корректно передает строку, и Telegram интерпретирует её как полноценный эмодзи.
Для стандартных URL-запросов вы можете использовать встроенную функцию КодироватьСтроку() с параметром СпособКодированияСтроки.КодировкаURL. Однако важно учитывать, что если вы работаете со сложными символами, требующими представления в виде суррогатных пар, КодироватьСтроку() может не всегда давать ожидаемый результат, если исходная переменная в 1С уже содержит «битый» символ.
Более современным и предпочтительным методом является отправка данных в формате JSON через POST-запрос. В этом случае вы избавляетесь от необходимости ручного кодирования спецсимволов. При использовании HTTPЗапрос и сериализации структуры через ЗаписьJSON, платформа 1С автоматически обрабатывает UTF-8 кодировку.
Разберем, как это реализовать правильно:
// Формируем структуру данных
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("chat_id", "<ID_Чата>");
ТелоЗапроса.Вставить("text", "Ваше сообщение с эмодзи 📈");
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправляем запрос
HTTPЗапрос = Новый HTTPЗапрос("bot<Токен>/sendMessage");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);
При работе с эмодзи в 1С, учитывайте следующие советы:
Символ() для получения эмодзи, так как она не предназначена для формирования суррогатных пар UTF-16, необходимых для отображения графических знаков.Используя предложенные методы, вы сможете легко добавить визуальную составляющую в ваши оповещения и отчеты, отправляемые ботом, делая их более информативными и удобными для пользователей.