Как вывести картинку из справочника в динамический список 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

Разберем задачу вывода графических данных в динамический список управляемых форм. Часто возникает потребность отобразить в списке дополнительный визуальный индикатор, который хранится в базе данных в виде реквизита типа ХранилищеЗначения. Напрямую получить картинку запросом для динамического списка не представляется возможным, поэтому нам нужно воспользоваться механизмом оформления ячеек.

Реализация через событие ПриПолученииДанных

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

Рассмотрим алгоритм действий:

  1. В запросе динамического списка создадим пустое поле-заглушку, которое будет служить колонкой для нашей картинки.
  2. В настройках формы добавим колонку в таблицу, установив для нее вид элемента «Поле картинки».
  3. В модуле формы опишем процедуру ПриПолученииДанных, где будем извлекать картинку из реквизита справочника и передавать ее в оформление строки.

Давайте посмотрим на пример программного кода, который позволяет окрасить фон или назначить картинку ячейке:


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

Оптимизация производительности: кэширование данных

Важно помнить, что событие ПриПолученииДанных вызывается при каждой прокрутке списка. Постоянное обращение к ХранилищеЗначения для получения картинки может существенно замедлить работу интерфейса. Чтобы этого избежать, мы рекомендуем использовать кэширование значений в памяти формы.

Создайте переменную на уровне модуля формы, например, КэшКартинок, и при первом обращении сохраняйте туда полученные данные:


&НаКлиенте
Перем КэшКартинок;

// Инициализируем при создании формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    КэшКартинок = Новый Соответствие;
КонецПроцедуры

Теперь внутри цикла проверки в ПриПолученииДанных сначала проверяйте наличие значения в КэшКартинок, и только при его отсутствии выполняйте чтение из базы. Это позволит сделать работу списка плавной и быстрой даже при большом количестве записей.

Альтернативные способы вывода

Если набор картинок не является произвольным, а ограничен определенным списком (например, статусы «Готов», «В работе», «Закрыт»), лучше отойти от использования ХранилищеЗначения. Рассмотрите использование Библиотеки картинок конфигурации.

В этом случае:

Подводя итог, можно сказать, что ключ к успеху — это разделение логики получения данных и логики оформления. Динамический список должен оставаться легким, а визуальные эффекты и сложная графика должны накладываться уже на этапе формирования представления строки перед выводом на экран.

← На главную