Как исправить ошибку 400 при удалении сообщений в Telegram через 1С

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

При разработке интеграции 1С с мессенджером Telegram разработчики часто сталкиваются с ситуацией, когда стандартные методы API возвращают ошибку 400 Bad Request: message to delete not found. В этой статье мы подробно разберем причины возникновения этой ошибки, проанализируем типичные промахи в коде и подготовим надежное решение для удаления сообщений.

Анализ синтаксиса URL-запроса

Первым делом проанализируем строку запроса, которую формирует система. Часто ошибка кроется в элементарной опечатке при конкатенации строк. Рассмотрим пример некорректной строки, которая часто встречается в коде:

.../deleteMessage?&chat_id=882380285&message_id=120347721

Обратим внимание на символ & сразу после знака вопроса. В протоколе HTTP параметры начинаются после символа ?, а символ & используется исключительно как разделитель между вторым, третьим и последующими параметрами. Если поставить его в самом начале, сервер Telegram может неверно интерпретировать имя первого параметра, что приведет к ошибке 400. Выясним причину: сервер ожидает chat_id, а получает параметр с «мусорным» символом в названии.

Переход от метода GET к методу POST

Хотя 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). Это гарантирует получение «чистого» числа в строковом представлении без лишних символов.

Ограничения Telegram API на удаление

Если код написан верно, но ошибка 400 сохраняется, проанализируем ситуацию на предмет соблюдения правил Telegram. Бот не всесилен, и существуют жесткие ограничения:

  1. Правило 48 часов: В большинстве случаев сообщение можно удалить только в течение 48 часов после отправки. Если вы пытаетесь удалить старые логи или системные уведомления недельной давности, API вернет ошибку.
  2. Права доступа в группах: Если сообщение находится в группе или супергруппе, бот должен обладать правами администратора с разрешением can_delete_messages. Свои сообщения бот может удалять всегда, а чужие — только при наличии прав.
  3. Идентификатор супергрупп: Помните, что chat_id для супергрупп и каналов всегда начинается с префикса -100. Если при обработке данных в 1С этот префикс теряется, сообщение не будет найдено.

Диагностика с помощью метода forwardMessage

Если вы не уверены, правильно ли вы получили chat_id или message_id, проанализируем ситуацию с помощью метода forwardMessage. Попробуйте программно переслать сообщение, которое хотите удалить, самому себе или в тестовый чат. Если метод пересылки возвращает ту же ошибку 400, значит, проблема однозначно в некорректных идентификаторах. Если же пересылка работает, а удаление — нет, значит, дело в правах доступа бота или в превышении лимита времени (48 часов).

Обработка исключений в 1С

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


Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния <> 200 Тогда
        ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Предупреждение,, 
            "Не удалось удалить сообщение: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Ошибка,, 
        "Ошибка связи при удалении сообщения: " + ОписаниеОшибки());
КонецПопытки;

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

← На главную