Прогресс бар и серверная процедура (тонкий клиент)

Программирование - Работа с интерфейсом

В данной публикации показан пример использования прогресс бара для серверной процедуры с использованием фонового задания (Тонкий клиент).

Как известно, в клиент-серверном режиме 1С прогресс бар (или функция "состояние") бесполезны, если процедура выполняется на сервере.

Одним из решением данной задачи является использование фонового задания. Ниже покажу пример , как это использовать.

Идея заключается в следующем:

1. Запускаем фоновое задание

&НаСервере
Процедура ЗапуститьФоновоеЗадание()

	// в данное хранилище можно в обработчике поместить результат выполнения операции 
	// на форме должен быть реквизит "АдресВременногоХранилища" с типом "строка"
	АдресВременногоХранилища = ПоместитьВоВременноеХранилище("", ЭтаФорма.УникальныйИдентификатор); 	
	
	ПараметрыФоновогоЗадания = Новый Массив;	
	ПараметрыФоновогоЗадания.Добавить(АдресВременногоХранилища);   	// параметр 1	
	ПараметрыФоновогоЗадания.Добавить(ТаблицаДанных.Выгрузить());	// параметр 2
	
	// запускаем фоновое задание и храним его ID
	// на форме должеь быть реквизит "ID_ФоновогоЗадания" с типом "УникальныйИдентификатор"
	ID_ФоновогоЗадания = ФоновыеЗадания.Выполнить("ОбработчикиФоновыхЗаданий.ВыполнитьОперациюСПрогрессБаром", 
				ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор, "Загрука").УникальныйИдентификатор;

КонецПроцедуры

2. Мониторим состояние выполнения процедуры, путем считывания сообщения пользователю

&НаКлиенте
Процедура ОбновлениеСостояния() Экспорт

	ТекущееЗначение = Прогресс;
	Если ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение) Тогда
		Прогресс = 100;
		ОтключитьОбработчикОжидания("ОбновлениеСостояния");
		// получим результат выполнения 
		РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
		Сообщить(РезультатВыполнения);
	Иначе
		// обновим значение прогресса 
		Прогресс = ТекущееЗначение;
	КонецЕсли;	

КонецПроцедуры

&НаСервере
Функция ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение)
	ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ID_ФоновогоЗадания);
	Сообщения = ФЗ.ПолучитьСообщенияПользователю(Истина);
	Если Сообщения.Количество()>0 Тогда
		ТекущееЗначение = Число(Сообщения[Сообщения.ВГраница()].Текст);
	Иначе
		ТекущееЗначение = ТекущееЗначение;
	КонецЕсли;
	Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
		Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно 
			И ФЗ.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда
			// ошибка выполнения
			ИнформацияОбОшибке = ФЗ.ИнформацияОбОшибке.Описание;
		КонецЕсли;			
	КонецЕсли;	
	Возврат ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции 

Кроме того, после выполнения процедура зачаустую приходится получать какой-то результат (текстовое сообщение, таблица значений или табличный документ). Любой резултат можно поместить во временное хранилище, а потом на клиенте получить результат.

	// получим результат выполнения 
	РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
	Сообщить(РезультатВыполнения);

Скачать файлы

Наименование Файл Версия Размер
Конфигурация с примером прогресс бара
.cf 10,25Kb
19.05.17
7
.cf 10,25Kb 7 Скачать

См. также

Комментарии
1. MSConfig Infostart (MSConfig) 19.05.17 14:24 Сейчас в теме
Так это же все в БСП вроде есть.
2. Алексей А (Isonic) 17 19.05.17 14:46 Сейчас в теме
(1) Много где есть... Эта статья показывает суть данного подхода.
3. Сергей Ожерельев (Поручик) 3575 19.05.17 15:28 Сейчас в теме
Только я один вспомнил, что в БСП это было реализовано в ранних версиях?
4. Влад Влад (surikateg) 19.05.17 15:39 Сейчас в теме
Да, так оно и работает. Если честно синтаксис для такой рядовой функции как отслеживание длительной операции, должен выглядеть проще. А такие выкрутасы говорят об убогости языка предоставляемого программистам для разработки. Зато это позволяет увеличить время разработки и цену для клиента.
5. Семён Павлюков (7OH) 31 24.05.17 10:45 Сейчас в теме
Чтобы новичков не обнадёживать - это ведь возможно только для обработок, находящихся в конфигурации, верно ?
6. Алексей А (Isonic) 17 24.05.17 13:47 Сейчас в теме
(5)
1. Это возможно для любых обработок (внешних, встроенных)
2. Сам обработчик (процедура работа с данными) должна находиться в общем модуле - то есть в конфигурации.
7. Семён Павлюков (7OH) 31 24.05.17 17:16 Сейчас в теме
(6) А смысл тогда во внешней обработке, если процедура внутри должна быть.
Самый интерес обычно вызывает обработка для типовой, которую менять нельзя.
Ждём 8.3.11 - там походу сервер уже сможет доставлять сообщения клиентскому окну.
8. Алексей А (Isonic) 17 25.05.17 09:13 Сейчас в теме
(7)
Данное решение используется для не типовых разработок
9. kiruha Дронов (kiruha) 360 29.05.17 18:33 Сейчас в теме
К сожалению или к счастью в 8.3.11 анонсировали прямое получение данных на клиент с сервера
https://wonderland.v8.1c.ru/blog/peredacha-informatsii-s-servera/
обработка немного запоздала
10. Алексей А (Isonic) 17 30.05.17 08:47 Сейчас в теме
(9)не переживай, не опоздала
11. kiruha Дронов (kiruha) 360 30.05.17 09:58 Сейчас в теме
(10)Здесь принято отвечать по существу , а не так как Вы.
Например объяснять - чем лучше/хуже альтернативных решений
До свидания
12. Алексей А (Isonic) 17 30.05.17 10:46 Сейчас в теме
(11)Всего доброго!
PS: не красиво говорить что уже поздно.... никогда не поздно что-то показать / рассказать.
Оставьте свое сообщение