В результате чтения публикации Вы получите готовую внешнюю обработку [1], позволяющую получать из 1С [1] данные, запрашиваемые через Telegram [2].
В данной статье рассмотрим следующее:
Для начала, зарегистрируем бота, получим его id - токен. В Telegram [2] для этого создан специальный бот — @BotFather [3].
Добавляем его в контакт. Получаем получаем список его команд, написав ему /start.
Введите команду /newbot — бот попросит придумать имя нашему новому боту (оно должно оканчиваться на «bot»). BotFather предоставит токен бота и ссылку для добавления бота в контакты. Проверим полученный токен с помощью ссылки api.telegram.org/bot<TOKEN>/getMe [4]
Этого, в принципе, достаточно.
Создадим внешнюю обработку [1]. Добавим реквизиты обработки строковый переменной длины «Бот», «Токен», «Сервер».
Т.к. обработку [1] не будем привязывать к конкретной конфигурации, то список понимаемых команд будем хранить в табличной части обработки «ТаблицаПонимаемыхКоманд» (а так, в принципе, команды можно хранить в справочнике конфигурации).
Реквизиты ТЧ строковые: «Имя», «ВыполняемоеДействие», «Параметр», «Описание»
Команды пользователя (те, которые он буде писать боту) по той же причине будем хранить в табличной части «КомандыПользователей» (если не делать обработку [1] универсальной, то, конечно, предпочтительно использовать регистр сведений – далее, в листингах кода укажем примеры и для регистра сведений тоже).
Реквизиты ТЧ: числовые «chat_id», «date», булево «Выполнено» и строковый «Команда».
Теперь создадим управляемую форму обработки, назначим ее основной и разместим реквизиты «Бот» и «Токен» (необязательно, но для наглядности):
Также создадим реквизит формы «Дерево» – тип «ДеревоЗначений». В нем будут отображаться чаты. Для наглядности выведем его на форму. Колонки дерева создадим программно (см.далее).
Для события формы ПриСозданииНаСервере добавим процедуру:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка [1]) Объект.Бот = "@бот_bot";//Имя бота Объект.Токен = "111111111:ххххххххххххххххххххххCJw";//Ваш токен Telegram [2] Объект.Сервер = "api.Telegram [2].org"; //Заполнение таблицы команд бота НоваяКоманда = Объект.ТаблицаПонимаемыхКоманд.Добавить(); НоваяКоманда.Имя = "/start"; НоваяКоманда.ВыполняемоеДействие = "ВывестиПриветствие"; НоваяКоманда.Параметр = ""; НоваяКоманда.Описание = "начало работы"; НоваяКоманда.Параметр = ""; НоваяКоманда = Объект.ТаблицаПонимаемыхКоманд.Добавить(); НоваяКоманда.Имя = "/help"; НоваяКоманда.ВыполняемоеДействие = "ВывестиПодсказку"; НоваяКоманда.Описание = "получение подсказки"; НоваяКоманда.Параметр = ""; НоваяКоманда = Объект.ТаблицаПонимаемыхКоманд.Добавить(); НоваяКоманда.Имя = "/sys_info"; НоваяКоманда.ВыполняемоеДействие = "СистемнаИнформация"; НоваяКоманда.Описание = "системная инф-ция. Параметр через пробел:" + Символы.ПС + Символы.Таб + "ВерсияОС;ВерсияПриложения {по умолчанию};ИдентификаторКлиента;ИнформацияПрограммыПросмотра;ОперативнаяПамять;Процессор;ТипПлатформы."; НоваяКоманда.Параметр = ""; КонецПроцедуры
Создадим команду формы «ПоказатьСообщения», выведем ее на форму в виде кнопки и Обработчик команды:
&НаКлиенте Процедура ПоказатьСообщения(Команда = Неопределено) Ресурс = "bot" + Объект.Токен + "/getUpdates"; Соединение = Новый HTTPСоединение(Объект.Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); Запрос = Новый HTTPЗапрос(Ресурс); Ответ = Соединение.Получить(Запрос); ДвоичныеДанныеОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные(); ПрочитатьДвоичныеДанныеОтвета(ДвоичныеДанныеОтвета); КонецПроцедуры
Обратите внимание, что для протокола «https» порт указывается 443.
Если Вы используете версию 1С [1] 8.3.6 и выше, то в процедуре ПрочитатьДвоичныеДанныеОтвета() будем использовать новый объект ЧтениеJSON()
.
&НаСервере Процедура ПрочитатьДвоичныеДанныеОтвета(ДвоичныеДанныеОтвета) ИмяФайла = ПолучитьИмяВременногоФайла("tgm"); ДвоичныеДанныеОтвета.Записать(ИмяФайла); ДеревоЗн = Новый ДеревоЗначений(); //{Для версии 1С [1] 8.3.6 и выше ЧтениеJSON = Новый ЧтениеJSON(); ЧтениеJSON.ОткрытьФайл(ИмяФайла); СформироватьДерево(ДеревоЗн, ДеревоЗн, ЧтениеJSON); ЧтениеJSON.Закрыть(); //} //Создание колонок Реквизита формы типа ДанныеФормыДерево Если ЭтаФорма.Элементы.Дерево.ПодчиненныеЭлементы.Количество() = 0 Тогда МассивДобавляемыхРеквизитов = Новый Массив; Для Каждого Колонка Из ДеревоЗн.Колонки Цикл МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево")); КонецЦикла; ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецЕсли; //// // Преобразование объекта прикладного типа ДеревоЗначений // в реквизит управляемой формы (данные формы) ЗначениеВРеквизитФормы(ДеревоЗн, "Дерево"); //Создание колонок элемента формы типа ТаблицаФормы для отображения дерева //которое для наглядности разместили на форме дерево сообщений Если ЭтаФорма.Элементы.Дерево.ПодчиненныеЭлементы.Количество() = 0 Тогда Для Каждого Колонка Из ДеревоЗн.Колонки Цикл НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.Дерево); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя; КонецЦикла; КонецЕсли; //// ЗаполнитьРС(ДеревоЗн); КонецПроцедуры
В процедуре ЗаполнитьРС() будем заполнять табличную часть «КомандыПользователей» (или же регистр сведений). (код процедуры далее).
Процедура ЗаполнитьСтруктуруИзОтветаJSON() заполняет дерево чатов:
//Рекурсивное заполнение дерева для версии 1С [1] 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); КонецЕсли; КонецПроцедуры //}
Если Вы используете версию 1С [1] ниже 8.3.6 то процедура ПрочитатьДвоичныеДанныеОтвета() будет такой:
&НаСервере Процедура ПрочитатьДвоичныеДанныеОтвета(ДвоичныеДанныеОтвета) ИмяФайла = ПолучитьИмяВременногоФайла("tgm"); ДвоичныеДанныеОтвета.Записать(ИмяФайла); ДеревоЗн = Новый ДеревоЗначений(); //{для версии 1С [1] ниже 8.3.6 - раскомментируйте ЧтениеJSON = Новый ТекстовыйДокумент(); ЧтениеJSON.Прочитать(ИмяФайла); Рез = ЗаполнитьСтруктуруИзОтветаJSON(ДеревоЗн, ДеревоЗн.Строки.Добавить(), ЧтениеJSON.ПолучитьТекст()); //} //Создание колонок Реквизита формы типа ДанныеФормыДерево Если ЭтаФорма.Элементы.Дерево.ПодчиненныеЭлементы.Количество() = 0 Тогда МассивДобавляемыхРеквизитов = Новый Массив; Для Каждого Колонка Из ДеревоЗн.Колонки Цикл МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево")); КонецЦикла; ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецЕсли; //// // Преобразование объекта прикладного типа ДеревоЗначений // в реквизит управляемой формы (данные формы) ЗначениеВРеквизитФормы(ДеревоЗн, "Дерево"); //Создание колонок элемента формы типа ТаблицаФормы для отображения дерева //которое для наглядности разместили на форме дерево сообщений Если ЭтаФорма.Элементы.Дерево.ПодчиненныеЭлементы.Количество() = 0 Тогда Для Каждого Колонка Из ДеревоЗн.Колонки Цикл НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.Дерево); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя; КонецЦикла; КонецЕсли; //// ЗаполнитьРС(ДеревоЗн); КонецПроцедуры
Как уже было сказано, в процедуре ЗаполнитьРС() будем заполнять табличную часть «КомандыПользователей» (или же регистр сведений). (код процедуры далее).
Процедура ЗаполнитьСтруктуруИзОтветаJSON() – это парсер JSON и рекурсивное заполнение дерева для версии ниже 1С [1] 8.3.6:
//{Рекурсивное заполнение дерева для версии ниже 1С [1] 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, "Структура", Дерево, НовСтр); Если ТипДанных = "Структура" Тогда Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение); НомерЗначения = НомерЗначения + 1; ИначеЕсли ТипДанных = "Массив" Тогда Результат.Добавить(Значение); КонецЕсли; ИначеЕсли ПервыйСимвол = "[" Тогда Значение = Новый Массив; НовСтр = СтрДерево.Строки.Добавить(); ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив", Дерево, НовСтр); Если ТипДанных = "Структура" Тогда Результат.Вставить("Значение" + ?(НомерЗначения = 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)); //{если версия ниже 1С [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; РСЗ.Команда = Команда; РСЗ.Выполнено = ВыполнитьКомандуБота(РСЗ, Параметр); КонецЕсли; //} прервать; КонецЕсли; КонецЦикла; Иначе //команда не найдена //можно вывести справку по командам //... КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла КонецПроцедуры
Если вы будете использовать регистр сведений (я назвал его «КомандыПользователей»), то закомментируйте/разкомментируйте соответствующие участки кода.
Обратите внимание, что если версия ниже 1С [1] 8.3.6, то в коде переменную Параметр надо преобразовать из Юникода (этот участок обозначен в коде в комментарии - разкомментируйте его):
Параметр = ПереобразоватьЮникод(Параметр);
Для этого используем две функции Юникод – парсер (он нужен только для версии 1С [1] ниже 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Запрос(Ресурс); Ответ = Соединение.Получить(Запрос); КонецПроцедуры
Здесь ВывестиСистемнуюИнформацию() – выводит информацию из базы данных 1С [1]. В нашем примере пользователю в Telegram [2] бот может отправить информацию:
Все, что мы сделали будет работать только тогда, когда пользователь нажмет кнопку «Показать сообщения».
Для того, чтобы все работало автоматом лучше использовать фоновое задание. Но так как наша Обработка [1] не привязана к конкретной базе данных и к конкретной конфигурации. То подключим обработчик ожидания.
Сделаем так:
Создадим команду формы «ЗапускФоновыхЗаданий», разместим соответствующую кнопку на форме. Обработчик команды:
//Автоматическая работа &НаКлиенте Процедура АвтоматическаяРабота(Команда) ПодключитьОбработчикОжидания("Автомат",15);//Запуск каждые 15 секунд КонецПроцедуры &НаКлиенте Процедура Автомат() ПоказатьСообщения(); КонецПроцедуры ////
Вот и все – Обработка [1] прилагается.
Отдельное спасибо пользователю Инфостарт igo1 [5] - перекодировка из Юникода (Unicode) в строку.
Основу 1С [1] парсер JSON для версии 1С [1] ниже 8.3.6 взял отсюда [6].
Ссылки
[1] https://www.mykib.org/article/den-devyatyy-integriroval-samyy-bolshoy-katalog-razrabotok-dlya-platformy-1s
[2] http://mykib.org/article/integraciya-1s-s-messendzherom-telegram-dlya-lyuboy-konfiguracii#overlay-context=article/integraciya-1s-s-messendzherom-telegram-dlya-lyuboy-konfiguracii
[3] https://telegram.me/botfather
[4] https://api.telegram.org/bot%3CTOKEN%3E/getMe
[5] http://infostart.ru/public/273689/
[6] https://helpf.pro/faq83/view/1664.html
[7] https://www.mykib.org/tags/1s-8
[8] https://www.mykib.org/tags/telegram
[9] https://www.mykib.org/sites/default/files/downloads/telegram_sample.zip
[10] https://www.mykib.org/comment/9455#comment-9455
[11] https://www.mykib.org/comment/12509#comment-12509
[12] https://www.mykib.org/comment/13406#comment-13406
[13] https://www.mykib.org/users/mykiborg
[14] https://www.mykib.org/comment/13408#comment-13408
[15] https://www.mykib.org/comment/13455#comment-13455
[16] https://www.mykib.org/comment/13463#comment-13463
[17] https://www.mykib.org/comment/17071#comment-17071
[18] https://www.mykib.org/comment/21164#comment-21164
[19] https://www.mykib.org/comment/21190#comment-21190
[20] https://www.mykib.org/comment/26479#comment-26479
Комментарии
Обработка [10]
Могу помочь с этим, [11]
Бот [12]
getUpdates?offset=-300 [14]
Блокировка телеграм [15]
Да, 1С с Telegram работает несмотря на блокировки Роскомнадзора [16]
спасибо полезный материал! [17]
Огромное спасибо!! [18]
Спасибо! [19]
Подскажите как можно принять оплату [20]