#Область ПрограммныйИнтерфейс Функция ИдПоследнегоСообщения() Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(МАКСИМУМ(ТелеграмСообщения.ИдСообщения), 0) КАК ИдСообщения |ИЗ | РегистрСведений.ТелеграмСообщения КАК ТелеграмСообщения"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда Возврат ВыборкаДетальныеЗаписи.ИдСообщения; КонецЕсли; Возврат 0; КонецФункции // Получить обновления, пришедшие от вебхука и сохранить в базу Процедура ОбработатьИСохранитьОбновленияТелеграм(ТелоЗапроса) Экспорт ДанныеОбновления = HttpОбщегоНазначенияВызовСервера.СтрокаJsonВОбъект(ТелоЗапроса); Если ДанныеОбновления = Неопределено Тогда Возврат; КонецЕсли; Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда МассивОбновлений = ДанныеОбновления["result"]; Для каждого Обновление Из МассивОбновлений Цикл ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление); СохранитьСообщениеВБазу(ПараметрыСообщения); КонецЦикла; ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда ПараметрыСообщения = СтруктураСообщенияТелеграм(ДанныеОбновления); СохранитьСообщениеВБазу(ПараметрыСообщения); КонецЕсли; КонецПроцедуры Функция ОбновленияТелеграм(ТелоЗапроса) Экспорт Если ТипЗнч(ТелоЗапроса) = Тип("Соответствие") Тогда ДанныеОбновления = ТелоЗапроса; ИначеЕсли ТипЗнч(ТелоЗапроса) = Тип("Строка") Тогда ДанныеОбновления = HttpОбщегоНазначенияВызовСервера.СтрокаJsonВОбъект(ТелоЗапроса); Иначе Возврат Неопределено; КонецЕсли; МассивСообщенийТелеграм = Новый Массив; Если ДанныеОбновления = Неопределено Тогда Возврат МассивСообщенийТелеграм; КонецЕсли; Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда МассивОбновлений = ДанныеОбновления["result"]; Для каждого Обновление Из МассивОбновлений Цикл ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление); МассивСообщенийТелеграм.Добавить(ПараметрыСообщения) КонецЦикла; ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда Если ДанныеОбновления.Получить("message") <> Неопределено Тогда ПараметрыСообщения = СтруктураСообщенияТелеграм(ДанныеОбновления); ИначеЕсли ДанныеОбновления.Получить("callback_query") <> Неопределено Тогда ПараметрыСообщения = СтруктураКоллбэкЗапроса(ДанныеОбновления); КонецЕсли; МассивСообщенийТелеграм.Добавить(ПараметрыСообщения) КонецЕсли; Возврат МассивСообщенийТелеграм; КонецФункции Функция СтруктураСообщенияТелеграм(Обновление) ДанныеСообщения = Обновление["message"]; ПараметрыСообщения = Новый Структура; ПараметрыСообщения.Вставить("ИдСообщения", Обновление["update_id"]); Автор = АвторСообщения(ДанныеСообщения["from"]); ПараметрыСообщения.Вставить("Автор", Автор); НовоеСообщение = ТелеграмСообщение(ДанныеСообщения, Автор); ПараметрыСообщения.Вставить("Сообщение", НовоеСообщение); ПараметрыСообщения.Вставить("Дата", ТекущаяДатаСеанса()); ИдЧата = ДанныеСообщения["chat"]["id"]; ПараметрыСообщения.Вставить("ИдЧата", ИдЧата); Возврат ПараметрыСообщения; КонецФункции Функция СтруктураКоллбэкЗапроса(Обновление) ДанныеСообщения = Обновление["callback_query"]; ПараметрыСообщения = Новый Структура; ПараметрыСообщения.Вставить("ИдКоллбэкЗапроса", Обновление["update_id"]); Автор = АвторСообщения(ДанныеСообщения["from"]); ПараметрыСообщения.Вставить("Автор", Автор); Если ДанныеСообщения.Получить("message") <> Неопределено Тогда НовоеСообщение = ТелеграмСообщение(ДанныеСообщения["message"], Автор); ПараметрыСообщения.Вставить("Сообщение", НовоеСообщение); КонецЕсли; ПараметрыСообщения.Вставить("Дата", ТекущаяДатаСеанса()); ИдЧата = Автор.id; ПараметрыСообщения.Вставить("ИдЧата", ИдЧата); ДанныеКоллбэка = ДанныеСообщения["data"]; ПараметрыСообщения.Вставить("ДанныеКоллбэка", ДанныеКоллбэка); Возврат ПараметрыСообщения; КонецФункции Процедура СохранитьСообщениеВБазу(СтруктураСообщения) Экспорт МенеджерЗаписи = РегистрыСведений.ТелеграмСообщения.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтруктураСообщения); МенеджерЗаписи.Записать(); КонецПроцедуры Функция ПолучитьФайлССервераТелеграм(ПутьКФайлуНаСервере) Экспорт АдресРесурса = СтрШаблон("file/bot%1/%2", ТелеграмПовторноеИспользование.ТелеграмТокен(), ПутьКФайлуНаСервере); Соединение = Новый HTTPСоединение("api.telegram.org",443,,,, 15, Новый ЗащищенноеСоединениеOpenSSL); Возврат HttpОбщегоНазначенияВызовСервера.ВыполнитьGetЗапрос(Соединение, АдресРесурса,, Истина); КонецФункции Функция ДанныеДокументаПоИд(ИдДокумента) Экспорт Ответ = ТелеграмМетодыВызовСервера.GetFile(ИдДокумента); Если Ответ.Успех И Ответ.Тело.Получить("result") <> Неопределено Тогда Возврат ПолучитьФайлССервераТелеграм(Ответ.Тело["result"]["file_path"]); Иначе Возврат Неопределено; КонецЕсли; КонецФункции #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ЭтоМассивОбновлений(СоответствиеОбновления) Результат = СоответствиеОбновления.Получить("ok"); Если Результат <> Неопределено Тогда Возврат Результат; КонецЕсли; Возврат Ложь; КонецФункции Функция ЭтоОдиночноеОбновление(СоответствиеОбновления) ИдОбновления = СоответствиеОбновления.Получить("update_id"); Сообщение = СоответствиеОбновления.Получить("message"); КоллбэкЗапрос = СоответствиеОбновления.Получить("callback_query"); Если ИдОбновления <> Неопределено И (Сообщение <> Неопределено ИЛИ КоллбэкЗапрос <> Неопределено) Тогда Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции Функция АвторСообщения(СоответствиеОт) Если СоответствиеОт.Получить("id") = Неопределено Тогда Возврат Справочники.ТелеграмПользователь.НеОпределен; КонецЕсли; Автор = Справочники.ТелеграмПользователь.НайтиПоРеквизиту("id", СоответствиеОт["id"]); Если Не ЗначениеЗаполнено(Автор) Тогда НовыйПользователь = Справочники.ТелеграмПользователь.СоздатьЭлемент(); НовыйПользователь.Наименование = СоответствиеОт["first_name"]; НовыйПользователь.id = СоответствиеОт["id"]; НовыйПользователь.last_name = СоответствиеОт["last_name"]; НовыйПользователь.username = СоответствиеОт["username"]; НовыйПользователь.Записать(); Автор = НовыйПользователь.Ссылка; КонецЕсли; Возврат Автор; КонецФункции Функция ТелеграмСообщение(СообщениеДляОбработки, Автор) ИдСообщения = СообщениеДляОбработки.Получить("message_id"); Если ИдСообщения = Неопределено Тогда Возврат Справочники.ТелеграмСообщение.ПустаяСсылка(); КонецЕсли; ИтоговоеСообщение = Справочники.ТелеграмСообщение.НайтиПоРеквизиту("id", ИдСообщения); Если НЕ ЗначениеЗаполнено(ИтоговоеСообщение) Тогда НовоеСообщение = Справочники.ТелеграмСообщение.СоздатьЭлемент(); НовоеСообщение.Наименование = "Сообщение № " + ИдСообщения + " от " + Автор; НовоеСообщение.id = ИдСообщения; НовоеСообщение.Автор = Автор; Если СообщениеДляОбработки.Получить("text") <> Неопределено Тогда НовоеСообщение.text = СообщениеДляОбработки["text"]; КонецЕсли; Если СообщениеДляОбработки.Получить("document") <> Неопределено Тогда НовоеСообщение.document = СформироватьДокумент(СообщениеДляОбработки["document"]); КонецЕсли; НовоеСообщение.date = TimeStampToDate(СообщениеДляОбработки["date"]); НовоеСообщение.Записать(); ИтоговоеСообщение = НовоеСообщение.Ссылка; КонецЕсли; Возврат ИтоговоеСообщение; КонецФункции Функция СформироватьДокумент(СоответствиеДокумент) ИдДокумента = СоответствиеДокумент.Получить("file_unique_id"); Если ИдДокумента = Неопределено Тогда Возврат Справочники.ТелеграмДокумент.ПустаяСсылка(); КонецЕсли; ИтоговыйДокумент = Справочники.ТелеграмДокумент.НайтиПоРеквизиту("id", ИдДокумента); Если НЕ ЗначениеЗаполнено(ИтоговыйДокумент) Тогда НовыйДокумент = Справочники.ТелеграмДокумент.СоздатьЭлемент(); НовыйДокумент.Наименование = СоответствиеДокумент["file_name"]; НовыйДокумент.id = ИдДокумента; НовыйДокумент.file_name = СоответствиеДокумент["file_name"]; НовыйДокумент.mime_type = СоответствиеДокумент["mime_type"]; НовыйДокумент.file_size = СоответствиеДокумент["file_size"]; ДанныеДокумента = ДанныеДокументаПоИд(СоответствиеДокумент["file_id"]); Если ДанныеДокумента <> Неопределено Тогда НовыйДокумент.ДанныеФайла = Новый ХранилищеЗначения(ДанныеДокумента); КонецЕсли; НовыйДокумент.Записать(); ИтоговыйДокумент = НовыйДокумент.Ссылка; КонецЕсли; Возврат ИтоговыйДокумент; КонецФункции Функция TimeStampToDate(ЮниксТайм) Возврат Дата(1970,1,1,1,0,0) + СмещениеСтандартногоВремени(ЧасовойПоясСеанса()) + ЮниксТайм; КонецФункции #КонецОбласти