Как исправить мелкое отображение картинки в динамическом списке на управляемых формах 1С?

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

При разработке интерфейсов на управляемых формах часто возникает задача наглядного представления информации: вывод статусов заказов с цветными пиктограммами, отображение логотипов или фотографий номенклатуры прямо в строках списка. Однако при стандартном добавлении колонки с типом Поле картинки разработчики сталкиваются с тем, что изображение сжимается до микроскопической иконки 16х16 пикселей, а изменение свойств растягивания не дает никакого эффекта. Разберем причины такого поведения платформы и пошагово настроим корректное отображение изображений.

Выясним причину поведения платформы

Проанализируем, как управляемая форма рассчитывает габариты строк в таблице динамического списка. По умолчанию высота строки таблицы ориентирована на одну строку стандартного текста (около 19 пунктов). Если у колонки свойство Высота установлено в значение 0 (авто) или 1, платформа интерпретирует поле как компактную пиктограмму строки и жестко ограничивает область вывода размером иконки.

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

Пошаговая настройка параметров элемента формы

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

  1. Увеличение высоты поля. Перейдем в свойства элемента формы, отображающего картинку, найдем свойство Высота и установим значение 2 или более. Единица высоты соответствует высоте стандартной строки текста. Как только значение становится больше 1, платформа переключает режим отрисовки ячейки и разрешает отображение крупного изображения.
  2. Установка ширины. Обязательно зададим свойство Ширина (например, 5 или 10 в зависимости от пропорций исходного изображения). Если оставить ширину по умолчанию, ячейка может остаться слишком узкой и изображение будет сплюснуто или обрезано по горизонтали.
  3. Выбор режима масштабирования. После задания физических размеров ячейки настроим свойство РазмерКартинки (в более свежих версиях платформы — ВариантМасштабаКартинки):
    1. Пропорционально — сохраняет исходные пропорции изображения, вписывая его целиком в заданные границы ячейки без искажений.
    2. Вместить — масштабирует изображение так, чтобы полностью заполнить ячейку с сохранением пропорций.
    3. Реальный размер — выводит картинку пиксель в пиксель (если картинка больше размера ячейки, она будет обрезана).

Реализация механизма вывода картинок через навигационные ссылки

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

Разберем пример сохранения навигационной ссылки при записи объекта, в котором хранится изображение. Создадим в объекте реквизит НавигационнаяСсылка со строковым типом:


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

Теперь подключим вывод изображений в динамический список другого документа или журнала, объединив данные с универсальным справочником картинок по значению статуса или категории:


ВЫБРАТЬ
    Заказ.Ссылка КАК Ссылка,
    Заказ.Проведен КАК Проведен,
    Заказ.Номер КАК Номер,
    Заказ.Дата КАК Дата,
    Заказ.СостояниеЗаявки КАК СостояниеЗаявки,
    СпрКартинки.НавигационнаяСсылка КАК Картинка
ИЗ
    Документ.ВнутреннийЗаказ КАК Заказ
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Картинки КАК СпрКартинки
        ПО Заказ.СостояниеЗаявки = СпрКартинки.ИдентификационноеЗначение

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

Рекомендации по оптимизации производительности

При работе с графикой в табличных частях и динамических списках важно учитывать сетевую нагрузку и отзывчивость интерфейса:

  1. Использование миниатюр (превью). Если оригиналы изображений имеют высокое разрешение (например, фотографии товаров 1920х1080), их прямая загрузка в список замедлит прокрутку. Рекомендуется при загрузке файла создавать уменьшенную копию (например, 64х64 или 128х128 пикселей), сохранять ее в отдельный реквизит и формировать навигационную ссылку именно на миниатюру.
  2. Панель предварительного просмотра как альтернатива. Если изображения слишком детализированы, чтобы помещаться в строку списка, целесообразно оставить список компактным с текстовыми данными, а справа от таблицы разместить отдельное Поле картинки. В обработчике события таблицы ПриАктивизацииСтроки достаточно передавать навигационную ссылку текущей строки в это отдельное поле.
← На главную