Создание хранилища конфигурации

This commit is contained in:
2025-05-15 17:56:42 +03:00
commit af42567ca9
42 changed files with 3421 additions and 0 deletions

View File

@@ -0,0 +1,256 @@
#Область ПрограммныйИнтерфейс
Функция ИдПоследнегоСообщения() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(МАКСИМУМ(ТелеграмСообщения.ИдСообщения), 0) КАК ИдСообщения
|ИЗ
| РегистрСведений.ТелеграмСообщения КАК ТелеграмСообщения";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.ИдСообщения;
КонецЕсли;
Возврат 0;
КонецФункции
// Получить обновления, пришедшие от вебхука и сохранить в базу
Процедура ОбработатьИСохранитьОбновленияТелеграм(ТелоЗапроса) Экспорт
ДанныеОбновления = HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоЗапроса);
Если ДанныеОбновления = Неопределено Тогда
Возврат;
КонецЕсли;
Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда
МассивОбновлений = ДанныеОбновления["result"];
Для каждого Обновление Из МассивОбновлений Цикл
ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление);
СохранитьСообщениеВБазу(ПараметрыСообщения);
КонецЦикла;
ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда
ПараметрыСообщения = СтруктураСообщенияТелеграм(ДанныеОбновления);
СохранитьСообщениеВБазу(ПараметрыСообщения);
КонецЕсли;
КонецПроцедуры
Функция ОбновленияТелеграм(ТелоЗапроса) Экспорт
ДанныеОбновления = HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоЗапроса);
МассивСообщенийТелеграм = Новый Массив;
Если ДанныеОбновления = Неопределено Тогда
Возврат МассивСообщенийТелеграм;
КонецЕсли;
Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда
МассивОбновлений = ДанныеОбновления["result"];
Для каждого Обновление Из МассивОбновлений Цикл
ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление);
МассивСообщенийТелеграм.Добавить(ПараметрыСообщения)
КонецЦикла;
ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда
ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление);
МассивСообщенийТелеграм.Добавить(ПараметрыСообщения)
КонецЕсли;
Возврат МассивСообщенийТелеграм;
КонецФункции
Функция СтруктураСообщенияТелеграм(Обновление)
ДанныеСообщения = Обновление["message"];
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("ИдСообщения", Обновление["update_id"]);
Автор = АвторСообщения(ДанныеСообщения["from"]);
ПараметрыСообщения.Вставить("Автор", Автор);
НовоеСообщение = ТелеграмСообщение(ДанныеСообщения, Автор);
ПараметрыСообщения.Вставить("Сообщение", НовоеСообщение);
ПараметрыСообщения.Вставить("Дата", ТекущаяДатаСеанса());
ИдЧата = ДанныеСообщения["chat"]["id"];
ПараметрыСообщения.Вставить("ИдЧата", ИдЧата);
Возврат ПараметрыСообщения;
КонецФункции
Процедура СохранитьСообщениеВБазу(СтруктураСообщения) Экспорт
МенеджерЗаписи = РегистрыСведений.ТелеграмСообщения.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтруктураСообщения);
МенеджерЗаписи.Записать();
КонецПроцедуры
Функция ПолучитьФайлССервераТелеграм(ПутьКФайлуНаСервере) Экспорт
АдресРесурса = СтрШаблон("file/bot%1/%2", ТелеграмПовторноеИспользование.ТелеграмТокен(), ПутьКФайлуНаСервере);
Возврат HttpОбщегоНазначения.ВыполнитьGetЗапрос(АдресРесурса,, Истина);
КонецФункции
Функция ДанныеДокументаПоИд(ИдДокумента) Экспорт
Ответ = ТелеграмМетодыВызовСервера.GetFile(ИдДокумента);
Если Ответ = Неопределено Тогда
Возврат Ответ;
КонецЕсли;
ДанныеФайла = HttpОбщегоНазначения.СтрокаJsonВОбъект(Ответ);
//Если ДанныеФайла.Получить("ok") <> Неопределено Тогда
// Если ДанныеФайла["ok"] И ДанныеФайла.Получить["result"] <> Неопределено Тогда
// ПутьКФайлуНаСервереТелеграм = ДанныеФайла["result"]["file_path"];
// Возврат ПолучитьФайлССервераТелеграм(ПутьКФайлуНаСервереТелеграм);
// Иначе
// ЗаписьЖурналаРегистрации("Телеграм.Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
// СтрШаблон("Не удалось получить файл по id. Код ошибки %1, описание: %2", , ДанныеФайла["error_code"],
// ДанныеФайла["description"]));
// КонецЕсли;
//КонецЕсли;
Если ДанныеФайла.Получить("result") <> Неопределено Тогда
Возврат ПолучитьФайлССервераТелеграм(ДанныеФайла["result"]["file_path"]);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоМассивОбновлений(СоответствиеОбновления)
Результат = СоответствиеОбновления.Получить("ok");
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ЭтоОдиночноеОбновление(СоответствиеОбновления)
ИдОбновления = СоответствиеОбновления.Получить("update_id");
Сообщение = СоответствиеОбновления.Получить("message");
Если ИдОбновления <> Неопределено И Сообщение <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция АвторСообщения(СоответствиеОт)
Если СоответствиеОт.Получить("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) + СмещениеСтандартногоВремени(ЧасовойПоясСеанса()) + ЮниксТайм;
КонецФункции
#КонецОбласти