gifts2017

Графический индикатор процесса в табличной части на Управляемых формах

Опубликовал Денис (amyd) в раздел Программирование - Работа с интерфейсом

Графический индикатор процесса на Управляемых формах, для любой ячейки в табличной части формы

Изначально искал, как сделать индикатор процесса в управляемых формах. Почти все ссылки с интернета идут на этот сайт, в результате понял что индикатор делается через функцию Сообщить().
Но тут задумался, а чего бы не сделать чтоб в таблице на форме в одной колонке можно было вывести индикатор для каждой строки?
оказалось не так и сложно, больше времени ушло на прорисовку графического индикатора для каждого процента (итого 100 картинок)
Дальше встал вопрос как их вместить в обработку и как вызывать?
в результате получилась вот такая вот обработка, которая содержит в себе кучу примеров работы в управляемых формах, а именно:
1. вывод картики в ячейки табличной части через навигационную ссылку
2. обращение к макету и вытаскивание из него картинок
3. создание навигационных ссылок для внешних графических файлов, и подсовование их "на лету" в форму

Перед октытием читаем картинки из макета и формируем на их основе навигационные ссылки, которые помещаем в список значений. (в дальнейшем булем обращатся к нему из расчета индекс в списке значений = текущий процент.
 

&НаСервере
Функция   ВернутьНовигационнуюСсылку()
	Макет=РеквизитФормыВЗначение("Объект").ПолучитьМакет("Индикатор");
	Возврат Макет;
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	 // подготовим навигационные ссылки из макета
	МакетИндикатор = ВернутьНовигационнуюСсылку();
	НулевойСсылка="";
	Для каждого ЭлРисунок из МакетИндикатор.Рисунки Цикл
		УИД=новый УникальныйИдентификатор;
		СсылкаНаКартинку=ПоместитьВоВременноеХранилище(ЭлРисунок.Картинка,УИД);
		ЭтотОбъект.ПроцентыНавигационныеСсылки.Добавить(СсылкаНаКартинку);
		Если НулевойСсылка="" Тогда
			НулевойСсылка=СсылкаНаКартинку;
		КонецЕсли;
	КонецЦикла;
	// с процентами
	нов =Объект.ТабличнаяЧасть1.Добавить();;
	инд=нов.ПолучитьИдентификатор();
	нов.Реквизит1="1000";
	нов.Реквизит3 ="С процентами";
	нов.Реквизит4=НулевойСсылка;
	
	// без процентов
	нов =Объект.ТабличнаяЧасть1.Добавить();;
	инд=нов.ПолучитьИдентификатор();
	нов.Реквизит1="2000";
	нов.Реквизит3 ="Без процентов";
	нов.Реквизит4=НулевойСсылка;
КонецПроцедуры

при обработке результата определяем процент и вызываем ссылку из списка значений

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
	ТонкийКлиент = Истина;
	#Если ТолстыйКлиентУправляемоеПриложение Тогда
		ТонкийКлиент = Ложь;
	#КонецЕсли
	
	Состояние("Выполнение запроса...");
	КоличествоЭлементов = ВыполнитьЗапрос(ТонкийКлиент);
	Если КоличествоЭлементов = 0 Тогда
		Возврат;
	КонецЕсли;
	ОчиститьСообщения();

	СПроцентами = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(0);
	
	БезПроцентов = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(1);

	Процент=0;
	Индикатор = ПолучитьИндикаторПроцесса(КоличествоЭлементов);
	Для сч = 0 По КоличествоЭлементов  Цикл
		//ОбработатьРезультатЗапроса(сч, ТонкийКлиент);
		
		ОбработатьИндикатор(Индикатор, сч + 1);
		
		Символов=Цел(Сч / КоличествоЭлементов * 100);
		Если Процент<>Символов Тогда
			Процент=Символов;
			
            //Нов.Реквизит2 =Нов.Реквизит2+"|";
			СПроцентами.Реквизит4 = ЭтотОбъект.ПроцентыНавигационныеСсылки.Получить(Процент);
			СПроцентами.Реквизит2 =Строка(Процент)+"%";//Нов.Реквизит2+"|";

			БезПроцентов.Реквизит4 = ЭтотОбъект.ПроцентыНавигационныеСсылки.Получить(Процент);
	
			Элементы.Таблица1.Обновить();
		КонецЕсли;	
	КонецЦикла;
КонецПроцедуры


надеюсь кому то пригодится, по мне так очень красиво получается если использовать в обработках обмена :) 

на втором рисунке показано как это выглятит если на боевую обработку выгрузки применить, а скриншот самой обработки на первом рисунке. 

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

Наименование Файл Версия Размер Кол. Скачив.
ШаблонОбработки.epf
.epf 32,37Kb
04.02.14
62
.epf 32,37Kb 62 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Виталий Барилко (Diversus) 04.02.14 23:45
Делал подобное, использовал аналогичный подход только для динамического списка и псевдографикой:
Микрографики в динамическом списке 1С 8.2
2. Вера Белевич (integragirl) 05.02.14 07:23
Вы конечно молодец. Но описания не хватает для статьи, опишите код, что куда и откуда.
3. Денис (amyd) 05.02.14 11:23
По просьбе integragirl добавил в описание код.
4. Osiris_ (StaticUnsafe) 05.02.14 12:21
5. DAnry (DAnry) 05.02.14 13:56
Класно. Спасибо за подробное описание. Единственное замечание - обработка подходит для случаев, где важнее "эффект" и красота, а скорость работы на втором плане. В случае сложных, длительных процесов обработка будет тормозить работу.
6. Денис (amyd) 05.02.14 14:10
(5) DAnry,
Почему будет тормозить? все тяжелые расчеты выкидывайте на сервер, красота же только на клиенте отображается.
7. Головаченко Дима (Smaylukk) 06.02.14 01:30
(6) , Имеется ввиду то, что на вывод информации, типа "Сообщение()", "Состояние()" платформой тратится время, хоть и минимальное. В случае перепроведения документов от 500 шт или проставления реквизитов или еще какой-то операции, которая в цикле будет делать очень много итераций, подобная статистика только замедлит операцию. Но и без информации о текущем положении дел сложновато - в данном случае наиболее оптимальным выбором будет вывод информации о процессе порциями.
8. Андрей Акулов (DrAku1a) 06.02.14 09:09
100 полосок "с процентами" + 100 полосок "без процентов" - не слишком ли это всё ресурсоёмко?
9. Dimon (klel) 06.02.14 09:14
Прикольно, большое спасибо за статью, что то возьму на вооружение :)
10. Денис (amyd) 06.02.14 12:06
(7) Smaylukk,
Вы путаете понятие вывода на клиенте и выполнение на сервере.
никто не мешает создать обработкой фоновое задание и крутить там все проводки и перепроводки, а клиент настроить на чтение и отображение состояния , которое возвращает в результате своей деятельности фоновое задание.
Вот здесь есть очень хороший пример http://forum.infostart.ru/forum26/topic86081/
и в результате вопрос производительности вообще не стоит.
11. mikhail burlakov (burlakov) 06.02.14 15:25
весьма полезный материал. до этого встречал только извраты с передачей данных между клиентом и сервером на каждый процент.
12. Алексей Белоусов (AllexSoft) 06.02.14 15:39
Спасибо, отличная идея, плюсанул
13. Dima Dima (bayce) 06.02.14 22:17
Не совсем понятно, что храниться в макете?
14. Алексей Роза (DoctorRoza) 07.02.14 08:08
Плюсую, нужная порою вещь! :)
15. Денис (amyd) 07.02.14 09:57
(13) bayce,
в описании написано ж, в макете хранятся 100 картинок для каждого процента индикатора .
16. Nathan Rothschild (Rothschild) 07.02.14 12:18
Оригинальная идея!
А нельзя вместо вставки картинки
изменять цвет фона поля ввода в колонке табличного поля???
17. Nathan Rothschild (Rothschild) 07.02.14 12:21
(16)
правда в целом внешний вид такого индикатора оставляет желать лутшего.
все-таки целое табличное поле с "заголовками" и "подвалами"
;))))
18. Nathan Rothschild (Rothschild) 07.02.14 12:25
(0)
предлагаю простенькую альтернативу для прогресс-бара.
я таким вариантом пользовался еще под 1С-7.7:

выводим в поле надписи строку "ggggggggggggg"
число буков "g" наращиваем в коде с ростом счетчика выполнения процесса.

ну и выбираем какой-нибудь шрифт для надписи,
чтобы это "g" отображалось "темным квадратиком".

остается подобрать для красоты цвет текста и размер шрифта.
alevnev; BurSer; +2 Ответить 1
19. Денис (amyd) 07.02.14 12:49
(18) Rothschild,
обратите внимание на самое первое сообщение. там так и сделано,
20. Илларион Пак (pakill) 08.02.14 04:23
Даже не беру во внимание чрезмерность предложенной визуализации.
Хочу обратить внимание на другую принципиальную особенность.

Зададимся вопросом: для чего нужен индикатор прогресса?
Наверно для какой-то длительной обработки данных.

Чем может быть обусловлена длительность обработки?
Вероятно, большим объемом данных и/или алгоритмической трудоемкостью расчетов.

Индикация ради индикации никому не нужна.
Боюсь, здесь именно такой случай.

У Вас в коде нет собственно обработки данных.
Это нормально, к этому претензий нет.
Подразумевается, что какждый читатель добавит ее по своему усмотрению.
Но как?

У Вас цикл обработки делается на клиенте.
Что это значит?

Одно из двух:

1) Весь огромный массив данных качается на клиента, затем на клиенте делается
вся обработка данных, и еще, возможно, полученный результат возвращается на сервер.

2) На клиенте в цикле делается безумное количество обращений к серверу. Но это еще не
все. Нужно приспособить обработку на сервере, чтобы она выдавала результаты порциями.


Не будем далеко ходить. Вот простой пример:


Процедура ДлительнаяОбработка()
Запрос = Новый Запрос("Выбрать .... из ОченьОбъемныйРегистр");
Выборка =Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
....
КонецЦикла;
КонецПроцедуры;



Как прикрутить эту процедуру к Вашему коду?
Напомню, читателям, запросы на клиенте не работают.

Вообще-то, индикатор прогресса реализовать возможно.
Но это дело хлопотное и неблагодарное.

Тут нужно запускать фоновое задание (это только в клиент-серверном варианте)
или вторую копию приложения, в котором будет выполняться обработка данных.
А на клиенте мониторить промежуточные результаты, скажем, раз в 10 секунд.
При этом придется учитывать, всякие коллизии: не убилось ли фоновое задание,
не достигнув результата, или, наоборот, не висит ли фоновое задание, запущенное в
предыдущей сессии. Придется, также продумать, логику поведения, если пользователю надоест
ждать, и он займется другими задачами.


И все это, только ради индикации.

Confucius; Sam13; Naill99; BurSer; ll13; rayastar; aexeel; Восьмой; director04; nixel; Kostt; Yury1001; Rothschild; +13 Ответить 3
21. Nathan Rothschild (Rothschild) 08.02.14 07:32
(20) pakill,
описанная тобой проблемма -
- это отсутствие доступных для разработчика штатных средств обратной связи между сервером и клиентом.
Для управляемого приложение - она становится сущей головной болью:
Довольствуйся дебильными возможностмя функции Состояние() и будь доволен!!!
22. Nathan Rothschild (Rothschild) 08.02.14 07:32
(21)
Возможно это общая проблемма клиент-серверной концепции.
но скорее всего - пренебрежение со стороны разработчиков платформы.
Поскольку для организации такой обратной связи нужна серьезная поддержка многопоточности,
с которой у 1С традиционно туго (начиная еще с 1С-7.7).
23. Денис (amyd) 10.02.14 15:27
(20) pakill,
если вы пытаетесь в этой обработки найти решение своей задачи, то вы её не найдете
это всего лишь пример создания индикатора в управляемых формах на стороне клиента с кучей дополнительных механизмов.
в ответе 10 есть то что вам нужно. и если соедините две обработки то будет вам счастье!

К примеру я соединил отображение на клиенте и работу на сервере, и уверяю вас, в этом нет ничего сложного, достаточно включить голову и ознакомится с примерами.
24. Дмитрий Семенов (Sam13) 03.03.14 10:17
(20) pakill, Абсолютно согласен.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа