1С 8.3 Telegram - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Telegram

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

Регистрация нового телеграмм бота, используя @BotFather: https://core.telegram.org/bots/tutorial (через команду /newbot и нужно дать ему имя, которое заканчивается на "bot").
Обновить (API) в 1С 8.3:
Функция ПолучитьОбновления(Знач ТокенДоступа) Экспорт

   Результат = Неопределено;

   АдресURL = СтрШаблон("/bot%1/getUpdates", ТокенДоступа);
   Попытка
       СоединениеHTTP = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
       ПрочитатьВСоответствие = Истина;
       Результат = GetJson(АдресURL, СоединениеHTTP, ПрочитатьВСоответствие);
   Исключение
       Результат = ОписаниеОшибки();
   КонецПопытки;

   Возврат Результат;

КонецФункции
Отправить сообщение Telegram в 1С 8.3:
Функция ОтправитьСообщение(Знач ТокенДоступа, Знач ИДЧата, Знач ТекстСообщения) Экспорт

   Результат = Неопределено;

   АдресURL = СтрШаблон("/bot%1/sendMessage?chat_id=%2&text=%3", ТокенДоступа, Формат(ИДЧата,"ЧДЦ=0; ЧГ=0"), ТекстСообщения);
   Попытка
       СоединениеHTTP = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
       ПрочитатьВСоответствие = Истина;
       Результат = ПолучитьJson(АдресURL, СоединениеHTTP, ПрочитатьВСоответствие);
   Исключение
       Результат = ОписаниеОшибки();
   КонецПопытки;

   Возврат Результат;

КонецФункции

// Отправляет GET запрос
//
// Параметры:
//   URL - Строка - URL ресурса, к которому будет отправлен запрос.
//   ПараметрыЗапроса - Структура, Соответствие - параметры, которые будут отправлены в URL (часть после ?).
//                                                См. описание Сессия.ПараметрыЗапроса.
//   ДополнительныеПараметры - Структура - см. описание параметра в ВызватьМетод.
//   Сессия - Структура - см. возвращаемое значение функции СоздатьСессию.
//
// Возвращаемое значение:
//   Соответствие, Структура - ответ, десериализованный из JSON.
//                             Параметры преобразования см. ДополнительныеПараметры.ПараметрыПреобразованияJSON.
//
Функция ПолучитьJson(URL, Соединение, Знач ПрочитатьВСоответствие = Ложь) Экспорт

   HTTPЗапрос = Новый HTTPЗапрос(URL);

   Ответ = Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
   Результат = JsonВОбъект(Ответ.ПолучитьТелоКакПоток(),,ПрочитатьВСоответствие);
   Возврат Результат;

КонецФункции

// Преобразование JSON в Объект.
//
// Параметры:
//   Json - Поток, ДвоичныеДанные - данные в формате JSON.
//   Кодировка - Строка - кодировка текста JSON. Значение по умолчанию - utf-8.
//   ПараметрыПреобразования - Структура - параметры преобразования JSON:
//      *ПрочитатьВСоответствие - Булево - если Истина, чтение объекта JSON будет выполнено в Соответствие,
//                                         иначе в Структура.
//      *ИменаСвойствСоЗначениямиДата - Массив, Строка, ФиксированныйМассив - имена свойств JSON,
//                                      для которых нужно вызывать восстановление даты из строки.
//      *ФорматДатыJSON - ФорматДатыJSON - определяет формат десериализации дат JSON-объектов.
//
// Возвращаемое значение:
//   Произвольный - значение, десериализованное из JSON.
//
Функция JsonВОбъект(Json, Кодировка = "utf-8", Знач ПрочитатьВСоответствие = Ложь, ИменаСвойствСоЗначениямиДата = Неопределено, Знач ФорматДаты = Неопределено)

   Если ФорматДаты = Неопределено Тогда
        ФорматДаты = ФорматДатыJSON.ISO;
   КонецЕсли;


   ЧтениеJSON = Новый ЧтениеJSON;
   Если ТипЗнч(Json) = Тип("ДвоичныеДанные") Тогда
       ЧтениеJSON.ОткрытьПоток(Json.ОткрытьПотокДляЧтения(), Кодировка);
   Иначе
       ЧтениеJSON.ОткрытьПоток(Json, Кодировка);
   КонецЕсли;

  Объект = ПрочитатьJSON(
       ЧтениеJSON,
       ПрочитатьВСоответствие,
       ИменаСвойствСоЗначениямиДата,
       ФорматДаты);

  
ЧтениеJSON.Закрыть();

   Возврат Объект;

КонецФункции
Доработанный вариант (v.2025) в 1С 8.3:
////////////////////////////////////////////////////////////////////////////////
// Работа с Telegram API
// Унифицированный модуль для отправки и получения сообщений
////////////////////////////////////////////////////////////////////////////////

Функция АдресСервераTelegram() Экспорт
   // Адрес API Telegram
   Возврат "api.telegram.org";
КонецФункции

Функция ЧтениеJSONВСтруктуру(Знач СтрокаJSON, ВернутьСоответствие = Истина) Экспорт
   // Преобразует строку JSON в структуру или соответствие
   ЧтениеJSON = Новый ЧтениеJSON;
   ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
   Возврат ПрочитатьJSON(ЧтениеJSON, ВернутьСоответствие);
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Получение обновлений (аналог старой функции ПолучитьОбновления)
////////////////////////////////////////////////////////////////////////////////
Функция ПолучитьОбновления(Знач ТокенДоступа) Экспорт

   // Формируем URL запроса
   URL = "https://" + АдресСервераTelegram() + "/bot" + ТокенДоступа + "/getUpdates";

   HTTPЗапрос = Новый HTTPЗапрос();
   СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
   HTTPЗапрос.АдресРесурса = СтруктураURI.ПутьНаСервере;

   HTTPСоединение = Новый HTTPСоединение(
       СтруктураURI.Хост,
       СтруктураURI.Порт,,,
       Неопределено, 20,
       ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение());

   Попытка
       HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
       Если HTTPОтвет.КодСостояния = 200 Тогда
           Возврат ЧтениеJSONВСтруктуру(HTTPОтвет.ПолучитьТелоКакСтроку(), Истина);
       Иначе
           Возврат Новый Структура("Ошибка", "Код " + HTTPОтвет.КодСостояния);
       КонецЕсли;
   Исключение
       Возврат Новый Структура("Ошибка", ОписаниеОшибки());
   КонецПопытки;

КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Отправка сообщения (унифицированная версия)
////////////////////////////////////////////////////////////////////////////////
Функция ОтправитьСообщениеТелеграмм(Знач ТокенДоступа, Знач ИДЧата, Знач ТекстСообщения) Экспорт

   Если ПустаяСтрока(ИДЧата) Тогда
       Возврат Неопределено;
   КонецЕсли;

   // Формируем структуру параметров
   Сообщение = Новый Структура();
   Сообщение.Вставить("method", "sendMessage");
   Сообщение.Вставить("token", ТокенДоступа);
   Сообщение.Вставить("chat_id", ИДЧата);
   Сообщение.Вставить("text", ТекстСообщения);

   Возврат ВызватьМетодTelegram(Сообщение);

КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Универсальный вызов метода Telegram API
////////////////////////////////////////////////////////////////////////////////
Функция ВызватьМетодTelegram(Сообщение) Экспорт

   // Формируем URL
   URL = "https://" + АдресСервераTelegram() + "/bot" + Сообщение.token + "/" + Сообщение.method;

   // Добавляем параметры в URL (для простоты — GET‑строка)
   chat_id = Сообщение.chat_id;
   Если ТипЗнч(chat_id) = Тип("Число") Тогда
       chat_id = XMLСтрока(chat_id);
   КонецЕсли;
   URL = URL + "?chat_id=" + chat_id;
   URL = URL + "&text=" + Сообщение.text;

   // Подготовка запроса
   HTTPЗапрос = Новый HTTPЗапрос();
   СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
   HTTPЗапрос.АдресРесурса = СтруктураURI.ПутьНаСервере;

   HTTPСоединение = Новый HTTPСоединение(
       СтруктураURI.Хост,
       СтруктураURI.Порт,,,
       Неопределено, 20,
       ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение());

   Попытка
       HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
       Если HTTPОтвет.КодСостояния = 200 Тогда
           Ответ = ЧтениеJSONВСтруктуру(HTTPОтвет.ПолучитьТелоКакСтроку(), Истина);
           Если Ответ.Получить("ok") = Истина Тогда
               Возврат Ответ;
           Иначе
               Возврат Новый Структура("Ошибка", "Ответ сервера: " + HTTPОтвет.ПолучитьТелоКакСтроку());
           КонецЕсли;
       Иначе
           Возврат Новый Структура("Ошибка", "Код " + HTTPОтвет.КодСостояния);
       КонецЕсли;
   Исключение
       Возврат Новый Структура("Ошибка", ОписаниеОшибки());
   КонецПопытки;

КонецФункции
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 23.11.2023 (upd.08.09.2025)
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Назад к содержимому