Каталог решений - Прогресс-бар в поле динамического списка

Прогресс-бар в поле динамического списка

Прогресс-бар в поле динамического списка

В наличии

Изображаем прогресс-бары в колонке динамического списка

Категория:

Описание

Идея далеко не нова. Идея — махровый аккордеон. А вот описаний реализации я как-то особо не встретил…

Условимся, что значение числовой переменной, отображающей прогресс, изменяется целочисленно в пределах от 1 до 100, и что все вопросы нормирования, пропорций итд. уже ранее решены.

Все нижеописанные варианты базируются на одном способе: в колонке дин.списка выводится текст, состоящий из нужного количества символов, от 1 до 100. Они зрительно имитируют прогресс-бар. В качестве символа можно выбрать "|", или "/", или, при желании, какой-нибудь красивый псевдографический символ (предварительно покурив Юникод). Я предпочитаю просто "|" и полужирный шрифт обычного стиля 1С.

Единожды создаём основу показа:

  рСимволБара = "|"; // при желании - вся таблица псевдографики к нашим услугам
  рВесьБар = "";
  Для й = 1 По 100 Цикл
  	рВесьБар = рВесьБар + рСимволБара;
  КонецЦикла;
  
  ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", рВесьБар);

 

Первый способ, самый примитивный, хорош, если изменять запрос дин.списка нельзя вообще, и заключается в принудительной установке текста УО в событии "ПриПолученииДанныхНаСервере". В эту процедуру передаётся, например, структура, где ключи определяют нужные значения прогресса:

  // в  какой-то момент, после получения оповещения, или в обработке ожидания, или по принудительному обновлению
  СостояниеДел = Новый Соответствие;
  СостояниеДел.Вставить(Документ1, 17); // по этому документу обработано 17%
  СостояниеДел.Вставить(Документ2, 63); // по этому документу обработано 63%
  // итд.
  ДинСписок.Параметры.УстановитьЗначениеПараметра("СостояниеДел", СостояниеДел);

В процедуре по ключам получаем значения прогрессов и ставим:

  &НаСервереБезКонтекста
  Процедура ДинСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
  	// вызывается каждый раз при переустановке параметра СКД дин.списка
  	знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СостояниеДел"));	
  	Если знч = Неопределено Тогда Возврат КонецЕсли;
  	рСостояниеДел = знч.Значение;
  
  	знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВесьБар"));	
  	Если знч = Неопределено Тогда Возврат КонецЕсли;
  	рВесьБар = знч.Значение;
  
  	Для каждого рСтрока Из Строки Цикл
  		рПрогресс = рСостояниеДел.Получить(рСтрока.Ключ);
  		Если рПрогресс = Неопределено Тогда Продолжить КонецЕсли;
  		рПоказ = СокрЛП(рПрогресс) + "%";
  		Если рПрогресс <= 100 Тогда // например, так - число показываем всегда, а ход процесса, лишь пока он идёт
  			рПоказ = рПоказ+" "+Лев(рВесьБар, рПрогресс);
  		КонецЕсли;			
  		рСтрока.Значение.Оформление["КолонкаВКоторуюВыводимПрогресс"].УстановитьЗначениеПараметра("Текст", рПоказ);
  	КонецЦикла;
  
  КонецПроцедуры	
  

 

Второй способ заключается в переброске (или получении) значения прогресса через запрос дин.списка. Например, такое поле:

  ВЫРАЗИТЬ(&Прогрессор КАК Число(3,0)) КАК Прогрессор

И в форме, в соответствующих местах, передаётся текущее значение прогресса сообразно ситуации. Тогда в ПриПолученииДанныхНаСервере вместо взятия из ключей "рПрогресс = СостояниеДел.Получить(рСтрока.Ключ);" просто "рПрогресс=рСтрока.Значение.Данные["Прогрессор"];".

 

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

  ПОДСТРОКА(&ВесьБар, 1, &Прогрессор) КАК Прогрессор

Поскольку функция получения подстроки не допускает конкатенацию, то отображение процента числом потребуется смоделировать отдельной группой с группировкой "в ячейке" и двумя полями в ней, процентом и прогресс-баром; или ещё как-нибудь.

 

Недостатком второго и третьего способа является более высокая сложность самого запроса дин.списка ради показа большого количества различных прогрессов одновременно; эти способы хороши, когда определённых условиями (например, через "ВЫБОР КОГДА") таких прогрессов немного.

Также, для адекватности восприятия, оформляемая колонка дин.списка должна иметь достаточную, желательно фиксированную, ширину. И, конечно, к нашим услугам различные цвета текста для разных строк "прогресс-баров".

 

Конечно, можно сделать и другую визуализацию:

* В зависимости от значения прогресса, используя RGB-коды, менять фон ячейки, например, от красного к зелёному;

* Эмулировать бегунок, например, строкой вида "||=======\V/==||" и изображать его "сдвиг" от начала к концу;

* Отрисовать энное количество картинок, хотя бы с шагом 10%, и последовательно подкидывать их через навигационную ссылку в дин.список, или совершить подвиг, сделать коллекцию картинок 16х16 и определять параметром дин.списка индекс в ней. Это уже будет весьма красиво, но это трудозатратно. Впрочем, нет ничего невозможного)

 

Кто видел другие красивые решения этой задачи — киньте ссылкой, пожалуйста.

has been added to your cart:
Оформление заказа