Как отправить эмодзи в Telegram-бот из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с Telegram-ботами разработчики часто сталкиваются с тем, что стандартные текстовые сообщения проходят успешно, но попытка добавить эмодзи приводит либо к ошибке, либо к отображению некорректных символов. Давайте разберемся, почему это происходит и как правильно передавать графические значки в сообщениях.

Понимание проблемы кодирования

Основная сложность заключается в том, что функция Символ() в платформе 1С ограничена символами Юникода, входящими в базовую многоязычную плоскость (BMP). Большинство современных эмодзи находятся за пределами этого диапазона и в кодировке UTF-16 представлены суррогатными парами. При попытке передать код такого символа напрямую, 1С не может корректно интерпретировать его как единый элемент, что приводит к «пустым» результатам или ошибкам типизации.

Решение через URL-кодирование

Один из самых надежных способов передачи нестандартных символов через GET или POST запросы к Telegram API — это использование URL-кодирования байтовой последовательности в формате UTF-8. Рассмотрим этот метод по шагам.

  1. Найдите код эмодзи в таблице Юникода.
  2. Представьте эмодзи как последовательность байтов, где каждый байт записывается в формате \xXX.
  3. Замените префикс \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

Более современным и предпочтительным методом является отправка данных в формате 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С, учитывайте следующие советы:

Используя предложенные методы, вы сможете легко добавить визуальную составляющую в ваши оповещения и отчеты, отправляемые ботом, делая их более информативными и удобными для пользователей.

← На главную