Идея далеко не нова. Идея - махровый аккордеон. А вот описаний реализации я как-то особо не встретил...
Условимся, что значение числовой переменной, отображающей прогресс, изменяется целочисленно в пределах от 1 до 100, и что все вопросы нормирования, пропорций итд. уже ранее решены.
Все нижеописанные варианты базируются на одном способе: в колонке дин.списка выводится текст, состоящий из нужного количества символов, от 1 до 100. Они зрительно имитируют прогресс-бар. В качестве символа можно выбрать "|", или "/", или, при желании, какой-нибудь красивый псевдографический символ (предварительно покурив Юникод). Я предпочитаю просто "|" и полужирный шрифт обычного стиля 1С.
Единожды создаём основу показа:
рСимволБара = "|"; // при желании - вся таблица псевдографики к нашим услугам
рВесьБар = "";
Для й = 1 По 100 Цикл
рВесьБар = рВесьБар + рСимволБара;
КонецЦикла;
ДинСписок.Параметры.УстановитьЗначениеПараметра("ВесьБар", рВесьБар);
Первый способ, самый примитивный, хорош, если изменять запрос дин.списка нельзя вообще, и заключается в принудительной установке текста УО в событии "ПриПолученииДанныхНаСервере". В эту процедуру передаётся, например, структура, где ключи определяют нужные значения прогресса:
// в какой-то момент, после получения оповещения, или в обработке ожидания, или по принудительному обновлению
СостояниеДел = Новый Соответствие;
СостояниеДел.Вставить(Документ1, 17); // по этому документу обработано 17%
СостояниеДел.Вставить(Документ2, 63); // по этому документу обработано 63%
// итд.
ДинСписок.Параметры.УстановитьЗначениеПараметра("СостояниеДел", СостояниеДел);
В процедуре по ключам получаем значения прогрессов и ставим:
&НаСервереБезКонтекста
Процедура ДинСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
// вызывается каждый раз при переустановке параметра СКД дин.списка
знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СостояниеДел"));
Если знч = Неопределено Тогда Возврат КонецЕсли;
рСостояниеДел = знч.Значение;
знч = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВесьБар"));
Если знч = Неопределено Тогда Возврат КонецЕсли;
рВесьБар = знч.Значение;
Для каждого рСтрока Из Строки Цикл
рПрогресс = рСостояниеДел.Получить(рСтрока.Ключ);
Если рПрогресс = Неопределено Тогда Продолжить КонецЕсли;
рПоказ = СокрЛП(рПрогресс) + "%";
Если рПрогресс <= 100 Тогда // например, так - число показываем всегда, а ход процесса, лишь пока он идёт
рПоказ = рПоказ+" "+Лев(рВесьБар, рПрогресс);
КонецЕсли;
рСтрока.Значение.Оформление["КолонкаВКоторуюВыводимПрогресс"].УстановитьЗначениеПараметра("Текст", рПоказ);
КонецЦикла;
КонецПроцедуры
Второй способ заключается в переброске (или получении) значения прогресса через запрос дин.списка. Например, такое поле:
ВЫРАЗИТЬ(&Прогрессор КАК Число(3,0)) КАК Прогрессор
И в форме, в соответствующих местах, передаётся текущее значение прогресса сообразно ситуации. Тогда в ПриПолученииДанныхНаСервере вместо взятия из ключей "рПрогресс = СостояниеДел.Получить(рСтрока.Ключ);" просто "рПрогресс=рСтрока.Значение.Данные["Прогрессор"];".
Третий способ также требует правки текста запроса, но позволяет обойтись вообще без дополнительных действий. Безо всяких событий и получения данных. Это просто вырезка подстроки:
ПОДСТРОКА(&ВесьБар, 1, &Прогрессор) КАК Прогрессор
Поскольку функция получения подстроки не допускает конкатенацию, то отображение процента числом потребуется смоделировать отдельной группой с группировкой "в ячейке" и двумя полями в ней, процентом и прогресс-баром; или ещё как-нибудь.
Недостатком второго и третьего способа является более высокая сложность самого запроса дин.списка ради показа большого количества различных прогрессов одновременно; эти способы хороши, когда определённых условиями (например, через "ВЫБОР КОГДА") таких прогрессов немного.
Также, для адекватности восприятия, оформляемая колонка дин.списка должна иметь достаточную, желательно фиксированную, ширину. И, конечно, к нашим услугам различные цвета текста для разных строк "прогресс-баров".
Конечно, можно сделать и другую визуализацию:
* В зависимости от значения прогресса, используя RGB-коды, менять фон ячейки, например, от красного к зелёному;
* Эмулировать бегунок, например, строкой вида "||=======\V/==||" и изображать его "сдвиг" от начала к концу;
* Отрисовать энное количество картинок, хотя бы с шагом 10%, и последовательно подкидывать их через навигационную ссылку в дин.список, или совершить подвиг, сделать коллекцию картинок 16х16 и определять параметром дин.списка индекс в ней. Это уже будет весьма красиво, но это трудозатратно. Впрочем, нет ничего невозможного)
Кто видел другие красивые решения этой задачи - киньте ссылкой, пожалуйста.