При разработке интеграций между 1С:Предприятие и Telegram разработчики часто сталкиваются с тем, что стандартные механизмы формирования строк ведут себя непредсказуемо при наличии спецсимволов. Типичная ситуация: бот должен выдать пользователю кнопку-ссылку (Inline Keyboard) для оплаты или перехода в личный кабинет, где в URL передается несколько параметров, разделенных амперсандом &. В этот момент бот либо перестает присылать клавиатуру вовсе, либо обрезает ссылку ровно до первого вхождения этого символа. Разберем детально, почему это происходит и как правильно решить проблему несколькими способами.
Проанализируем ситуацию с точки зрения протокола HTTP и API Telegram. Когда мы отправляем запрос к серверу Telegram (например, методом sendMessage), мы передаем данные в формате JSON или через параметры URL. Символ & в веб-технологиях является служебным разделителем параметров. Если этот символ попадает в «сыром» виде внутрь значения другого параметра, возникает конфликт интерпретации.
Рассмотрим по шагам, что происходит:
https://mysite.ru/pay?org=123&acc=456.HTTPСоединение, если вы не используете правильную сериализацию JSON или кодирование, Telegram воспринимает &acc=456 не как часть вашей ссылки, а как отдельный (и неизвестный ему) параметр самого запроса к API.Самый быстрый способ заставить ссылку работать — это заменить «опасный» символ его шестнадцатеричным эквивалентом в кодировке URL (Percent-encoding). Для символа & таким кодом является %26.
Посмотрим на пример того, как должен выглядеть код в 1С при формировании структуры кнопки:
// Неправильно (вызовет ошибку):
// Ссылка = "https://mysite.ru/review?org=20032&acc=" + ЛицевойСчет;
// Правильно (с использованием %26):
Ссылка = "https://mysite.ru/review?org=20032%26acc=" + ЛицевойСчет;
Кнопки7 = Новый Массив;
Кнопки7.Добавить(Новый Структура("text, url", "Оплата", Ссылка));
В данном случае, когда пользователь нажмет на кнопку в приложении Telegram, клиентская программа сама преобразует %26 обратно в амперсанд, и браузер откроет корректную страницу.
Ручная замена символов — это путь, чреватый ошибками, особенно если в ссылке могут оказаться пробелы, кириллица или другие знаки (например, + или #). В платформе 1С существует встроенный метод, который позволяет подготовить любую строку для безопасной передачи в URL.
Разберем, как автоматизировать этот процесс. Мы будем использовать функцию КодироватьСтроку() с параметром СпособКодированияСтроки.URL. Однако важно помнить: нельзя кодировать всю ссылку целиком (иначе двоеточие и слэши тоже превратятся в коды), нужно кодировать только значения параметров или саму строку параметров после знака вопроса.
БазоваяСсылка = "https://mysite.ru/review";
ПараметрыЗапроса = "org=20032&acc=" + ЛицевойСчет;
// Кодируем только ту часть, которая содержит спецсимволы
БезопасныеПараметры = КодироватьСтроку(ПараметрыЗапроса, СпособКодированияСтроки.URL);
// Собираем итоговый URL
ИтоговаяСсылка = БазоваяСсылка + "?" + БезопасныеПараметры;
Кнопки.Добавить(Новый Структура("text, url", "Оплата", ИтоговаяСсылка));
Важный нюанс: функция КодироватьСтроку в 1С может преобразовать амперсанд в %26, но также она может преобразовать и знак =. Если ваш сервер ожидает четкую структуру key=value, кодируйте только value (значения).
Если ваш бот отправляет ссылку не в кнопке, а просто текстом внутри сообщения, и при этом вы используете режим форматирования HTML (parse_mode=HTML), то правила меняются. В HTML амперсанд является началом спецсущности.
Проанализируем ситуацию: если вы отправите sendMessage с текстом "Перейдите по ссылке: https://site.ru/?a=1&b=2" и включенным режимом HTML, Telegram вернет ошибку, так как он будет ожидать завершения сущности после &.
В этом случае необходимо использовать HTML-entity для амперсанда — &. Рассмотрим пример формирования текста сообщения:
ТекстСообщения = "Для оплаты перейдите по ссылке: " +
"https://mysite.ru/review?org=20032&acc=" + ЛицевойСчет;
// При отправке обязательно указываем ParseMode
ДанныеСообщения = Новый Структура;
ДанныеСообщения.Вставить("chat_id", IDПользователя);
ДанныеСообщения.Вставить("text", ТекстСообщения);
ДанныеСообщения.Вставить("parse_mode", "HTML");
Часто в лицевых счетах или передаваемых фамилиях встречается знак +. При передаче в URL он может быть интерпретирован как пробел. Чтобы избежать искажения данных, всегда проверяйте, как 1С формирует итоговый JSON запроса.
Рекомендуется использовать объект ЗаписьJSON для формирования тела запроса к Telegram API. Это гарантирует, что все кавычки и обратные слэши внутри вашей ссылки будут экранированы по стандартам JSON, что исключит «падение» бота при формировании кнопок.
Пример правильной упаковки клавиатуры в JSON:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СтруктураЗапросаКТелеграм);
СтрокаJSON = Запись.Закрыть();
// Теперь СтрокаJSON готова к отправке через HTTPЗапрос
Подведем итог нашему разбору. Если вы столкнулись с тем, что амперсанд мешает работе кнопок:
& на %26. Это самый надежный метод для ссылок в кнопках.& на &.КодироватьСтроку(), чтобы не только амперсанд, но и кириллица в параметрах передавались корректно.callback_data (не путать с url) лимит составляет всего 64 байта. Если ваша ссылка с параметрами слишком длинная, она может не поместиться в callback_data, поэтому для передачи длинных ссылок используйте только поле url.Используя эти методы, вы обеспечите стабильную работу Telegram-бота и корректный переход пользователей по внешним ссылкам из интерфейса мессенджера.