Compare commits

...

2 Commits

Author SHA1 Message Date
69b0fc406a Рефакторинг по замечаниям Sonarqube
- Уменьшил когнитивную сложность процедуры обработки команд бота
- Привел общий модуль регламента к требуемому формату
2025-06-26 18:06:29 +03:00
ddb0c43e97 Расширил функциональность бота новыми командами
- Периодическая проверка актуальности конфигураций
- Автоматическое оповещение о версиях, требующих обновления
- Получение статуса указанной конфигурации
- Включение и выключение уведомлений о версиях, требующих обновления
2025-06-26 17:12:32 +03:00
16 changed files with 595 additions and 119 deletions

View File

@@ -7,28 +7,10 @@
Для каждого ОбновлениеТелеграм Из МассивОбновленийТелеграм Цикл
ТелеграмОбщегоНазначения.СохранитьСообщениеВБазу(ОбновлениеТелеграм);
ДанныеПользователя = РаботаСОбновлениямиВызовСервера.ПолучитьДанныеПользователя(ОбновлениеТелеграм.ИдЧата);
Если ОбновлениеТелеграм.Свойство("ИдСообщения") Тогда
Если ОбновлениеТелеграм.Сообщение.text = "/start" Тогда
ОбработатьКомандуСтарт(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/subscribe" Тогда
ОбработатьКомандуПодписки(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/add" Тогда
ОбработатьКомандуДобавитьКонфигурацию(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/delete" Тогда
ОбработатьКомандуУдалитьКонфигурацию(ОбновлениеТелеграм);
ИначеЕсли ДанныеПользователя <> Неопределено И ДанныеПользователя.СтатусДиалога =
Перечисления.ТелеграмСтатусДиалога.ОжиданиеВводаВерсии Тогда
ОбработатьВводВерсииКонфигурации(ОбновлениеТелеграм, ДанныеПользователя);
КонецЕсли;
ОбработатьСообщение(ОбновлениеТелеграм)
ИначеЕсли ОбновлениеТелеграм.Свойство("ИдКоллбэка") <> Неопределено Тогда
Данные = ОбновлениеТелеграм.ДанныеКоллбэка;
Если СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion)) Тогда
ДобавитьКонфигурациюВСписокОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата);
ИначеЕсли СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.DeleteVersion)) Тогда
УдалитьКонфигурациюИзСпискаОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата);
КонецЕсли;
ОбработатьКоллбэк(ОбновлениеТелеграм);
КонецЕсли;
КонецЦикла;
@@ -38,6 +20,44 @@
#Область СлужебныеПроцедурыИФункции
Процедура ОбработатьСообщение(ОбновлениеТелеграм)
ДанныеПользователя = РаботаСОбновлениямиВызовСервера.ДанныеПользователя(ОбновлениеТелеграм.ИдЧата);
Если ОбновлениеТелеграм.Сообщение.text = "/start" Тогда
ОбработатьКомандуСтарт(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/subscribe" Тогда
ОбработатьКомандуПодписки(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/add" Тогда
ОбработатьКомандуДобавитьКонфигурацию(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/delete" Тогда
ОбработатьКомандуУдалитьКонфигурацию(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/notify_on" Тогда
ОбработатьКомандуВключитьОповещения(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/notify_off" Тогда
ОбработатьКомандуВыключитьОповещения(ОбновлениеТелеграм);
ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/status" Тогда
ОбработатьКомандуСтатусКонфигурации(ОбновлениеТелеграм);
ИначеЕсли ДанныеПользователя <> Неопределено И ДанныеПользователя.СтатусДиалога =
Перечисления.ТелеграмСтатусДиалога.ОжиданиеВводаВерсии Тогда
ОбработатьВводВерсииКонфигурации(ОбновлениеТелеграм, ДанныеПользователя);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьКоллбэк(ОбновлениеТелеграм)
Данные = ОбновлениеТелеграм.ДанныеКоллбэка;
Если СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion)) Тогда
ДобавитьКонфигурациюВСписокОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата);
ИначеЕсли СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.DeleteVersion)) Тогда
УдалитьКонфигурациюИзСпискаОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата);
ИначеЕсли СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.GetStatus)) Тогда
ПолучитьДанныеСтатусаКонфигурации(Данные, ОбновлениеТелеграм.ИдЧата);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКонфигурациюВСписокОтслеживания(ТекстСообщения, ИдЧата)
Команда = XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion);
@@ -57,7 +77,7 @@
Символы.ПС +
"Например: 3.1.30.197";
РаботаСОбновлениямиВызовСервера.УстановитьДанныеПользователя(ИдЧата, Перечисления.ТелеграмСтатусДиалога.ОжиданиеВводаВерсии,
ИмяКонфигурации);
ИмяКонфигурации);
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета);
КонецЕсли;
@@ -91,6 +111,34 @@
КонецПроцедуры
Процедура ПолучитьДанныеСтатусаКонфигурации(ТекстСообщения, ИдЧата)
Команда = XMLСтрока(Перечисления.ВидыДанныхКоллбэков.GetStatus);
Если НЕ СтрНачинаетсяС(ТекстСообщения, Команда) Тогда
Возврат;
КонецЕсли;
ИмяКонфигурации = СокрЛП(Сред(ТекстСообщения, СтрДлина(Команда) + 1));
Конфигурация = РаботаСОбновлениямиВызовСервера.КонфигурацияПоИмени(ИмяКонфигурации);
Если Конфигурация <> Неопределено Тогда
ДанныеКонфигурации = РаботаСОбновлениямиВызовСервера.СтатусКонфигурацииИзПодписки(ИдЧата, Конфигурация);
ТекстОтвета = СтрШаблон("&#8505 %1%2 %3 &#10145 %4",
ДанныеКонфигурации.Наименование,
Символы.ПС,
ДанныеКонфигурации.ТекущаяВерсия,
ДанныеКонфигурации.АктуальнаяВерсия);
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета, Перечисления.ТелеграмРежимРазметки.HTML);
Иначе
ТекстОтвета = "По данной конфигурации информация отсутствует.";
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьВводВерсииКонфигурации(ОбновлениеТелеграм, ДанныеПользователя)
ИдЧата = ОбновлениеТелеграм.ИдЧата;
@@ -165,11 +213,14 @@
"Что я умею:" + Символы.ПС +
"- Отслеживать новые релизы" + Символы.ПС +
"- Присылать уведомления о выходе обновлений" + Символы.ПС +
"- Показывать текущую версию" + Символы.ПС +
"- Показывать текущую информацию о статусе конфигурации" + Символы.ПС +
Символы.ВК + Символы.ПС +
"/subscribe - Список конфигураций для отслеживания &#128276" + Символы.ПС +
"/add - Добавить конфигурацию в список отслеживания &#10133" + Символы.ПС +
"/delete - Удалить конфигурацию из списка отслеживания &#10134";
"/subscribe - Список конфигураций для отслеживания" + Символы.ПС +
"/add - Добавить конфигурацию в список отслеживания" + Символы.ПС +
"/delete - Удалить конфигурацию из списка отслеживания" + Символы.ПС +
"/notify_on - Включить уведомления о новых версиях" + Символы.ПС +
"/notify_off - Выключить уведомления о новых версиях" + Символы.ПС +
"/status - Вывести информацию о статусе конфигурации";
ТелеграмМетодыВызовСервера.SendMessage(ОбновлениеТелеграм.ИдЧата, ТекстОтвета, Перечисления.ТелеграмРежимРазметки.HTML);
@@ -184,7 +235,7 @@
ТекстОтвета = "Не удалось получить список конфигураций";
Иначе
Для каждого ПунктМенюПодписки Из СписокКонфигураций Цикл
ТекстОтвета = ТекстОтвета + СтрШаблон("%1 %2%3", ?(ПунктМенюПодписки.Подписка, "✉️", "◼️"),
ТекстОтвета = ТекстОтвета + СтрШаблон("%1 %2%3", ?(ПунктМенюПодписки.Подписка, "&#9989", "◼️"),
ПунктМенюПодписки.Наименование,Символы.ПС);
КонецЦикла;
КонецЕсли;
@@ -228,4 +279,41 @@
КонецПроцедуры
Процедура ОбработатьКомандуВключитьОповещения(ОбновлениеТелеграм)
УправлениеОповещениями(ОбновлениеТелеграм.ИдЧата, Истина);
КонецПроцедуры
Процедура ОбработатьКомандуВыключитьОповещения(ОбновлениеТелеграм)
УправлениеОповещениями(ОбновлениеТелеграм.ИдЧата, Ложь);
КонецПроцедуры
Процедура ОбработатьКомандуСтатусКонфигурации(ОбновлениеТелеграм)
ИдЧата = ОбновлениеТелеграм.ИдЧата;
Команда = XMLстрока(Перечисления.ВидыДанныхКоллбэков.GetStatus);
МассивРядов = ТелеграмРаботаСКлавиатурой.МассивРядовСоСпискомКонфигураций(ИдЧата, Команда, Истина);
Если МассивРядов = Неопределено Тогда
ТекстОтвета = "Не удалось получить список конфигураций";
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета);
КонецЕсли;
Клавиатура = ТелеграмРаботаСКлавиатурой.КлавиатураВстроенная(МассивРядов);
ТекстОтвета = "Выберите нужную конфигурацию для получения ее статуса";
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,, Клавиатура);
КонецПроцедуры
Процедура УправлениеОповещениями(ИдЧата, Включить)
ТекстОтвета = РегистрыСведений.УведомленияОНовыхВерсиях.УправлениеОповещениями(ИдЧата, Включить);
ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета, Перечисления.ТелеграмРежимРазметки.HTML);
КонецПроцедуры
#КонецОбласти

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.19">
<CommonModule uuid="9b0db731-7b36-48ff-b27d-b6946bc97a7b">
<Properties>
<Name>ОбновленияРегламент</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обновления регламент</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@@ -0,0 +1,38 @@
#Область ПрограммныйИнтерфейс
Процедура ПроверкаНеактуальныхВерсийКонфигураций() Экспорт
РегистрыСведений.ОтслеживаниеВерсийКонфигураций.АктуализироватьВерсииКонфигураций();
СписокДляРассылкиУведомлений = РаботаСОбновлениямиВызовСервера.СписокНеактуальныхКонфигурацийДляУведомления();
Для Каждого ПолучательУведомления из СписокДляРассылкиУведомлений Цикл
ТекстСообщения = ТекстСообщенияОНеактуальнойВерсии(ПолучательУведомления.Конфигурации);
ТелеграмМетодыВызовСервера.SendMessage(ПолучательУведомления.ИдЧата, ТекстСообщения,
Перечисления.ТелеграмРежимРазметки.HTML);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ТекстСообщенияОНеактуальнойВерсии(КонфигурацииДляВывода)
ТекстСообщения = СтрШаблон("Следующие конфигурации имеют неактуальные версии:%1%2", Символы.ПС, Символы.ПС);
Для каждого ДанныеКонфигурации Из КонфигурацииДляВывода Цикл
ТекстСообщения = ТекстСообщения + СтрШаблон("&#128293 %1%2 %3 &#10145 %4%5%6",
ДанныеКонфигурации.КонфигурацияПредставление,
Символы.ПС,
ДанныеКонфигурации.ТекущаяВерсия,
ДанныеКонфигурации.АктуальнаяВерсия,
Символы.ПС,
Символы.ПС);
КонецЦикла;
Возврат ТекстСообщения;
КонецФункции
#КонецОбласти

View File

@@ -52,6 +52,39 @@
КонецФункции
Функция СтатусКонфигурацииИзПодписки(ИдЧата, Конфигурация) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтслеживаниеВерсийКонфигураций.Конфигурация.Наименование КАК Наименование,
| ОтслеживаниеВерсийКонфигураций.ТекущаяВерсия КАК ТекущаяВерсия,
| ОтслеживаниеВерсийКонфигураций.АктуальнаяВерсия КАК АктуальнаяВерсия
|ИЗ
| РегистрСведений.ОтслеживаниеВерсийКонфигураций КАК ОтслеживаниеВерсийКонфигураций
|ГДЕ
| ОтслеживаниеВерсийКонфигураций.ИдЧата = &ИдЧата
| И ОтслеживаниеВерсийКонфигураций.Конфигурация = &Конфигурация";
Запрос.УстановитьПараметр("ИдЧата", ИдЧата);
Запрос.УстановитьПараметр("Конфигурация", Конфигурация);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Результат = Новый Структура("Наименование, ТекущаяВерсия, АктуальнаяВерсия",
ВыборкаДетальныеЗаписи.Наименование,
ВыборкаДетальныеЗаписи.ТекущаяВерсия,
ВыборкаДетальныеЗаписи.АктуальнаяВерсия);
Возврат Результат;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция СписокКонфигураций(ИдЧата) Экспорт
Запрос = Новый Запрос;
@@ -97,54 +130,6 @@
КонецФункции
Функция АктуализироватьВерсииКонфигураций()Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтслеживаниеВерсийКонфигураций.Конфигурация КАК Конфигурация,
| ОтслеживаниеВерсийКонфигураций.ИдЧата КАК ИдЧата,
| ОтслеживаниеВерсийКонфигураций.ТекущаяВерсия КАК ТекущаяВерсия,
| ОтслеживаниеВерсийКонфигураций.АктуальнаяВерсия КАК АктуальнаяВерсия
|ИЗ
| РегистрСведений.ОтслеживаниеВерсийКонфигураций КАК ОтслеживаниеВерсийКонфигураций";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
КэшАктуальныхВерсий = РезультатЗапроса.Выгрузить().СкопироватьКолонки();
КэшАктуальныхВерсий.Колонки.Удалить("ИдЧата");
ОбработаноЗаписей = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Конфигурация = ВыборкаДетальныеЗаписи.Конфигурация;
ТекущаяВерсия = ВыборкаДетальныеЗаписи.ТекущаяВерсия;
ИдЧата = ВыборкаДетальныеЗаписи.ИдЧата;
АктуальнаяВерсия = ПолучитьИзКэшаАктуальнуюВерсию(КэшАктуальныхВерсий, Конфигурация, ТекущаяВерсия);
Если АктуальнаяВерсия = Неопределено Тогда
Продолжить;
КонецЕсли;
Если АктуальнаяВерсия = ВыборкаДетальныеЗаписи.АктуальнаяВерсия Тогда
Продолжить;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ОтслеживаниеВерсийКонфигураций.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Конфигурация = Конфигурация;
МенеджерЗаписи.ИдЧата = ИдЧата;
МенеджерЗаписи.ТекущаяВерсия = ТекущаяВерсия;
МенеджерЗаписи.АктуальнаяВерсия = АктуальнаяВерсия;
МенеджерЗаписи.Записать();
ОбработаноЗаписей = ОбработаноЗаписей + 1;
КонецЦикла;
Возврат ОбработаноЗаписей;
КонецФункции
Функция КонфигурацияПоИмени(ИмяКонфигурации) Экспорт
Запрос = Новый Запрос;
@@ -189,17 +174,17 @@
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ПользовательОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Если ПользовательОбъект <> Неопределено Тогда
ПользовательОбъект.СтатусДиалога = НовыйСтатус;
ПользовательОбъект.ДополнительнаяИнформация = ДополнительнаяИнформация;
ПользовательОбъект.Записать();
КонецЕсли;
ПользовательОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Если ПользовательОбъект <> Неопределено Тогда
ПользовательОбъект.СтатусДиалога = НовыйСтатус;
ПользовательОбъект.ДополнительнаяИнформация = ДополнительнаяИнформация;
ПользовательОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьДанныеПользователя(ИдЧата) Экспорт
Функция ДанныеПользователя(ИдЧата) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
@@ -226,6 +211,61 @@
КонецФункции
Функция СписокНеактуальныхКонфигурацийДляУведомления() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УведомленияОНовыхВерсиях.ИдЧата КАК ИдЧата
|ПОМЕСТИТЬ ВТатыПолучающиеУведомления
|ИЗ
| РегистрСведений.УведомленияОНовыхВерсиях КАК УведомленияОНовыхВерсиях
|ГДЕ
| УведомленияОНовыхВерсиях.ОтправлятьУведомления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОтслеживаниеВерсийКонфигураций.ИдЧата КАК ИдЧата,
| ПРЕДСТАВЛЕНИЕССЫЛКИ(ОтслеживаниеВерсийКонфигураций.Конфигурация) КАК КонфигурацияПредставление,
| ОтслеживаниеВерсийКонфигураций.ТекущаяВерсия КАК ТекущаяВерсия,
| ОтслеживаниеВерсийКонфигураций.АктуальнаяВерсия КАК АктуальнаяВерсия
|ИЗ
| РегистрСведений.ОтслеживаниеВерсийКонфигураций КАК ОтслеживаниеВерсийКонфигураций
|ГДЕ
| ОтслеживаниеВерсийКонфигураций.ТекущаяВерсия <> ОтслеживаниеВерсийКонфигураций.АктуальнаяВерсия
| И ОтслеживаниеВерсийКонфигураций.ИдЧата В
| (ВЫБРАТЬ
| Т.ИдЧата
| ИЗ
| ВТатыПолучающиеУведомления КАК Т)
|ИТОГИ ПО
| ИдЧата";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаИдЧата = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ДанныеДляУведомлений = Новый Массив;
Пока ВыборкаИдЧата.Следующий() Цикл
ВыборкаДетальныеЗаписи = ВыборкаИдЧата.Выбрать();
ДанныеВерсийКонфигураций = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДанныеВерсийКонфигураций.Добавить(Новый Структура("КонфигурацияПредставление, ТекущаяВерсия, АктуальнаяВерсия",
ВыборкаДетальныеЗаписи.КонфигурацияПредставление,
ВыборкаДетальныеЗаписи.ТекущаяВерсия,
ВыборкаДетальныеЗаписи.АктуальнаяВерсия));
КонецЦикла;
ДанныеДляУведомлений.Добавить(Новый Структура("ИдЧата, Конфигурации", ВыборкаИдЧата.ИдЧата, ДанныеВерсийКонфигураций));
КонецЦикла;
Возврат ДанныеДляУведомлений;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -242,35 +282,4 @@
КонецФункции
Функция ПолучитьИзКэшаАктуальнуюВерсию(Кэш, Конфигурация, ТекущаяВерсия)
СтруктураОтбора = Новый Структура("Конфигурация, ТекущаяВерсия", Конфигурация, ТекущаяВерсия);
МассивСтрок = Кэш.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() <> 0 Тогда
Возврат МассивСтрок[0].АктуальнаяВерсия;
КонецЕсли;
Ответ = АктуальнаяВерсияКонфигурации(Конфигурация, ТекущаяВерсия);
Если Ответ.Успех Тогда
АктуальнаяВерсияССервера = Ответ["Тело"]["configurationUpdateResponse"]["configurationVersion"];
Если АктуальнаяВерсияССервера = Неопределено Тогда
//Если запрос выполнен без ошибок и в запросе была передана актуальная версия - с сервера обновлений приходит null.
// Дополнительно проверим версию платформы, если что-то пришло, значит текущая версия существует
// и её назначаем актуальной. Таким образом отличаем некорректную версию текущей конфигурации от совпадения текущей и актуальной.
АктуальнаяВерсияПлатформы = Ответ["Тело"]["platformUpdateResponse"]["platformVersion"];
Если АктуальнаяВерсияПлатформы <> Неопределено Тогда
АктуальнаяВерсияССервера = ТекущаяВерсия;
КонецЕсли;
КонецЕсли;
НоваяСтрока = Кэш.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураОтбора);
НоваяСтрока.АктуальнаяВерсия = АктуальнаяВерсияССервера;
Возврат АктуальнаяВерсияССервера;
КонецЕсли;
Возврат Неопределено;
КонецФункции
#КонецОбласти

View File

@@ -79,16 +79,16 @@
Возврат Неопределено;
Иначе
МассивРядов = Новый Массив;
Для каждого ПунктМенюПодписки Из СписокКонфигураций Цикл
Для каждого Конфигурация Из СписокКонфигураций Цикл
Если Подписка = Неопределено
ИЛИ (Подписка И ПунктМенюПодписки.Подписка)
ИЛИ (НЕ Подписка И НЕ ПунктМенюПодписки.Подписка) Тогда
ИЛИ (Подписка И Конфигурация.Подписка)
ИЛИ (НЕ Подписка И НЕ Конфигурация.Подписка) Тогда
МассивКнопок = Новый Массив;
МассивКнопок.Добавить(ТелеграмРаботаСКлавиатурой.КнопкаКлавиатурыВстроенной(
ПунктМенюПодписки.Наименование
Конфигурация.Наименование
,
,
СтрШаблон("%1 %2", Команда, ПунктМенюПодписки.Имя)
СтрШаблон("%1 %2", Команда, Конфигурация.Имя)
));
МассивРядов.Добавить(МассивКнопок);
КонецЕсли;

View File

@@ -258,8 +258,10 @@
<CommonModule>ТелеграмРегламент</CommonModule>
<CommonModule>БотОбщегоНазначения</CommonModule>
<CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule>
<CommonModule>ОбновленияРегламент</CommonModule>
<HTTPService>HTTPСервис_Telegram</HTTPService>
<ScheduledJob>ПроверкаОбновленийТелеграм</ScheduledJob>
<ScheduledJob>ПроверкаАктуальностиКонфигураций</ScheduledJob>
<Constant>ТелеграмТокен</Constant>
<Constant>ТелеграмВебХук</Constant>
<Constant>ЛогироватьHttpЗапросы</Constant>
@@ -277,6 +279,7 @@
<DataProcessor>РаботаСОбновлениями</DataProcessor>
<InformationRegister>ТелеграмСообщения</InformationRegister>
<InformationRegister>ОтслеживаниеВерсийКонфигураций</InformationRegister>
<InformationRegister>УведомленияОНовыхВерсиях</InformationRegister>
</ChildObjects>
</Configuration>
</MetaDataObject>

View File

@@ -40,6 +40,6 @@
&НаСервереБезКонтекста
Функция АктуализироватьВерсииНаСервере(ИдЧата)
Возврат РаботаСОбновлениямиВызовСервера.АктуализироватьВерсииКонфигураций();
Возврат РегистрыСведений.ОтслеживаниеВерсийКонфигураций.АктуализироватьВерсииКонфигураций();
КонецФункции

View File

@@ -62,6 +62,18 @@
<Comment/>
</Properties>
</EnumValue>
<EnumValue uuid="a1e5fa2c-ce22-4e45-9920-0d7e77168996">
<Properties>
<Name>GetStatus</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Get status</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</EnumValue>
</ChildObjects>
</Enum>
</MetaDataObject>

View File

@@ -0,0 +1,86 @@
#Область ПрограммныйИнтерфейс
Функция АктуализироватьВерсииКонфигураций()Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтслеживаниеВерсийКонфигураций.Конфигурация КАК Конфигурация,
| ОтслеживаниеВерсийКонфигураций.ИдЧата КАК ИдЧата,
| ОтслеживаниеВерсийКонфигураций.ТекущаяВерсия КАК ТекущаяВерсия,
| ОтслеживаниеВерсийКонфигураций.АктуальнаяВерсия КАК АктуальнаяВерсия
|ИЗ
| РегистрСведений.ОтслеживаниеВерсийКонфигураций КАК ОтслеживаниеВерсийКонфигураций";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
КэшАктуальныхВерсий = РезультатЗапроса.Выгрузить().СкопироватьКолонки();
КэшАктуальныхВерсий.Колонки.Удалить("ИдЧата");
ОбработаноЗаписей = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Конфигурация = ВыборкаДетальныеЗаписи.Конфигурация;
ТекущаяВерсия = ВыборкаДетальныеЗаписи.ТекущаяВерсия;
ИдЧата = ВыборкаДетальныеЗаписи.ИдЧата;
АктуальнаяВерсия = ПолучитьИзКэшаАктуальнуюВерсию(КэшАктуальныхВерсий, Конфигурация, ТекущаяВерсия);
Если АктуальнаяВерсия = Неопределено Тогда
Продолжить;
КонецЕсли;
Если АктуальнаяВерсия = ВыборкаДетальныеЗаписи.АктуальнаяВерсия Тогда
Продолжить;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ОтслеживаниеВерсийКонфигураций.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Конфигурация = Конфигурация;
МенеджерЗаписи.ИдЧата = ИдЧата;
МенеджерЗаписи.ТекущаяВерсия = ТекущаяВерсия;
МенеджерЗаписи.АктуальнаяВерсия = АктуальнаяВерсия;
МенеджерЗаписи.Записать();
ОбработаноЗаписей = ОбработаноЗаписей + 1;
КонецЦикла;
Возврат ОбработаноЗаписей;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьИзКэшаАктуальнуюВерсию(Кэш, Конфигурация, ТекущаяВерсия)
СтруктураОтбора = Новый Структура("Конфигурация, ТекущаяВерсия", Конфигурация, ТекущаяВерсия);
МассивСтрок = Кэш.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() <> 0 Тогда
Возврат МассивСтрок[0].АктуальнаяВерсия;
КонецЕсли;
Ответ = РаботаСОбновлениямиВызовСервера.АктуальнаяВерсияКонфигурации(Конфигурация, ТекущаяВерсия);
Если Ответ.Успех Тогда
АктуальнаяВерсияССервера = Ответ["Тело"]["configurationUpdateResponse"]["configurationVersion"];
Если АктуальнаяВерсияССервера = Неопределено Тогда
//Если запрос выполнен без ошибок и в запросе была передана актуальная версия - с сервера обновлений приходит null.
// Дополнительно проверим версию платформы, если что-то пришло, значит текущая версия существует
// и её назначаем актуальной. Таким образом отличаем некорректную версию текущей конфигурации от совпадения текущей и актуальной.
АктуальнаяВерсияПлатформы = Ответ["Тело"]["platformUpdateResponse"]["platformVersion"];
Если АктуальнаяВерсияПлатформы <> Неопределено Тогда
АктуальнаяВерсияССервера = ТекущаяВерсия;
КонецЕсли;
КонецЕсли;
НоваяСтрока = Кэш.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураОтбора);
НоваяСтрока.АктуальнаяВерсия = АктуальнаяВерсияССервера;
Возврат АктуальнаяВерсияССервера;
КонецЕсли;
Возврат Неопределено;
КонецФункции
#КонецОбласти

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.19">
<InformationRegister uuid="d3461208-ab0d-48b0-a2fe-f4555454b5bf">
<InternalInfo>
<xr:GeneratedType name="InformationRegisterRecord.УведомленияОНовыхВерсиях" category="Record">
<xr:TypeId>1ddf54a2-3a5d-4946-b427-506bcd95309c</xr:TypeId>
<xr:ValueId>cdb2e881-03b3-48c3-9ec7-36462b294999</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterManager.УведомленияОНовыхВерсиях" category="Manager">
<xr:TypeId>eb27fce8-427d-4986-b690-8b604cfb6e06</xr:TypeId>
<xr:ValueId>dd7778d0-3d88-4d72-9401-ad365a283424</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterSelection.УведомленияОНовыхВерсиях" category="Selection">
<xr:TypeId>163d29b8-7d9a-4c51-8145-21104edd9cf0</xr:TypeId>
<xr:ValueId>1b5d9f41-7c3f-4236-a370-49896e8aaa4f</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterList.УведомленияОНовыхВерсиях" category="List">
<xr:TypeId>9af2c819-a19b-4b90-b979-ee6c3b018789</xr:TypeId>
<xr:ValueId>fa5f217a-afc0-4b7a-aa11-60b18156061b</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterRecordSet.УведомленияОНовыхВерсиях" category="RecordSet">
<xr:TypeId>e63c7fa6-bac4-472c-a645-8e7eb0d5a1a4</xr:TypeId>
<xr:ValueId>71240200-3f61-4922-8563-3eb04bb4f15a</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterRecordKey.УведомленияОНовыхВерсиях" category="RecordKey">
<xr:TypeId>3c8868ef-6bbc-4fb2-a0e6-6dcf2ad2e4fe</xr:TypeId>
<xr:ValueId>161d890d-6e0f-49ac-a1d3-b12797973f7d</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="InformationRegisterRecordManager.УведомленияОНовыхВерсиях" category="RecordManager">
<xr:TypeId>c75317f4-5fca-4b82-859c-adcce2cdcd0f</xr:TypeId>
<xr:ValueId>0c55617c-1757-49b7-a647-f6b027904fcb</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>УведомленияОНовыхВерсиях</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Уведомления о новых версиях</v8:content>
</v8:item>
</Synonym>
<Comment/>
<UseStandardCommands>true</UseStandardCommands>
<EditType>InDialog</EditType>
<DefaultRecordForm/>
<DefaultListForm/>
<AuxiliaryRecordForm/>
<AuxiliaryListForm/>
<InformationRegisterPeriodicity>Nonperiodical</InformationRegisterPeriodicity>
<WriteMode>Independent</WriteMode>
<MainFilterOnPeriod>false</MainFilterOnPeriod>
<IncludeHelpInContents>false</IncludeHelpInContents>
<DataLockControlMode>Managed</DataLockControlMode>
<FullTextSearch>DontUse</FullTextSearch>
<EnableTotalsSliceFirst>false</EnableTotalsSliceFirst>
<EnableTotalsSliceLast>false</EnableTotalsSliceLast>
<RecordPresentation/>
<ExtendedRecordPresentation/>
<ListPresentation/>
<ExtendedListPresentation/>
<Explanation/>
<DataHistory>DontUse</DataHistory>
<UpdateDataHistoryImmediatelyAfterWrite>false</UpdateDataHistoryImmediatelyAfterWrite>
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
</Properties>
<ChildObjects>
<Resource uuid="cdc02f8b-b82c-48d9-b936-bb2515c15258">
<Properties>
<Name>ОтправлятьУведомления</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Отправлять уведомления</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Resource>
<Dimension uuid="3d0a0b1e-a7f9-4b8d-b95c-6e23973e0896">
<Properties>
<Name>ИдЧата</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ид чата</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>15</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Master>false</Master>
<MainFilter>true</MainFilter>
<DenyIncompleteValues>false</DenyIncompleteValues>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
<TypeReductionMode>TransformValues</TypeReductionMode>
</Properties>
</Dimension>
</ChildObjects>
</InformationRegister>
</MetaDataObject>

View File

@@ -0,0 +1,22 @@
#Область ПрограммныйИнтерфейс
Функция УправлениеОповещениями(ИдЧата, Включить) Экспорт
МенеджерЗаписи = СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИдЧата = ИдЧата;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
Если МенеджерЗаписи.ОтправлятьУведомления = Включить Тогда
Возврат СтрШаблон("Оповещения уже %1", ?(Включить, "включены", "выключены"));
Иначе
МенеджерЗаписи.ОтправлятьУведомления = Включить;
МенеджерЗаписи.Записать();
Возврат СтрШаблон("Оповещения %1", ?(Включить, "включены &#128265", "выключены &#128263"));
КонецЕсли;
КонецЕсли;
Возврат СтрШаблон("Не удалось %1 оповещения", ?(Включить, "включить", "выключить"));
КонецФункции
#КонецОбласти

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.19">
<ScheduledJob uuid="79975f8c-5a0b-4b2b-b314-5e6574a7b213">
<Properties>
<Name>ПроверкаАктуальностиКонфигураций</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Проверка актуальности конфигураций</v8:content>
</v8:item>
</Synonym>
<Comment/>
<MethodName>CommonModule.ОбновленияРегламент.ПроверкаНеактуальныхВерсийКонфигураций</MethodName>
<Description/>
<Key/>
<Use>true</Use>
<Predefined>true</Predefined>
<RestartCountOnFailure>3</RestartCountOnFailure>
<RestartIntervalOnFailure>10</RestartIntervalOnFailure>
</Properties>
</ScheduledJob>
</MetaDataObject>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<JobSchedule xmlns="http://v8.1c.ru/8.3/xcf/extrnprops" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.19">
<Schedule BeginDate="0001-01-01" EndDate="0001-01-01" BeginTime="00:00:00" EndTime="00:00:00" CompletionTime="00:00:00" CompletionInterval="0" RepeatPeriodInDay="300" RepeatPause="0" WeekDayInMonth="0" DayInMonth="0" WeeksPeriod="1" DaysRepeatPeriod="1">
<ent:WeekDays>1 2 3 4 5 6 7</ent:WeekDays>
<ent:Months>1 2 3 4 5 6 7 8 9 10 11 12</ent:Months>
<ent:DetailedDailySchedules BeginDate="0001-01-01" EndDate="0001-01-01" BeginTime="00:00:00" EndTime="00:00:00" CompletionTime="00:00:00" CompletionInterval="0" RepeatPeriodInDay="300" RepeatPause="0" WeekDayInMonth="0" DayInMonth="0" WeeksPeriod="1" DaysRepeatPeriod="0">
<ent:WeekDays/>
<ent:Months/>
</ent:DetailedDailySchedules>
</Schedule>
</JobSchedule>

View File

@@ -21,6 +21,10 @@
<xr:Item xsi:type="xr:MDObjectRef">Catalog.Конфигурации</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.ТелеграмСтатусДиалога</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.ВидыДанныхКоллбэков</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">ScheduledJob.ПроверкаАктуальностиКонфигураций</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.ОбновленияРегламент</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">InformationRegister.УведомленияОНовыхВерсиях</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.РаботаСОбновлениямиВызовСервера</xr:Item>
</Content>
</Properties>
<ChildObjects/>

View File

@@ -31,6 +31,8 @@
<xr:Item xsi:type="xr:MDObjectRef">Enum.ТелеграмРежимРазметки</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.ТелеграмСтатусДиалога</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.ВидыДанныхКоллбэков</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.БотОбщегоНазначения</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.ТелеграмРаботаСКлавиатурой</xr:Item>
</Content>
</Properties>
<ChildObjects/>

View File

@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<VERSION>19</VERSION>
<VERSION>21</VERSION>