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

23.08.21

Разработка - Механизмы платформы 1С

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

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

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

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

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

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

ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", рВесьБар);

 

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

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

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

&НаСервереБезКонтекста
Процедура ДинСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	// вызывается каждый раз при переустановке параметра СКД дин.списка
	знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СостояниеДел"));	
	Если знч = Неопределено Тогда Возврат КонецЕсли;
	рСостояниеДел = знч.Значение;

	знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВесьБар"));	
	Если знч = Неопределено Тогда Возврат КонецЕсли;
	рВесьБар = знч.Значение;

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

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

 

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

 

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

Динамический список условное оформление прогресс-бар ход процесса прогресс показ выполнения

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7409    bayselonarrend    19    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5937    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    17618    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11208    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23746    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18809    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14722    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 97 23.08.21 15:05 Сейчас в теме
Хорошо бы гифку прикрепить как оно выглядит в итоге:) Задача очень специфичная, но после просмотра визуализации авось кому-то приглядится.
Xershi; BigB; +2 Ответить
2. Yashazz 4790 23.08.21 15:07 Сейчас в теме
(1) Я в терминале работаю и права там так себе, гифку лепить проблематичненько ((
Задача конечно да, не шибко ходовая, мягко скажем.
3. BigB 193 24.08.21 21:14 Сейчас в теме
А не проще вместо этого кода:
рСимволБара = "|"; // при желании - вся таблица псевдографики к нашим услугам
рВесьБар = "";
Для й = 1 По 100 Цикл
	рВесьБар = рВесьБар + рСимволБара;
КонецЦикла;

ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", рВесьБар);

сделать так:
ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||")

И по размеру меньше и быстрее выполняется.
4. Yashazz 4790 24.08.21 21:15 Сейчас в теме
(3) Неа, не проще, если мы хотим дать возможность управлять видом бара, т.е. символом. Ну и мне лень было 100 палочек отсчитывать)) Выигрыш по скорости мизерный, а управляемость выше.
5. starik-2005 3087 25.08.21 15:54 Сейчас в теме
(4)
Ну и мне лень было 100 палочек отсчитывать
100 отсчитывать нет необходимости - их тупо должно быть больше или равно соточке.
6. starik-2005 3087 25.08.21 15:55 Сейчас в теме
(3)
сделать так:
Вариантов - море. Можно так:
рСимволБара = "|"; // при желании - вся таблица псевдографики к нашим услугам
рВесьБар = Новый Мвссив();
Для й = 1 По ХХХ Цикл
    рВесьБар.Добавить(рСимволБара)
КонецЦикла;

ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", СтрСоединить(рВесьБар));
7. kser87 2470 25.08.21 18:51 Сейчас в теме
Это походу какая-то глава книги "как одинэснику убить время, если не рабочем месте нечем заняться, чтобы внешне выглядело норм".

Я, вероятно, невнимательно прочитал, но не уловил одно: как в итоге поставить значение бара а строке без обращения к серверу?
8. Yashazz 4790 25.08.21 20:16 Сейчас в теме
(7) Угадали)) Я ждал длительный перенос между УПП и БП, делать было совершенно нечего, но недолго.

Без обращения к серверу в предложенных вариантах не получится. Интересный вопрос, буду думать, надумаю - отпишусь.
9. kser87 2470 25.08.21 21:32 Сейчас в теме
(8) интересно стало, что найдете
пока что с обращением к серверу это получится не элегантное решение, а корова на льду 😏
11. Yashazz 4790 26.08.21 15:55 Сейчас в теме
(9) Увы, да. Тут элегантность обсуждается разве только с точки зрения дизайна, глазами юзера. Визуальность бантика, а не решения в целом.
10. user1246707 25.08.21 21:59 Сейчас в теме
Прочитал статью, натолкнуло на мысль. Программно создаём текст вложенного запроса, где объединением 100 раз добавляется пара Процент и СтроковыеПалки. Например, 2 и «||», 5 и «|||||». Имеем таблицу в запросе где на каждый процент есть строка с представлением. В динамическом списке нужное поле процента округляем до целых. Соединяем с вложенным запросом. При прямых руках все делается программно с текстом запроса динамического списка.
Yashazz; Pavel_Vladivostok; +2 Ответить
12. Yashazz 4790 26.08.21 15:57 Сейчас в теме
13. progres5 28.01.22 17:27 Сейчас в теме
Не понял, как настроить динамический список, чтоб работал 1-й способ?
Оставьте свое сообщение