По теме из базы знаний
- Индикатор выполнения цикла
- Правильная индикация прогресса цикла на клиенте
- Отображение прогресса выполнения длительных операций в БСП и их отладка в текущем сеансе.
- Индикатор выполнения (прогресс-бар) с таймером остаточного времени выполнения (обычное приложение + УФ)
- Индикатор прогресса фонового выполнения дополнительной обработки БСП
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5) kolp821, Логика следующая:
Запускаем обработчик ожидания. Который каждую секунду выполняет чтение сообщений обмена. Если сообщение прочитано в момент выполнения фонового задания, сообщения удаляются из очереди "не сообщенных".
Код выложил набросками, так как у меня оно универсально. А Вам нужно самому разобраться что бы знать как работает этот механизм :)
Для понимания сойдет, если будут вопросы задавайте.
Обмен выполняется в общей форме
Через фоновое задание вызывается следующая процедура:
В процессе загрузки вызывается глобальная процедура:
Запускаем обработчик ожидания. Который каждую секунду выполняет чтение сообщений обмена. Если сообщение прочитано в момент выполнения фонового задания, сообщения удаляются из очереди "не сообщенных".
Код выложил набросками, так как у меня оно универсально. А Вам нужно самому разобраться что бы знать как работает этот механизм :)
Для понимания сойдет, если будут вопросы задавайте.
Обмен выполняется в общей форме
// При создании на сервере
Параметры.ИмяПроцедурыЗагрузкиИзменений = "ОбработчикиОбменаДанными.ЗагрузитьИзменения";
Параметры.UIDЗагрузкиИзменений = Новый УникальныйИдентификатор;
// При открытии на сервере
СостояниеОбмена =
"Выполняется загрузка измененных данных.
|Не закрывайте текущую форму."
;
Параметры.ЗагрузкаИзмененийЗавершена = Ложь;
Параметры.АдресСообщенийЗагрузкиИзменений = "";
ПодключитьОбработчикОжидания("Подключаемый_ЗагрузитьИзменения", 1, Ложь);
Элементы.СтраницыОсновные.ТекущаяСтраница = Элементы.СтраницаЛогРаботы;
Показать// Обработчик загрузки данных
&НаКлиенте
Процедура Подключаемый_ЗагрузитьИзменения() Экспорт
Если Параметры.ЗагрузкаИзмененийЗавершена Тогда
ОтключитьОбработчикОжидания("Подключаемый_ЗагрузитьИзменения");
Параметры.ВыполняетсяОбмен = Ложь;
СостояниеОбмена = "Загрузка изменений завершена.";
Иначе
Если ПустаяСтрока(Параметры.АдресСообщенийЗагрузкиИзменений) Тогда
Параметры.АдресСообщенийЗагрузкиИзменений = ПоместитьВоВременноеХранилище(Неопределено, Параметры.UIDЗагрузкиИзменений);
ОбработчикиОбменаДанными.ЗапуститьФоновоеЗадание(Параметры.ИмяПроцедурыЗагрузкиИзменений, Параметры.АдресСообщенийЗагрузкиИзменений);
Параметры.ВыполняетсяОбмен = Истина;
Иначе
СообщенияФоновогоЗадания = ОбработчикиОбменаДанными.ПолучитьТекстФоновогоЗадания(Параметры.ИмяПроцедурыЗагрузкиИзменений, Параметры.АдресСообщенийЗагрузкиИзменений);
Для каждого ТекущееСообщениеЗадания Из СообщенияФоновогоЗадания Цикл
ЛогРаботы.Добавить(ТекущееСообщениеЗадания.Текст);
КонецЦикла;
// ЛогРаботы - реквизит формы
Если ЛогРаботы.Количество() Тогда
Элементы.ЛогРаботы.ТекущаяСтрока = ЛогРаботы[ЛогРаботы.Количество() - 1].ПолучитьИдентификатор();
КонецЕсли;
Если ОбработчикиОбменаДанными.ФоновоеЗаданиеЗавершилось(Параметры.ИмяПроцедурыЗагрузкиИзменений, Параметры.АдресСообщенийЗагрузкиИзменений) Тогда
Параметры.ЗагрузкаИзмененийЗавершена = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // Подключаемый_ЗагрузитьИзменения
Показать// Служебные процедуры/функции
Процедура ЗапуститьФоновоеЗадание(ИмяПроцедуры, УИДЗадания) Экспорт
ФоновыеЗадания.Выполнить(ИмяПроцедуры, , УИДЗадания, УИДЗадания);
КонецПроцедуры // ЗапуститьФоновоеЗадание
Функция ФоновоеЗаданиеЗавершилось(ИмяПроцедуры, УИДЗадания) Экспорт
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ИмяМетода", ИмяПроцедуры);
СтруктураОтбора.Вставить("Ключ", УИДЗадания);
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(СтруктураОтбора);
Если МассивЗаданий.Количество() Тогда
// В нулевом индексе последнее задание.
ТекЗадание = МассивЗаданий[0];
Возврат Не ТекЗадание.Состояние = СостояниеФоновогоЗадания.Активно;
КонецЕсли;
Возврат Ложь;
КонецФункции // ФоновоеЗаданиеЗавершилось
Функция ПолучитьТекстФоновогоЗадания(ИмяПроцедуры, УИДЗадания) Экспорт
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ИмяМетода", ИмяПроцедуры);
СтруктураОтбора.Вставить("Ключ", УИДЗадания);
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(СтруктураОтбора);
Если МассивЗаданий.Количество() Тогда
// В нулевом индексе последнее задание.
ТекЗадание = МассивЗаданий[0];
Возврат ТекЗадание.ПолучитьСообщенияПользователю(Истина)
КонецЕсли;
Возврат Новый ФиксированныйМассив(Новый Массив());;
КонецФункции // ПолучитьТекстФоновогоЗадания
ПоказатьЧерез фоновое задание вызывается следующая процедура:
HTTPПодключения.ВыполнитьЗапросЗагрузкаДанных("ЗагрузитьДокумент", "Изменения");
В процессе загрузки вызывается глобальная процедура:
глСообщениеФоновогоЗадания("Загрузка изменений.");
Процедура глСообщениеФоновогоЗадания(ТекстСообщения) Экспорт
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = ТекстСообщения;
СообщениеПользователю.Сообщить();
КонецПроцедуры // СообщениеФоновогоЗадания
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот