Функционал реализован для контроля многочасовых фоновых процессов.
Универсальный модуль, который встраивается в любой цикл 1С и отправляет «живой» статус в Telegram. Инструмент позволяет удаленно контролировать ход выполнения, видеть реальную скорость обработки и понимать, когда именно процесс завершится.
Тестировал в Бухгалтерия КОРП МСФО (3.3.2.24) на Платформе 8.3.25.1394.
Привел полный исходный код ниже (на форме только 2 реквизита: ИдентификаторЧата и ТокенБота):
#Область ОбработчикиСобытийФормы
&НаКлиенте
Процедура Тест(Команда)
Если НЕ (ЗначениеЗаполнено(ИдентификаторЧата) и ЗначениеЗаполнено(ТокенБота)) Тогда
Сообщить("Заполните идентификатор чата и ТокенБота");
Возврат;
КонецЕсли;
ВыполнитьТестНаСервере(ИдентификаторЧата, ТокенБота);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура ВыполнитьТестНаСервере(Знач ИдентификаторЧата, Знач ТокенБота)
КоличествоИтераций = 2000000;
НазваниеПрогрессБара = "Очень важный регламент";
// Инициализация параметров
ПараметрыВзаимодействия = ИнициализироватьПараметрыTelegram(НазваниеПрогрессБара, КоличествоИтераций, ИдентификаторЧата, ТокенБота);
Для Счетчик = 0 По КоличествоИтераций - 1 Цикл
// ... Здесь выполняется полезная нагрузка ...
ОбновитьПрогрессБар(ПараметрыВзаимодействия, Счетчик);
КонецЦикла;
// Принудительное обновление для отображения 100%
ОбновитьПрогрессБар(ПараметрыВзаимодействия, КоличествоИтераций, Истина);
КонецПроцедуры
// Инициализирует структуру параметров и устанавливает HTTP соединение.
//
// ПараметрыTelegram:
// КоличествоСтрок - Число - Общее количество итераций цикла.
// ИдентификаторЧата - Строка - ID чата или канала в Telegram.
// ТокенБота - Строка - Токен доступа к API бота.
//
// Возвращаемое значение:
// Структура - Инициализированные параметры.
//
Функция ИнициализироватьПараметрыTelegram(НазваниеПрогрессБара, КоличествоСтрок, ИдентификаторЧата, ТокенБота)
СоединениеHTTP = Новый HTTPСоединение("api.telegram.org", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
ПараметрыTelegram = Новый Структура;
ПараметрыTelegram.Вставить("НазваниеПрогрессБара", НазваниеПрогрессБара);
ПараметрыTelegram.Вставить("ИдентификаторЧата", ИдентификаторЧата);
ПараметрыTelegram.Вставить("ТокенБота", ТокенБота);
ПараметрыTelegram.Вставить("ЗадержкаОбновления", 3); // Секунды между отправкой запросов
ПараметрыTelegram.Вставить("СоединениеHTTP", СоединениеHTTP);
ПараметрыTelegram.Вставить("КоличествоСтрок", КоличествоСтрок);
ПараметрыTelegram.Вставить("ДатаНачала", ТекущаяДата());
ПараметрыTelegram.Вставить("ДатаПоследнейОтправки", '00010101');
ПараметрыTelegram.Вставить("ИдентификаторСообщения", Неопределено);
ПараметрыTelegram.Вставить("ШкалаПолная", "`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;`08;");
ПараметрыTelegram.Вставить("ШкалаПустая", "`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;`17;");
Возврат ПараметрыTelegram;
КонецФункции
// Проверяет необходимость обновления и отправляет запрос в Telegram.
//
// ПараметрыTelegram:
// ПараметрыTelegram - Структура - ПараметрыTelegram взаимодействия (см. ИнициализироватьПараметрыTelegram).
// ТекущийСчетчик - Число - Текущая итерация цикла.
// Принудительно - Булево - Если Истина, сообщение будет отправлено без проверки задержки.
//
Процедура ОбновитьПрогрессБар(ПараметрыTelegram, Знач ТекущийСчетчик, Знач Принудительно = Ложь)
ТекущаяДатаСеанса = ТекущаяДата();
Если Принудительно Или (ТекущаяДатаСеанса - ПараметрыTelegram.ДатаПоследнейОтправки) >= ПараметрыTelegram.ЗадержкаОбновления Тогда
ТекстСообщения = СформироватьТекстСообщения(ПараметрыTelegram, ТекущийСчетчик, ТекущаяДатаСеанса, Принудительно);
Идентификатор = ОтправитьЗапрос(ПараметрыTelegram, ТекстСообщения);
Если Идентификатор <> Неопределено И ПараметрыTelegram.ИдентификаторСообщения = Неопределено Тогда
ПараметрыTelegram.ИдентификаторСообщения = Идентификатор;
КонецЕсли;
ПараметрыTelegram.ДатаПоследнейОтправки = ТекущаяДатаСеанса;
КонецЕсли;
КонецПроцедуры
// Формирует текст сообщения с прогресс-баром и статистикой.
Функция СформироватьТекстСообщения(ПараметрыTelegram, ТекущийСчетчик, ТекущаяДатаСеанса, Принудительно)
Если ПараметрыTelegram.КоличествоСтрок = 0 Тогда
Возврат "Нет данных для обработки";
КонецЕсли;
ПроцентВыполнения = Цел((ТекущийСчетчик / ПараметрыTelegram.КоличествоСтрок) * 100);
КоличествоЗакрашенных = Цел(ПроцентВыполнения / 5);
ВизуальнаяШкала = Лев(ПараметрыTelegram.ШкалаПолная, КоличествоЗакрашенных) + Лев(ПараметрыTelegram.ШкалаПустая, 20 - КоличествоЗакрашенных);
ПрошлоСекунд = ТекущаяДатаСеанса - ПараметрыTelegram.ДатаНачала;
СкоростьОбработки = ТекущийСчетчик / ?(ПрошлоСекунд = 0, 1, ПрошлоСекунд);
ОсталосьСтрок = ПараметрыTelegram.КоличествоСтрок - ТекущийСчетчик;
ОсталосьСекунд = ?(СкоростьОбработки = 0, 0, ОсталосьСтрок / СкоростьОбработки);
СтрокаИтогов = ?(Принудительно, "Выполнено за", "Осталось:");
СекундыДляИтогов = ?(Принудительно, ПрошлоСекунд, ОсталосьСекунд);
ШаблонСообщения =
"%1
|%2 %3%%
|%4/%5 шт.
|Скорость: %6 шт/сек
|%7 %8";
Результат = СтрШаблон(
ШаблонСообщения,
ПараметрыTelegram.НазваниеПрогрессБара,
ВизуальнаяШкала,
ПроцентВыполнения,
Формат(ТекущийСчетчик, "ЧГ=0"),
Формат(ПараметрыTelegram.КоличествоСтрок, "ЧГ=0"),
Формат(СкоростьОбработки, "ЧДЦ=0; ЧГ=0"),
СтрокаИтогов,
ПредставлениеВремени(СекундыДляИтогов));
Возврат Результат;
КонецФункции
// Отправляет или редактирует сообщение через API Telegram.
Функция ОтправитьЗапрос(ПараметрыTelegram, ТекстСообщения)
ТекстКодированный = КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.URLВКодировкеURL);
Если ПараметрыTelegram.ИдентификаторСообщения = Неопределено Тогда
// Отправка нового сообщения
АдресРесурса = СтрШаблон("/bot%1/sendMessage?chat_id=%2&text=%3",
ПараметрыTelegram.ТокенБота,
ПараметрыTelegram.ИдентификаторЧата,
ТекстКодированный);
Иначе
// Редактирование существующего
АдресРесурса = СтрШаблон("/bot%1/editMessageText?chat_id=%2&message_id=%3&text=%4",
ПараметрыTelegram.ТокенБота,
ПараметрыTelegram.ИдентификаторЧата,
ПараметрыTelegram.ИдентификаторСообщения,
ТекстКодированный);
КонецЕсли;
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса);
Попытка
Ответ = ПараметрыTelegram.СоединениеHTTP.Получить(ЗапросHTTP);
// Разбор ответа нужен только при первой отправке, чтобы получить ID сообщения
Если ПараметрыTelegram.ИдентификаторСообщения = Неопределено И Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат СтруктураОтвета.result.message_id;
КонецЕсли;
Исключение
//ЗаписьЖурналаРегистрации("TelegramBot", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат ПараметрыTelegram.ИдентификаторСообщения;
КонецФункции
// Преобразует количество секунд в человекочитаемую строку.
Функция ПредставлениеВремени(Знач КоличествоСекунд)
КоличествоСекунд = Цел(КоличествоСекунд);
Если КоличествоСекунд < 60 Тогда
Возврат СтрШаблон("%1 сек.", КоличествоСекунд);
ИначеЕсли КоличествоСекунд < 3600 Тогда
Возврат СтрШаблон("%1 мин. %2 сек.", Цел(КоличествоСекунд / 60), КоличествоСекунд % 60);
Иначе
Возврат СтрШаблон("%1 ч. %2 мин.", Цел(КоличествоСекунд / 3600), Цел((КоличествоСекунд % 3600) / 60));
КонецЕсли;
КонецФункции
#КонецОбласти
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия КОРП, редакция 3.0, релизы 3.0.182.33
Вступайте в нашу телеграмм-группу Инфостарт
