Изначально искал, как сделать индикатор процесса в управляемых формах. Почти все ссылки с интернета идут на этот сайт, в результате понял что индикатор делается через функцию Сообщить().
Но тут задумался, а чего бы не сделать чтоб в таблице на форме в одной колонке можно было вывести индикатор для каждой строки?
оказалось не так и сложно, больше времени ушло на прорисовку графического индикатора для каждого процента (итого 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.Обновить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
надеюсь кому то пригодится, по мне так очень красиво получается если использовать в обработках обмена 🙂
на втором рисунке показано как это выглятит если на боевую обработку выгрузки применить, а скриншот самой обработки на первом рисунке.
Делал подобное, использовал аналогичный подход только для динамического списка и псевдографикой:
Микрографики в динамическом списке 1С 8.2
Вы конечно молодец. Но описания не хватает для статьи, опишите код, что куда и откуда.
По просьбе integragirl добавил в описание код.
Очень классно. Спасибо
Класно. Спасибо за подробное описание. Единственное замечание — обработка подходит для случаев, где важнее «эффект» и красота, а скорость работы на втором плане. В случае сложных, длительных процесов обработка будет тормозить работу.
(5) DAnry,
Почему будет тормозить? все тяжелые расчеты выкидывайте на сервер, красота же только на клиенте отображается.
(6) , Имеется ввиду то, что на вывод информации, типа «Сообщение()», «Состояние()» платформой тратится время, хоть и минимальное. В случае перепроведения документов от 500 шт или проставления реквизитов или еще какой-то операции, которая в цикле будет делать очень много итераций, подобная статистика только замедлит операцию. Но и без информации о текущем положении дел сложновато — в данном случае наиболее оптимальным выбором будет вывод информации о процессе порциями.
100 полосок «с процентами» + 100 полосок «без процентов» — не слишком ли это всё ресурсоёмко?
Прикольно, большое спасибо за статью, что то возьму на вооружение 🙂
(7) Smaylukk,
http://forum.infostart.ru/forum26/topic86081/
Вы путаете понятие вывода на клиенте и выполнение на сервере.
никто не мешает создать обработкой фоновое задание и крутить там все проводки и перепроводки, а клиент настроить на чтение и отображение состояния , которое возвращает в результате своей деятельности фоновое задание.
Вот здесь есть очень хороший пример
и в результате вопрос производительности вообще не стоит.
весьма полезный материал. до этого встречал только извраты с передачей данных между клиентом и сервером на каждый процент.
Спасибо, отличная идея, плюсанул
Не совсем понятно, что храниться в макете?
Плюсую, нужная порою вещь! 🙂
(13) bayce,
в описании написано ж, в макете хранятся 100 картинок для каждого процента индикатора .
Оригинальная идея!
А нельзя вместо вставки картинки
изменять цвет фона поля ввода в колонке табличного поля???
(16)
правда в целом внешний вид такого индикатора оставляет желать лутшего.
все-таки целое табличное поле с «заголовками» и «подвалами»
;))))
(0)
предлагаю простенькую альтернативу для прогресс-бара.
я таким вариантом пользовался еще под 1С-7.7:
выводим в поле надписи строку «ggggggggggggg»
число буков «g» наращиваем в коде с ростом счетчика выполнения процесса.
ну и выбираем какой-нибудь шрифт для надписи,
чтобы это «g» отображалось «темным квадратиком».
остается подобрать для красоты цвет текста и размер шрифта.
(18) Rothschild,
обратите внимание на самое первое сообщение. там так и сделано,
Даже не беру во внимание чрезмерность предложенной визуализации.
Хочу обратить внимание на другую принципиальную особенность.
Зададимся вопросом: для чего нужен индикатор прогресса?
Наверно для какой-то длительной обработки данных.
Чем может быть обусловлена длительность обработки?
Вероятно, большим объемом данных и/или алгоритмической трудоемкостью расчетов.
Индикация ради индикации никому не нужна.
Боюсь, здесь именно такой случай.
У Вас в коде нет собственно обработки данных.
Это нормально, к этому претензий нет.
Подразумевается, что какждый читатель добавит ее по своему усмотрению.
Но как?
У Вас цикл обработки делается на клиенте.
Что это значит?
Одно из двух:
1) Весь огромный массив данных качается на клиента, затем на клиенте делается
вся обработка данных, и еще, возможно, полученный результат возвращается на сервер.
2) На клиенте в цикле делается безумное количество обращений к серверу. Но это еще не
все. Нужно приспособить обработку на сервере, чтобы она выдавала результаты порциями.
Не будем далеко ходить. Вот простой пример:
Процедура ДлительнаяОбработка()
Запрос = Новый Запрос(«Выбрать …. из ОченьОбъемныйРегистр»);
Выборка =Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
….
КонецЦикла;
КонецПроцедуры;
Как прикрутить эту процедуру к Вашему коду?
Напомню, читателям, запросы на клиенте не работают.
Вообще-то, индикатор прогресса реализовать возможно.
Но это дело хлопотное и неблагодарное.
Тут нужно запускать фоновое задание (это только в клиент-серверном варианте)
или вторую копию приложения, в котором будет выполняться обработка данных.
А на клиенте мониторить промежуточные результаты, скажем, раз в 10 секунд.
При этом придется учитывать, всякие коллизии: не убилось ли фоновое задание,
не достигнув результата, или, наоборот, не висит ли фоновое задание, запущенное в
предыдущей сессии. Придется, также продумать, логику поведения, если пользователю надоест
ждать, и он займется другими задачами.
И все это, только ради индикации.
(20) pakill,
описанная тобой проблемма —
— это отсутствие доступных для разработчика штатных средств обратной связи между сервером и клиентом.
Для управляемого приложение — она становится сущей головной болью:
Довольствуйся дебильными возможностмя функции Состояние() и будь доволен!!!
(21)
Возможно это общая проблемма клиент-серверной концепции.
но скорее всего — пренебрежение со стороны разработчиков платформы.
Поскольку для организации такой обратной связи нужна серьезная поддержка многопоточности,
с которой у 1С традиционно туго (начиная еще с 1С-7.7).
(20) pakill,
если вы пытаетесь в этой обработки найти решение своей задачи, то вы её не найдете
это всего лишь пример создания индикатора в управляемых формах на стороне клиента с кучей дополнительных механизмов.
в ответе 10 есть то что вам нужно. и если соедините две обработки то будет вам счастье!
К примеру я соединил отображение на клиенте и работу на сервере, и уверяю вас, в этом нет ничего сложного, достаточно включить голову и ознакомится с примерами.
(20) pakill, Абсолютно согласен.