Разберем задачу вывода графических данных в динамический список управляемых форм. Часто возникает потребность отобразить в списке дополнительный визуальный индикатор, который хранится в базе данных в виде реквизита типа ХранилищеЗначения. Напрямую получить картинку запросом для динамического списка не представляется возможным, поэтому нам нужно воспользоваться механизмом оформления ячеек.
Для решения поставленной задачи воспользуемся событием ПриПолученииДанных, которое доступно для таблиц динамического списка. В этом обработчике мы имеем возможность управлять оформлением каждой выводимой строки.
Рассмотрим алгоритм действий:
ПриПолученииДанных, где будем извлекать картинку из реквизита справочника и передавать ее в оформление строки.Давайте посмотрим на пример программного кода, который позволяет окрасить фон или назначить картинку ячейке:
&НаСервереБезКонтекста
Процедура ПациентыПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого СтрокаСписка Из Строки Цикл
// Получаем ссылку на объект и нужный нам реквизит
ДанныеПациента = СтрокаСписка.Значение.Данные;
ГруппаЗдоровья = ДанныеПациента.ГруппаЗдоровья;
Если ЗначениеЗаполнено(ГруппаЗдоровья) Тогда
ЦветФона = ГруппаЗдоровья.ЦветоваяГруппа.Получить();
Если ЦветФона <> Неопределено Тогда
// Устанавливаем параметры оформления для колонки
СтрокаСписка.Значение.Оформление["КартинкаГруппыЗдоровья"].УстановитьЗначениеПараметра("ЦветФона", ЦветФона);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важно помнить, что событие ПриПолученииДанных вызывается при каждой прокрутке списка. Постоянное обращение к ХранилищеЗначения для получения картинки может существенно замедлить работу интерфейса. Чтобы этого избежать, мы рекомендуем использовать кэширование значений в памяти формы.
Создайте переменную на уровне модуля формы, например, КэшКартинок, и при первом обращении сохраняйте туда полученные данные:
&НаКлиенте
Перем КэшКартинок;
// Инициализируем при создании формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КэшКартинок = Новый Соответствие;
КонецПроцедуры
Теперь внутри цикла проверки в ПриПолученииДанных сначала проверяйте наличие значения в КэшКартинок, и только при его отсутствии выполняйте чтение из базы. Это позволит сделать работу списка плавной и быстрой даже при большом количестве записей.
Если набор картинок не является произвольным, а ограничен определенным списком (например, статусы «Готов», «В работе», «Закрыт»), лучше отойти от использования ХранилищеЗначения. Рассмотрите использование Библиотеки картинок конфигурации.
В этом случае:
БиблиотекаКартинок.ИмяКартинки.Подводя итог, можно сказать, что ключ к успеху — это разделение логики получения данных и логики оформления. Динамический список должен оставаться легким, а визуальные эффекты и сложная графика должны накладываться уже на этапе формирования представления строки перед выводом на экран.