<
  • Главная
Статьи

Приклад зв'язку 1С та месенджера Telegram. Отримання даних з 1С запитом з Telegram

  1. 1. Реєстрація бота
  2. 2. Створення обробки в 1С

В результаті читання публікації Ви отримаєте готову зовнішню обробку , Що дозволяє отримувати з дані, запитувані через Telegram .

У цій статті розглянемо наступне:

  • HTTPСоедіненіе;
  • Читання JSON для версії 8.3.6 і вище, а також аналог JSON для версії нижче 8.3.6;
  • Підключення обробника очікування;
  • Деякі основні можливості API Telegram ;
  • Як створити бота для Telegram ;
  • Програмне створення колонок дерева на керованої формі.

1. Реєстрація бота

Для початку, зареєструємо бота, отримаємо його id - токен. В Telegram для цього створено спеціальний бот - @BotFather .

Додаємо його в контакт. Отримуємо отримуємо список його команд, написавши йому / start.

Введіть команду / newbot - бот попросить придумати ім'я нашого нового боту (воно повинно закінчуватися на «bot»). BotFather надасть токен бота і посилання для додавання бота в контакти. Перевіримо отриманий токен за допомогою посилання api.telegram.org/bot<TOKEN>/getMe

Цього, в принципі, достатньо.

2. Створення обробки в 1С

створимо зовнішню обробку . Додамо реквізити обробки строковий змінної довжини «Бот», «Токен», «Сервер».

Оскільки обробку Не будемо прив'язувати до конкретної конфігурації, то список розуміються команд будемо зберігати в табличній частині обробки «ТабліцаПонімаемихКоманд» (а так, в принципі, команди можна зберігати в довіднику конфігурації).

Реквізити ТЧ рядкові: «Ім'я», «ВиполняемоеДействіе», «Параметр», «Опис»

Команди користувача (ті, які він буде писати боту) по тій же причині будемо зберігати в табличній частині «КомандиПользователей» (якщо не робити обробку універсальної, то, звичайно, переважно використовувати регістр відомостей - далі, в лістингах коду вкажемо приклади і для регістра відомостей теж).

Реквізити ТЧ: числові «chat_id», «date», булево «Виконано» і строковий «Команда».

Тепер створимо керовану форму обробки, призначимо її основний і розмістимо реквізити «Бот» і «Токен» (необов'язково, але для наочності):

Також створимо реквізит форми «Дерево» - тип «ДеревоЗначеній». У ньому будуть відображатися чати. Для наочності виведемо його на форму. Колонки дерева створимо програмно (см.далее).

Для події форми ПріСозданііНаСервере додамо процедуру:

& НаСервере Процедура ПріСозданііНаСервере (Відмова, Стандартна Обробка ) Об'єкт .Бот = "@ бот_bot"; // Ім'я бота Об'єкт .Токен = "111111111: ххххххххххххххххххххххCJw"; // Ваш токен Telegram Об'єкт .Сервер = "api. Telegram .org "; // Заповнення таблиці команд бота НоваяКоманда = Об'єкт .ТабліцаПонімаемихКоманд Додамо (); НоваяКоманда .Імя =" / start "; НоваяКоманда .ВиполняемоеДействіе =" ВивестіПріветствіе "; НоваяКоманда .Параметр =" "; НоваяКоманда .Опис =" початок роботи "; НоваяКоманда .Параметр =" "; НоваяКоманда = Об'єкт .ТабліцаПонімаемихКоманд Додамо (); НоваяКоманда .Імя =" / help "; НоваяКоманда .ВиполняемоеДействіе =" ВивестіПодсказку "; НоваяКоманда .Опис =" отримання підказки "; НоваяКоманда .Параметр = ""; НоваяКоманда = Об'єкт .ТабліцаПонімаемихКоманд .До бавить (); НоваяКоманда .Імя = "/ sys_info"; НоваяКоманда .ВиполняемоеДействіе = "СістемнаІнформація"; НоваяКоманда .Опис = "системна інф-ція. Параметр через пробіл: "+ Символи .ПС + Символи .Таб +" ВерсіяОС; ВерсіяПріложенія {за замовчуванням}; ІдентіфікаторКліента; ІнформаціяПрограммиПросмотра; ОператівнаяПамять; Процесор; ТіпПлатформи. "; НоваяКоманда .Параметр =" "; КонецПроцедури

Створимо команду форми «ПоказатьСообщенія», виведемо її на форму у вигляді кнопки і Оброблювач команди:

& НаКліенте Процедура ПоказатьСообщенія (Команда = Не визначено) Ресурс = "bot" + Об'єкт .Токен + "/ getUpdates"; З'єднання = Новий HTTPСоедіненіе (Об'єкт .Сервер, 443,,,,, Новий ЗащіщенноеСоедіненіеOpenSSL ()); Запит = Новий HTTPЗапрос (Ресурс); Відповідь = З'єднання .Одержимо (Запит); ДвоічниеДанниеОтвета = Відповідь .ПолучітьТелоКакДвоічниеДанние (); ПрочітатьДвоічниеДанниеОтвета (ДвоічниеДанниеОтвета); КонецПроцедури

Зверніть увагу, що для протоколу «https» порт вказується 443.

Якщо Ви використовуєте версію 8.3.6 і вище, то в процедурі ПрочітатьДвоічниеДанниеОтвета () будемо використовувати новий об'єкт ЧтеніеJSON ()
.

& НаСервере Процедура ПрочітатьДвоічниеДанниеОтвета (ДвоічниеДанниеОтвета) имяфайла = ПолучітьІмяВременногоФайла ( "tgm"); ДвоічниеДанниеОтвета .Запісать (имяфайла); ДеревоЗн = Новий ДеревоЗначеній (); // {Для версії 8.3.6 і вище ЧтеніеJSON = Новий ЧтеніеJSON (); ЧтеніеJSON .ОткритьФайл (имяфайла); СформіроватьДерево (ДеревоЗн, ДеревоЗн, ЧтеніеJSON); ЧтеніеJSON .Закрить (); //} // Створення колонок Реквізиту форми типу ДанниеФормиДерево Якщо ЕтаФорма .Елементи .Дерево .ПодчіненниеЕлементи .Кількість () = 0 Тоді МассівДобавляемихРеквізітов = Новий Масив; Для Кожного Колонка З ДеревоЗн Колонка Цикл МассівДобавляемихРеквізітов Додамо (Новий РеквізітФорми (Колонка .Імя, Колонка .ТіпЗначенія, "Дерево")); КонецЦікла; ІзменітьРеквізіти (МассівДобавляемихРеквізітов); КонецЕсли; //// // Перетворення об'єкта прикладного типу ДеревоЗначеній // в реквізит керованої форми (дані форми) ЗначеніеВРеквізітФорми (ДеревоЗн, "Дерево"); // Створення колонок елемента форми типу ТабліцаФорми для відображення дерева // яке для наочності розмістили на формі дерево повідомлень Якщо ЕтаФорма .Елементи .Дерево .ПодчіненниеЕлементи .Кількість () = 0 Тоді Для Кожного Колонка З ДеревоЗн Колонка Цикл НовийЕлемент = Елементи Додамо ( колонка .Імя, Тип ( "ПолеФорми"), Елементи .Дерево); НовийЕлемент .Вид = ВідПоляФорми .ПолеВвода; НовийЕлемент .ПутьКДанним = "Дерево." + Колонка .Імя; КонецЦікла; КонецЕсли; //// ЗаполнітьРС (ДеревоЗн); КонецПроцедури

У процедурі ЗаполнітьРС () будемо заповнювати табличну частину «КомандиПользователей» (або ж регістр відомостей). (Код процедури далі).

Процедура ЗаполнітьСтруктуруІзОтветаJSON () заповнює дерево чатів:

// Рекурсивне заповнення дерева для версії 8.3.6 і вище & НаСервере Процедура СформіроватьДерево (Дерево, СтрДерево, ЧтеніеJSON, Знач ІмяКолонкі = Не визначено) ЧтеніеJSON Прочитавши (); TіпJSON = ЧтеніеJSON .ТіпТекущегоЗначенія; Якщо TіпJSON = ТіпЗначеніяJSON .НачалоОб'екта АБО TіпJSON = ТіпЗначеніяJSON .НачалоМассіва Тоді НовСтр = СтрДерево .Строкі Додамо (); СформіроватьДерево (Дерево, НовСтр, ЧтеніеJSON); ІначеЕслі TіпJSON = ТіпЗначеніяJSON .ІмяСвойства Тоді СформіроватьДерево (Дерево, СтрДерево, ЧтеніеJSON, ЧтеніеJSON .ТекущееЗначеніе); ІначеЕслі TіпJSON = ТіпЗначеніяJSON .Чісло АБО TіпJSON = ТіпЗначеніяJSON .Строка АБО TіпJSON = ТіпЗначеніяJSON .Булево АБО TіпJSON = ТіпЗначеніяJSON .Null Тоді Якщо Дерево Колонка .Знайти (ІмяКолонкі) = Не визначено Тоді Дерево Колонка Додамо (ІмяКолонкі); КонецЕсли; СтрДерево [ІмяКолонкі] = ЧтеніеJSON .ТекущееЗначеніе; СформіроватьДерево (Дерево, СтрДерево, ЧтеніеJSON); ІначеЕслі TіпJSON = ТіпЗначеніяJSON .Комментарій Тоді Якщо Дерево Колонка .Знайти ( "Коментар") = Не визначено Тоді Дерево Колонка Додамо ( "Коментар"); КонецЕсли; СтрДерево .Комментарій = ЧтеніеJSON .ТекущееЗначеніе; СформіроватьДерево (Дерево, СтрДерево, ЧтеніеJSON); ІначеЕслі СтрДерево> Не визначено Тоді СформіроватьДерево (Дерево, СтрДерево .Родітель, ЧтеніеJSON); КонецЕсли; КонецПроцедури //}

Якщо Ви використовуєте версію нижче 8.3.6 то процедура ПрочітатьДвоічниеДанниеОтвета () буде такою:

& НаСервере Процедура ПрочітатьДвоічниеДанниеОтвета (ДвоічниеДанниеОтвета) имяфайла = ПолучітьІмяВременногоФайла ( "tgm"); ДвоічниеДанниеОтвета .Запісать (имяфайла); ДеревоЗн = Новий ДеревоЗначеній (); // {для версії нижче 8.3.6 - розкоментуйте ЧтеніеJSON = Новий ТекстовийДокумент (); ЧтеніеJSON Прочитавши (имяфайла); Рез = ЗаполнітьСтруктуруІзОтветаJSON (ДеревоЗн, ДеревоЗн .Строкі Додамо (), ЧтеніеJSON .ПолучітьТекст ()); //} // Створення колонок Реквізиту форми типу ДанниеФормиДерево Якщо ЕтаФорма .Елементи .Дерево .ПодчіненниеЕлементи .Кількість () = 0 Тоді МассівДобавляемихРеквізітов = Новий Масив; Для Кожного Колонка З ДеревоЗн Колонка Цикл МассівДобавляемихРеквізітов Додамо (Новий РеквізітФорми (Колонка .Імя, Колонка .ТіпЗначенія, "Дерево")); КонецЦікла; ІзменітьРеквізіти (МассівДобавляемихРеквізітов); КонецЕсли; //// // Перетворення об'єкта прикладного типу ДеревоЗначеній // в реквізит керованої форми (дані форми) ЗначеніеВРеквізітФорми (ДеревоЗн, "Дерево"); // Створення колонок елемента форми типу ТабліцаФорми для відображення дерева // яке для наочності розмістили на формі дерево повідомлень Якщо ЕтаФорма .Елементи .Дерево .ПодчіненниеЕлементи .Кількість () = 0 Тоді Для Кожного Колонка З ДеревоЗн Колонка Цикл НовийЕлемент = Елементи Додамо ( колонка .Імя, Тип ( "ПолеФорми"), Елементи .Дерево); НовийЕлемент .Вид = ВідПоляФорми .ПолеВвода; НовийЕлемент .ПутьКДанним = "Дерево." + Колонка .Імя; КонецЦікла; КонецЕсли; //// ЗаполнітьРС (ДеревоЗн); КонецПроцедури

Як вже було сказано, в процедурі ЗаполнітьРС () будемо заповнювати табличну частину «КомандиПользователей» (або ж регістр відомостей). (Код процедури далі).

Процедура ЗаполнітьСтруктуруІзОтветаJSON () - це парсер JSON і рекурсивне заповнення дерева для версії нижче 8.3.6:

// {Рекурсивне заповнення дерева для версії нижче 8.3.6 & НаСервере Функція ЗаполнітьСтруктуруІзОтветаJSON (Дерево, СтрДерево, Знач ТекстJSON) Експорт Результат = Новий Структура; ТекстJSON = СтрЗаменіть (ТекстJSON, "\" "", "" ""); ТекстJSON = СтрЗаменіть (ТекстJSON, "" "", ""); Якщо Лев (ТекстJSON, 1) = "{" Тоді ЗаполнітьДанниеІзОтветаJSON (Результат, ТекстJSON, "Структура", Дерево, СтрДерево); ІначеЕслі Лев (ТекстJSON, 1) = "[" Тоді МассівДанних = Новий Масив; ЗаполнітьДанниеІзОтветаJSON (МассівДанних, ТекстJSON, "Масив", Дерево, СтрДерево); Результат .Вставіть ( "Значення", МассівДанних); КонецЕсли; Повернення Результат; КонецФункціі & НаСервере Процедура ЗаполнітьДанниеІзОтветаJSON (Результат, ТекстJSON, ТіпДанних, Дерево, СтрДерево) ТекстJSON = СокрЛП (Серед (ТекстJSON, 2)); НомерЗначенія = 0; Поки ТекстJSON> "" Цикл ПервийСімвол = Лев (ТекстJSON, 1); Якщо ПервийСімвол = "{" Тоді Значення = Новий Структура; НовСтр = СтрДерево .Строкі Додамо (); ЗаполнітьДанниеІзОтветаJSON (Значення, ТекстJSON, "Структура", Дерево, НовСтр); Якщо ТіпДанних = "Структура" Тоді Результат .Вставіть ( &quot;Значення" +? (НомерЗначенія = 0, "", НомерЗначенія), Значення); НомерЗначенія = НомерЗначенія + 1; ІначеЕслі ТіпДанних = "Масив" Тоді Результат Додамо (Значення); КонецЕсли; ІначеЕслі ПервийСімвол = "[" Тоді Значення = Новий Масив; НовСтр = СтрДерево .Строкі Додамо (); ЗаполнітьДанниеІзОтветаJSON (Значення, ТекстJSON, "Масив", Дерево, НовСтр); Якщо ТіпДанних = "Структура" Тоді Результат .Вставіть ( &quot;Значення" +? (НомерЗначенія = 0, "", НомерЗначенія), Значення); НомерЗначенія = НомерЗначенія + 1; Інакше Результат Додамо (Значення); КонецЕсли; ІначеЕслі ПервийСімвол = "}" І ТіпДанних = "Структура" Тоді ТекстJSON = СокрЛП (Серед (ТекстJSON, 2)); Якщо Лев (ТекстJSON, 1) = "," Тоді ТекстJSON = СокрЛП (Серед (ТекстJSON, 2)); КонецЕсли; повернення; ІначеЕслі ПервийСімвол = "]" І ТіпДанних = "Масив" Тоді ТекстJSON = СокрЛП (Серед (ТекстJSON, 2)); Якщо Лев (ТекстJSON, 1) = "," Тоді ТекстJSON = СокрЛП (Серед (ТекстJSON, 2)); КонецЕсли; повернення; Інакше Якщо ТіпДанних = "Структура" Тоді Поз = Знайти (ТекстJSON, ":"); Якщо Поз = 0 Тоді Перервати; КонецЕсли; ІмяЗначенія = СокрЛП (Лев (ТекстJSON, Поз - 1)); ТекстJSON = СокрЛП (Серед (ТекстJSON, Поз + 1)); Якщо Лев (ТекстJSON, 1) = "{" Тоді Значення = Новий Структура; НовСтр = СтрДерево .Строкі Додамо (); ЗаполнітьДанниеІзОтветаJSON (Значення, ТекстJSON, "Структура", Дерево, НовСтр); ІначеЕслі Лев (ТекстJSON, 1) = "[" Тоді Значення = Новий Масив; НовСтр = СтрДерево .Строкі Додамо (); ЗаполнітьДанниеІзОтветаJSON (Значення, ТекстJSON, "Масив", Дерево, НовСтр); Інакше Поз = 0; Для Сч = 1 За СтрДліна (ТекстJSON) Цикл Символ = Серед (ТекстJSON, Сч, 1); Якщо Символ = "," АБО Символ = "]" АБО Символ = "}" Тоді Поз = Сч; перервати; КонецЕсли; КонецЦікла; Якщо Поз = 0 Тоді Значення = ТекстJSON; ТекстJSON = ""; Інакше Значення = Лев (ТекстJSON, Поз - 1); ТекстJSON = СокрЛП (Серед (ТекстJSON, Поз +? (Серед (ТекстJSON, Поз, 1) = ",", 1, 0))); КонецЕсли; Значення = СокрЛП (значення); КонецЕсли; Результат .Вставіть (ІмяЗначенія, Значення); Якщо Дерево Колонка .Знайти (ІмяЗначенія) = Не визначено Тоді Дерево Колонка Додамо (ІмяЗначенія); КонецЕсли; Якщо ІмяЗначенія = "text" Тоді СтрДерево [ІмяЗначенія] =? (СтрДліна (Значення)> 1, Серед (Значення, 2), Значення); ІначеЕслі ІмяЗначенія = "id" АБО ІмяЗначенія = "date" Тоді СтрДерево [ІмяЗначенія] = Число (Значення); Інакше СтрДерево [ІмяЗначенія] = Значення; КонецЕсли; ІначеЕслі ТіпДанних = "Масив" Тоді Поз = 0; Для Сч = 1 За СтрДліна (ТекстJSON) Цикл Символ = Серед (ТекстJSON, Сч, 1); Якщо Символ = "," АБО Символ = "]" АБО Символ = "}" Тоді Поз = Сч; перервати; КонецЕсли; КонецЦікла; Якщо Поз = 0 Тоді Значення = ТекстJSON; ТекстJSON = ""; Інакше Значення = Лев (ТекстJSON, Поз - 1); ТекстJSON = СокрЛП (Серед (ТекстJSON, Поз +? (Серед (ТекстJSON, Поз, 1) = ",", 1, 0))); КонецЕсли; Значення = СокрЛП (значення); Результат Додамо (Значення); КонецЕсли; КонецЕсли; КонецЦікла; КонецПроцедури

Тепер опишемо процедуру, що заповнює табличну частину «КомандиПользователей» або регістр відомостей:

& НаСервере Процедура ЗаполнітьРС (ДеревоЗн) Для кожного рядка З ДеревоЗн .Строкі Цикл // "Ок" Для Кожного СтрНов з рядка .Строкі Цикл // Для Кожного страп З СтрНов .Строкі Цикл // update_id Для Кожного СтрМесс З страп .Строкі Цикл // message_id date = СтрМесс .date; Команда = СокрЛП (СтрМесс .text); Параметр = ""; ПозіціяПараметра = Знайти (Команда, ""); // СтрНайті (Команда, "") не підходить, тому що шукає в різних напрямках - не тільки з початку рядка Якщо ПозіціяПараметра> 0 Тоді Параметр = СокрЛП (Серед (Команда, ПозіціяПараметра + 1)); // {якщо версія нижче 8.3.6 разкомментіруйте // Параметр = ПереобразоватьЮнікод (Параметр); //} Команда = Лев (Команда, ПозіціяПараметра - 1); КонецЕсли; Якщо ЗначеніеЗаполнено (Команда) Тоді МассівНайденнихКоманд = Об'єкт .ТабліцаПонімаемихКоманд .НайтіСтрокі (Новий Структура ( "Ім'я", Команда)); Якщо МассівНайденнихКоманд .Кількість ()> 0 Тоді Для Кожного СтрІнфо З СтрМесс .Строкі Цикл // message_id chat_id = СтрІнфо .id; Якщо ЗначеніеЗаполнено (chat_id) І chat_id> 0 Тоді // {Розкоментуйте, якщо використовуєте регістр відомостей КомандиПользователей // РС = РегістриСведеній.КомандиПользователей.СоздатьНаборЗапісей (); //РС.Отбор.chat_id.Установіть(chat_id); //РС.Отбор.date.Установіть(date); //РС.Прочітать (); // // Якщо РС.Колічество ()> 0 Тоді // // Для Кожного СтрРС З РС Цикл // Якщо НЕ СтрРС.Виполнено Тоді // СтрРС.Виполнено = ВиполнітьКомандуБота (СтрРС); // КонецЕсли; // КонецЦікла; // // РС.Запісать (); // // Інакше // РСЗ = РегістриСведеній.КомандиПользователей.СоздатьМенеджерЗапісі (); // РСЗ.chat_id = chat_id; // РСЗ.date = date; // РСЗ.Команда = Команда; // РСЗ.Виполнено = ВиполнітьКомандуБота (РСЗ); // РСЗ.Запісать (); // // КонецЕсли; //} // {а це закоментуйте, якщо використовуєте РС КомандиПользователей РС = Об'єкт .КомандиПользователей .НайтіСтрокі (Новий Структура ( "chat_id, date", chat_id, date)); Якщо РС .Кількість ()> 0 Тоді Для Кожного СтрРС З РС Цикл Якщо НЕ СтрРС .Виполнено Тоді СтрРС .Виполнено = ВиполнітьКомандуБота (СтрРС, Параметр); КонецЕсли; КонецЦікла; Інакше РСЗ = Об'єкт .КомандиПользователей Додамо (); РСЗ .chat_id = chat_id; РСЗ .date = date; РСЗ .Команда = Команда; РСЗ .Виполнено = ВиполнітьКомандуБота (РСЗ, Параметр); КонецЕсли; //} перервати; КонецЕсли; КонецЦікла; Інакше // команда не знайдена // можна вивести довідку по командам // ... КонецЕсли; КонецЕсли; КонецЦікла; КонецЦікла; КонецЦікла; КонецЦікла КонецПроцедури

Якщо ви будете використовувати регістр відомостей (я назвав його «КомандиПользователей»), то закоментуйте / разкомментіруйте відповідні ділянки коду.

Зверніть увагу, що якщо версія нижче 8.3.6, то в коді змінну Параметр треба перетворити з Юникода (цю ділянку вказано в коді в коментарі - разкомментіруйте його):

Параметр = ПереобразоватьЮнікод (параметр);

Для цього використовуємо дві функції Юнікод - парсер (він потрібен тільки для версії нижче 8.3.6):

& НаСервере Функція ПереобразоватьЮнікод (Знач СтрокаВход) Рядок = СтрокаВход; // Створюємо таблицю спецсимволи ТабліцаСімволов = Новий ТабліцаЗначеній; ТабліцаСімволов Колонка Додамо ( "КодСімвола", Новий ОпісаніеТіпов ( "Рядок" ,, Новий КваліфікаторіСтрокі (9, ДопустімаяДліна .Переменная)) ,,); ТабліцаСімволов Колонка Додамо ( "ЗначеніеКода", Новий ОпісаніеТіпов ( "Рядок" ,, Новий КваліфікаторіСтрокі (1, ДопустімаяДліна .Переменная)) ,,); Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\" ""; Стор .ЗначеніеКода = "" ""; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ n"; Стор .ЗначеніеКода = Символи .ПС; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ t"; Стор .ЗначеніеКода = Символи .Таб; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ /"; Стор .ЗначеніеКода = "\"; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ u2013"; Стор .ЗначеніеКода = "-"; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ r"; Стор .ЗначеніеКода = Символи .ВК; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ u00bb"; Стор .ЗначеніеКода = "" ""; Стр = ТабліцаСімволов Додамо (); Стор .КодСімвола = "\ u00ab"; Стор .ЗначеніеКода = "" ""; Для кожного Стор З ТабліцаСімволов Цикл // перебір спец символів КодСімв = СокрЛП (Стор .КодСімвола); ЗначеніеСімвола = Стор .ЗначеніеКода; Рядок = СтрЗаменіть (рядок, КодСімв, ЗначеніеСімвола); КонецЦікла; СтрокаСімволов = "абвгдеёжзійклмнопрстуфхцчшщ'иьеюяАБВГДЕЁЖЗІЙКЛМНОПРСТУФХЦЧШЩ'ИЬЕЮЯ" ""; // набір декодуємих символів. Якщо вам потрібні ще символи просто впишіть їх КолічествоСімв = СтрДліна (СтрокаСімволов); Лічильник = 0; Поки Лічильник = КолічествоСімв Цикл // кодування в звичайні символи ТекСімвол = Серед (СтрокаСімволов, Лічильник, 1); ЮКод = ЮнікодСімвола (ТекСімвол); Рядок = СтрЗаменіть (рядок, НРег (ЮКод), ТекСімвол); Рядок = СтрЗаменіть (рядок, ВРег (ЮКод), ТекСімвол); Лічильник = Лічильник + 1; КонецЦікла; Повернення Рядок; КонецФункціі & НаСервере Функція ЮнікодСімвола (знач Символ) пЧісло = КодСімвола (Символ, 1); СімвСтр = "\ u0000"; лЦіфри = "123456789ABCDEF"; Рез = пЧісло; лСтр = ""; Поки рез> 0 Цикл Ост = рез% 16; якщо ост 10 Тоді лСтр = "" + Ост + лСтр; Інакше лСтр = Серед (лЦіфри, Ост, 1) + лСтр; КонецЕсли; Рез = Цілий (рез / 16); КонецЦікла; Повернення Лев (СімвСтр, 6 -СтрДліна (лСтр)) + лСтр; КонецФункціі //}

У процедурі ЗаполнітьРС () викликається функція ВиполнітьКомандуБота (ЗапісьРегістра, Параметр), де ЗапісьРегістра - це рядок табличної частини ТабліцаПонімаемихКоманд (або запис Вашого регістра відомостей). Параметр - параметр команди (то що написав боту користувач).

& НаСервере Функція ВиполнітьКомандуБота (ЗапісьРегістра, Параметр) Команда = ЗапісьРегістра .Команда; МассівНайденнихСтрок = Об'єкт .ТабліцаПонімаемихКоманд .НайтіСтрокі (Новий Структура ( "Ім'я", Команда)); // виправте, якщо використовуєте РС Якщо МассівНайденнихСтрок .Кількість ()> 0 Тоді Для Кожного Стор З МассівНайденнихСтрок Цикл Якщо Стор .ВиполняемоеДействіе = "ВивестіПріветствіе" Тоді //////ВивестіПріветствіе(ЗапісьРегістра.chat_id); ІначеЕслі Стор .ВиполняемоеДействіе = "ВивестіПодсказку" Тоді //////ВивестіПодсказку(ЗапісьРегістра.chat_id); ІначеЕслі Стор .ВиполняемоеДействіе = "СістемнаІнформація" Тоді //////ВивестіСістемнуюІнформацію(ЗапісьРегістра.chat_id, Параметр); Інакше //////ВивестіПодсказку(ЗапісьРегістра.chat_id); КонецЕсли; КонецЦікла; Інакше //////ВивестіПодсказку(ЗапісьРегістра.chat_id); КонецЕсли; повернення Істина; КонецФункціі & НаСервере Процедура СообщітьОбОшібке (chat_id, ТекстОшібкі) Ресурс = "bot" + Об'єкт .Токен + "/ sendMessage? Chat_id =" + СтрЗаменіть (Формат (chat_id, "ЧДЦ =; НС =; ЧРГ =."), ".", "") + "& text =" + ТекстОшібкі; З'єднання = Новий HTTPСоедіненіе (Об'єкт .Сервер, 443,,,,, Новий ЗащіщенноеСоедіненіеOpenSSL ()); Запит = Новий HTTPЗапрос (Ресурс); Відповідь = З'єднання .Одержимо (Запит); КонецПроцедури // Текстове представлення списку команд & НаСервере Функція СпісокКоманд () СтрВозврата = ""; Для Кожного Стор З Об'єкт .ТабліцаПонімаемихКоманд Цикл СтрВозврата = СтрВозврата +? (СтрВозврата> "", Символи .ПС, "") + Стор .Імя + "-" + Стор .Опис; КонецЦікла; повернення СтрВозврата; КонецФункціі & НаСервере Процедура ВивестіПріветствіе (chat_id) Ресурс = "bot" + Об'єкт .Токен + "/ sendMessage? Chat_id =" + СтрЗаменіть (Формат (chat_id, "ЧДЦ =; НС =; ЧРГ =."), ".", "" ) + "& text = Добрий день!" + Символи .ПС + СпісокКоманд () + Символи .ПС + "Удачі!" ; З'єднання = Новий HTTPСоедіненіе (Об'єкт .Сервер, 443,,,,, Новий ЗащіщенноеСоедіненіеOpenSSL ()); Запит = Новий HTTPЗапрос (Ресурс); Відповідь = З'єднання .Одержимо (Запит); КонецПроцедури & НаСервере Процедура ВивестіПодсказку (chat_id) Ресурс = "bot" + Об'єкт .Токен + "/ sendMessage? Chat_id =" + СтрЗаменіть (Формат (chat_id, "ЧДЦ =; НС =; ЧРГ =."), ".", "" ) + "& text =" + СпісокКоманд (); З'єднання = Новий HTTPСоедіненіе (Об'єкт .Сервер, 443,,,,, Новий ЗащіщенноеСоедіненіеOpenSSL ()); Запит = Новий HTTPЗапрос (Ресурс); Відповідь = З'єднання .Одержимо (Запит); КонецПроцедури & НаСервере Процедура ВивестіСістемнуюІнформацію (chat_id, Параметр) Параметр =? (СокрЛП (Параметр) = "", "ВерсіяПріложенія", СокрЛП (Параметр)); Інфо = Новий СістемнаяІнформація (); Інформація = ""; Спроба Інформація = Інфо [Параметр]; Виняток Інформація = ОпісаніеОшібкі (); КонецПопиткі; Ресурс = "bot" + Об'єкт .Токен + "/ sendMessage? Chat_id =" + СтрЗаменіть (Формат (chat_id, "ЧДЦ =; НС =; ЧРГ =."), ".", "") + "& Text =" + інформація; З'єднання = Новий HTTPСоедіненіе (Об'єкт .Сервер, 443,,,,, Новий ЗащіщенноеСоедіненіеOpenSSL ()); Запит = Новий HTTPЗапрос (Ресурс); Відповідь = З'єднання .Одержимо (Запит); КонецПроцедури

Тут ВивестіСістемнуюІнформацію () - виводить інформацію з бази даних . У нашому прикладі користувачеві в Telegram бот може відправити інформацію:

  • про версії операційної системи;
  • про версії використовуваного : Підприємство 8 в форматі <основна версія>. <Молодша версія>. <Реліз>. <Додатковий номер релізу>. (Наприклад, 8.2.9.200);
  • Унікальний ідентифікатор клієнта. Для даного комп'ютера і даного користувача операційної системи ідентифікатор один, незалежно від інформаційної бази і користувача інформаційної бази;
  • про веб-браузері (userAgent);
  • про розмір оперативної пам'яті;
  • Ідентифікатор процесора;
  • тип платформи, в рамках якої здійснюється робота.

Все, що ми зробили працюватиме тільки тоді, коли користувач натисне кнопку «Показати повідомлення».

Для того, щоб все працювало автоматом краще використовувати фонове завдання. Але так як наша Обробка не прив'язана до конкретної бази даних і до конкретної конфігурації. Те підключимо обробник очікування.

Зробимо так:

Створимо команду форми «ЗапускФоновихЗаданій», розмістимо відповідну кнопку на формі. Оброблювач команди:

// Автоматична робота & НаКліенте Процедура АвтоматіческаяРабота (Команда) ПодключітьОбработчікОжіданія ( "Автомат", 15); // Запуск кожні 15 секунд КонецПроцедури & НаКліенте Процедура Автомат () ПоказатьСообщенія (); КонецПроцедури ////

От і все - Обробка додається.

Окреме спасибі користувачеві Інфостарт igo1 - перекодування з Юникода (Unicode) в рядок.

основу парсер JSON для версії нижче 8.3.6 взяв звідси .

Quot;Значення" +?
Quot;Значення" +?
ТекстJSON, Поз +?
Знайти (ІмяЗначенія) = Не визначено Тоді Дерево Колонка Додамо (ІмяЗначенія); КонецЕсли; Якщо ІмяЗначенія = "text" Тоді СтрДерево [ІмяЗначенія] =?
ТекстJSON, Поз +?
Токен + "/ sendMessage?
ТабліцаПонімаемихКоманд Цикл СтрВозврата = СтрВозврата +?
Токен + "/ sendMessage?
Токен + "/ sendMessage?
Одержимо (Запит); КонецПроцедури & НаСервере Процедура ВивестіСістемнуюІнформацію (chat_id, Параметр) Параметр =?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью