При разработке интеграции 1С с мессенджером Telegram разработчики часто сталкиваются с ситуацией, когда стандартные методы API возвращают ошибку 400 Bad Request: message to delete not found. В этой статье мы подробно разберем причины возникновения этой ошибки, проанализируем типичные промахи в коде и подготовим надежное решение для удаления сообщений.
Первым делом проанализируем строку запроса, которую формирует система. Часто ошибка кроется в элементарной опечатке при конкатенации строк. Рассмотрим пример некорректной строки, которая часто встречается в коде:
.../deleteMessage?&chat_id=882380285&message_id=120347721
Обратим внимание на символ & сразу после знака вопроса. В протоколе HTTP параметры начинаются после символа ?, а символ & используется исключительно как разделитель между вторым, третьим и последующими параметрами. Если поставить его в самом начале, сервер Telegram может неверно интерпретировать имя первого параметра, что приведет к ошибке 400. Выясним причину: сервер ожидает chat_id, а получает параметр с «мусорным» символом в названии.
Хотя Telegram API позволяет передавать параметры в строке запроса (метод GET), хорошим тоном и более надежным способом считается использование метода POST с передачей данных в теле запроса в формате JSON. Это избавляет нас от проблем с экранированием символов и сложным форматированием строки URL.
Рассмотрим, как правильно сформировать такой запрос в 1С. Для этого нам понадобятся объекты HTTPСоединение, HTTPЗапрос и структура для формирования JSON.
// Подготовим данные для запроса
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", Формат(IDЧата, "ЧГ=0"));
ПараметрыЗапроса.Вставить("message_id", Формат(IDСообщения, "ЧГ=0"));
// Преобразуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Настроим соединение и отправим POST-запрос
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("bot" + ТокенБот + "/deleteMessage");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Одной из скрытых причин ошибки 400 в 1С является автоматическое форматирование чисел. По умолчанию 1С при выводе больших чисел в строку добавляет неразрывные пробелы в качестве разделителей разрядов. Если chat_id или message_id будет передан как "123 456 789", Telegram не сможет распознать его как числовой идентификатор.
Посмотрим на пример правильного преобразования. Вместо использования СтрЗаменить для удаления точек или пробелов, лучше использовать специализированную форматную строку "ЧГ=0" (Число: Группировка = 0). Это гарантирует получение «чистого» числа в строковом представлении без лишних символов.
Если код написан верно, но ошибка 400 сохраняется, проанализируем ситуацию на предмет соблюдения правил Telegram. Бот не всесилен, и существуют жесткие ограничения:
can_delete_messages. Свои сообщения бот может удалять всегда, а чужие — только при наличии прав.chat_id для супергрупп и каналов всегда начинается с префикса -100. Если при обработке данных в 1С этот префикс теряется, сообщение не будет найдено.Если вы не уверены, правильно ли вы получили chat_id или message_id, проанализируем ситуацию с помощью метода forwardMessage. Попробуйте программно переслать сообщение, которое хотите удалить, самому себе или в тестовый чат. Если метод пересылки возвращает ту же ошибку 400, значит, проблема однозначно в некорректных идентификаторах. Если же пересылка работает, а удаление — нет, значит, дело в правах доступа бота или в превышении лимита времени (48 часов).
Поскольку сообщения могут быть уже удалены пользователем вручную до того, как сработает код в 1С, всегда оборачивайте вызов удаления в блок Попытка ... Исключение. Это позволит избежать аварийного завершения работы фонового задания или обработки.
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Предупреждение,,
"Не удалось удалить сообщение: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Ошибка,,
"Ошибка связи при удалении сообщения: " + ОписаниеОшибки());
КонецПопытки;
Выяснив причины возникновения ошибки и применив предложенные методы форматирования и отправки данных, мы сможем построить отказоустойчивую систему взаимодействия 1С и Telegram.