Как вывести изображение в табличную часть на форме в 1С?

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

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

Решение для Управляемых форм (платформа 1С 8.2 / 8.3)

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

Рассмотрим пошаговый алгоритм настройки формы для отображения крупных картинок:

  1. Создание реквизита таблицы: В реквизитах табличной части или таблицы значений на форме создаем колонку с типом данных Строка. В этой колонке мы будем хранить не двоичные данные картинки, а временный адрес файла в оперативной памяти сервера (путь к временному хранилищу). Назовем этот реквизит, например, АдресКартинки.
  2. Добавление элемента на форму: Перетаскиваем созданный реквизит АдресКартинки в элементы таблицы формы.
  3. Настройка вида элемента: Выделяем созданный элемент формы (колонку) и в панели свойств устанавливаем свойство Вид в значение Поле картинки.
  4. Настройка высоты строк таблицы: Это самый важный шаг. Выделяем сам элемент формы типа Таблица (родительский элемент для колонок). В его свойствах находим параметр ВысотаСтроки. По умолчанию там установлен 0 (автоматическая высота). Нам необходимо принудительно задать фиксированную высоту строки, например, 3, 4 или 5 (значение задается в количестве строк текста). Это позволит ячейкам таблицы физически растягиваться по высоте.
  5. Настройка масштабирования картинки: Снова возвращаемся к свойствам колонки АдресКартинки (которая имеет вид «Поле картинки»). Находим свойство РазмерКартинки и устанавливаем для него значение Пропорционально. Это гарантирует, что изображение займет всю доступную высоту ячейки, сохранив свои исходные пропорции без искажений.

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


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

Решение для Обычных форм (платформа 1С 8.0 / 8.1 / 8.2)

В обычных формах элемент управления ТабличноеПоле спроектирован иначе. Напрямую масштабировать произвольные изображения внутри ячеек табличного поля стандартными свойствами платформы невозможно — ячейки с типом картинки жестко оптимизированы под размер иконок (примерно 16х16 или 24х24 пикселей).

Тем не менее, разберем два основных сценария работы с графикой в обычных формах:

Вариант А. Вывод небольших статусных иконок

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

Проанализируем пример кода для обработки этого события:


Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Получаем значение статуса из строки данных
    СтатусДокумента = ДанныеСтроки.Ссылка.Статус;
    
    // Включаем отображение картинки в нужной ячейке
    ОформлениеСтроки.Ячейки.СтатусИконка.ОтображатьКартинку = Истина;
    
    Если СтатусДокумента = Перечисления.Статусы.Проведен Тогда
        ОформлениеСтроки.Ячейки.СтатусИконка.Картинка = БиблиотекаКартинок.ВыполненоУспешно;
    Иначе
        ОформлениеСтроки.Ячейки.СтатусИконка.Картинка = БиблиотекаКартинок.Ошибка;
    КонецЕсли;
    
КонецПроцедуры

Вариант Б. Отображение крупных изображений (Best Practice)

Попытки принудительно засунуть крупное фото товара в строку обычного табличного поля делают интерфейс нечитаемым и сильно перегружают оперативную память. Общепринятым стандартом разработки в обычных формах является использование связки «Табличное поле + Отдельное поле картинки на форме».

Разберем этот паттерн по шагам:

  1. Размещаем на форме элемент управления ТабличноеПоле (список товаров).
  2. Рядом с табличным полем (например, в правой части формы) размещаем элемент управления ПолеКартинки и называем его ПолеПросмотраИзображения.
  3. Для табличного поля создаем обработчик события ПриАктивизацииСтроки. В этом событии мы будем динамически считывать картинку текущей строки и выводить ее в наше отдельное поле в крупном размере.

Посмотрим на пример реализации данного метода:


Процедура ТабличноеПоле1ПриАктивизацииСтроки(Элемент)
    
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Номенклатура) Тогда
        
        // Извлекаем картинку номенклатуры (хранилище значений или присоединенный файл)
        КартинкаТовара = ПолучитьКартинкуНоменклатуры(ТекущаяСтрока.Номенклатура);
        
        Если ТипЗнч(КартинкаТовара) = Тип("Картинка") Тогда
            ЭлементыФормы.ПолеПросмотраИзображения.Картинка = КартинкаТовара;
        Иначе
            // Если картинка не задана, очищаем поле
            ЭлементыФормы.ПолеПросмотраИзображения.Картинка = Новый Картинка;
        EndIf;
        
    Иначе
        ЭлементыФормы.ПолеПросмотраИзображения.Картинка = Новый Картинка;
    КонецЕсли;
    
КонецПроцедуры

Современные способы оптимизации и изменения размеров картинок

В старых решениях разработчики часто использовали COM-объект WIA.ImageFile (Windows Image Acquisition) для изменения разрешения изображений на стороне сервера 1С перед их передачей на форму (как показано в Сообщении 2 форума). Однако этот метод имеет критические недостатки: он работает исключительно под операционной системой Windows и может вызывать серьезные утечки памяти при интенсивной работе фоновых процессов.

В современных конфигурациях 1С на платформе 8.3 для оптимизации размеров картинок рекомендуется использовать кроссплатформенные и производительные подходы:

← На главную