Состояние, индикатор выполнения

1. kolp821 16.09.15 14:42 Сейчас в теме
Здравствуйте. Есть вопрос, нужно отображать выполнения цикла НаСервере в мобильном приложении. Процедура Состояние не доступна на мобильной платформе, подскажите какие еще способом можно организовать процесс выполнения
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dj_serega 393 16.09.15 15:42 Сейчас в теме
(1) kolp821, я через фоновое задание делал.
3. kolp821 16.09.15 15:43 Сейчас в теме
(2) dj_serega, но фоновые задание не доступны на мобильной платформе
4. dj_serega 393 16.09.15 15:49 Сейчас в теме
(3) kolp821, А как же я тогда их запустил? :)

Источник: http://v8.1c.ru/o7/201404mob/index.htm
5. kolp821 16.09.15 16:00 Сейчас в теме
(4) dj_serega, если не затруднить тебя, покажи пример.
6. dj_serega 393 16.09.15 16:51 Сейчас в теме
(5) kolp821, Логика следующая:
Запускаем обработчик ожидания. Который каждую секунду выполняет чтение сообщений обмена. Если сообщение прочитано в момент выполнения фонового задания, сообщения удаляются из очереди "не сообщенных".

Код выложил набросками, так как у меня оно универсально. А Вам нужно самому разобраться что бы знать как работает этот механизм :)
Для понимания сойдет, если будут вопросы задавайте.

Обмен выполняется в общей форме
// При создании на сервере
	Параметры.ИмяПроцедурыЗагрузкиИзменений	= "ОбработчикиОбменаДанными.ЗагрузитьИзменения";
	Параметры.UIDЗагрузкиИзменений			= Новый УникальныйИдентификатор;

// При открытии на сервере
СостояниеОбмена = 
	"Выполняется загрузка измененных данных.
	|Не закрывайте текущую форму."
	;
	
	Параметры.ЗагрузкаИзмененийЗавершена		= Ложь;
	Параметры.АдресСообщенийЗагрузкиИзменений	= "";
	
	ПодключитьОбработчикОжидания("Подключаемый_ЗагрузитьИзменения", 1, Ложь);
	
	Элементы.СтраницыОсновные.ТекущаяСтраница = Элементы.СтраницаЛогРаботы;
Показать

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


// Служебные процедуры/функции
Процедура ЗапуститьФоновоеЗадание(ИмяПроцедуры, УИДЗадания) Экспорт 
	
	ФоновыеЗадания.Выполнить(ИмяПроцедуры, , УИДЗадания, УИДЗадания);
	
КонецПроцедуры // ЗапуститьФоновоеЗадание

Функция   ФоновоеЗаданиеЗавершилось(ИмяПроцедуры, УИДЗадания) Экспорт 
	
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("ИмяМетода",	ИмяПроцедуры);
	СтруктураОтбора.Вставить("Ключ",		УИДЗадания);
	
	МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(СтруктураОтбора);
	
	Если МассивЗаданий.Количество() Тогда
		
		// В нулевом индексе последнее задание.
		ТекЗадание = МассивЗаданий[0];
		
		Возврат Не ТекЗадание.Состояние = СостояниеФоновогоЗадания.Активно;
		
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции // ФоновоеЗаданиеЗавершилось

Функция   ПолучитьТекстФоновогоЗадания(ИмяПроцедуры, УИДЗадания) Экспорт 
	
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("ИмяМетода",	ИмяПроцедуры);
	СтруктураОтбора.Вставить("Ключ",		УИДЗадания);
	
	МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(СтруктураОтбора);
	
	Если МассивЗаданий.Количество() Тогда
		
		// В нулевом индексе последнее задание.
		ТекЗадание = МассивЗаданий[0];
		
		Возврат ТекЗадание.ПолучитьСообщенияПользователю(Истина)
		
	КонецЕсли;
	
	Возврат Новый ФиксированныйМассив(Новый Массив());;
	
КонецФункции // ПолучитьТекстФоновогоЗадания

Показать


Через фоновое задание вызывается следующая процедура:
HTTPПодключения.ВыполнитьЗапросЗагрузкаДанных("ЗагрузитьДокумент", "Изменения");

В процессе загрузки вызывается глобальная процедура:
глСообщениеФоновогоЗадания("Загрузка изменений.");

Процедура глСообщениеФоновогоЗадания(ТекстСообщения) Экспорт 
	
	СообщениеПользователю = Новый СообщениеПользователю;
	СообщениеПользователю.Текст = ТекстСообщения;
	СообщениеПользователю.Сообщить();
	
КонецПроцедуры // СообщениеФоновогоЗадания
Показать
7. dj_serega 393 17.09.15 15:12 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот