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


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

Изначально искал, как сделать индикатор процесса в управляемых формах. Почти все ссылки с интернета идут на этот сайт, в результате понял что индикатор делается через функцию Сообщить().
Но тут задумался, а чего бы не сделать чтоб в таблице на форме в одной колонке можно было вывести индикатор для каждой строки?
оказалось не так и сложно, больше времени ушло на прорисовку графического индикатора для каждого процента (итого 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.Обновить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры

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

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

24 Comments

  1. Diversus

    Делал подобное, использовал аналогичный подход только для динамического списка и псевдографикой:

    Микрографики в динамическом списке 1С 8.2

    Reply
  2. integragirl

    Вы конечно молодец. Но описания не хватает для статьи, опишите код, что куда и откуда.

    Reply
  3. amyd

    По просьбе integragirl добавил в описание код.

    Reply
  4. StaticUnsafe

    Очень классно. Спасибо

    Reply
  5. DAnry

    Класно. Спасибо за подробное описание. Единственное замечание — обработка подходит для случаев, где важнее «эффект» и красота, а скорость работы на втором плане. В случае сложных, длительных процесов обработка будет тормозить работу.

    Reply
  6. amyd

    (5) DAnry,

    Почему будет тормозить? все тяжелые расчеты выкидывайте на сервер, красота же только на клиенте отображается.

    Reply
  7. Smaylukk

    (6) , Имеется ввиду то, что на вывод информации, типа «Сообщение()», «Состояние()» платформой тратится время, хоть и минимальное. В случае перепроведения документов от 500 шт или проставления реквизитов или еще какой-то операции, которая в цикле будет делать очень много итераций, подобная статистика только замедлит операцию. Но и без информации о текущем положении дел сложновато — в данном случае наиболее оптимальным выбором будет вывод информации о процессе порциями.

    Reply
  8. DrAku1a

    100 полосок «с процентами» + 100 полосок «без процентов» — не слишком ли это всё ресурсоёмко?

    Reply
  9. klel

    Прикольно, большое спасибо за статью, что то возьму на вооружение 🙂

    Reply
  10. amyd

    (7) Smaylukk,

    Вы путаете понятие вывода на клиенте и выполнение на сервере.

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

    Вот здесь есть очень хороший пример http://forum.infostart.ru/forum26/topic86081/

    и в результате вопрос производительности вообще не стоит.

    Reply
  11. burlakov

    весьма полезный материал. до этого встречал только извраты с передачей данных между клиентом и сервером на каждый процент.

    Reply
  12. AllexSoft

    Спасибо, отличная идея, плюсанул

    Reply
  13. bayce

    Не совсем понятно, что храниться в макете?

    Reply
  14. DoctorRoza

    Плюсую, нужная порою вещь! 🙂

    Reply
  15. amyd

    (13) bayce,

    в описании написано ж, в макете хранятся 100 картинок для каждого процента индикатора .

    Reply
  16. Rothschild

    Оригинальная идея!

    А нельзя вместо вставки картинки

    изменять цвет фона поля ввода в колонке табличного поля???

    Reply
  17. Rothschild

    (16)

    правда в целом внешний вид такого индикатора оставляет желать лутшего.

    все-таки целое табличное поле с «заголовками» и «подвалами»

    ;))))

    Reply
  18. Rothschild

    (0)

    предлагаю простенькую альтернативу для прогресс-бара.

    я таким вариантом пользовался еще под 1С-7.7:

    выводим в поле надписи строку «ggggggggggggg»

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

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

    чтобы это «g» отображалось «темным квадратиком».

    остается подобрать для красоты цвет текста и размер шрифта.

    Reply
  19. amyd

    (18) Rothschild,

    обратите внимание на самое первое сообщение. там так и сделано,

    Reply
  20. pakill

    Даже не беру во внимание чрезмерность предложенной визуализации.

    Хочу обратить внимание на другую принципиальную особенность.

    Зададимся вопросом: для чего нужен индикатор прогресса?

    Наверно для какой-то длительной обработки данных.

    Чем может быть обусловлена длительность обработки?

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

    Индикация ради индикации никому не нужна.

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

    У Вас в коде нет собственно обработки данных.

    Это нормально, к этому претензий нет.

    Подразумевается, что какждый читатель добавит ее по своему усмотрению.

    Но как?

    У Вас цикл обработки делается на клиенте.

    Что это значит?

    Одно из двух:

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

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

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

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

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

    Процедура ДлительнаяОбработка()

    Запрос = Новый Запрос(«Выбрать …. из ОченьОбъемныйРегистр»);

    Выборка =Запрос.Выполнить.Выбрать();

    Пока Выборка.Следующий() Цикл

    ….

    КонецЦикла;

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

    Как прикрутить эту процедуру к Вашему коду?

    Напомню, читателям, запросы на клиенте не работают.

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

    Но это дело хлопотное и неблагодарное.

    Тут нужно запускать фоновое задание (это только в клиент-серверном варианте)

    или вторую копию приложения, в котором будет выполняться обработка данных.

    А на клиенте мониторить промежуточные результаты, скажем, раз в 10 секунд.

    При этом придется учитывать, всякие коллизии: не убилось ли фоновое задание,

    не достигнув результата, или, наоборот, не висит ли фоновое задание, запущенное в

    предыдущей сессии. Придется, также продумать, логику поведения, если пользователю надоест

    ждать, и он займется другими задачами.

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

    Reply
  21. Rothschild

    (20) pakill,

    описанная тобой проблемма —

    — это отсутствие доступных для разработчика штатных средств обратной связи между сервером и клиентом.

    Для управляемого приложение — она становится сущей головной болью:

    Довольствуйся дебильными возможностмя функции Состояние() и будь доволен!!!

    Reply
  22. Rothschild

    (21)

    Возможно это общая проблемма клиент-серверной концепции.

    но скорее всего — пренебрежение со стороны разработчиков платформы.

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

    с которой у 1С традиционно туго (начиная еще с 1С-7.7).

    Reply
  23. amyd

    (20) pakill,

    если вы пытаетесь в этой обработки найти решение своей задачи, то вы её не найдете

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

    в ответе 10 есть то что вам нужно. и если соедините две обработки то будет вам счастье!

    К примеру я соединил отображение на клиенте и работу на сервере, и уверяю вас, в этом нет ничего сложного, достаточно включить голову и ознакомится с примерами.

    Reply
  24. Sam13

    (20) pakill, Абсолютно согласен.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *