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


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

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