При разработке различных каталогов товаров, рабочих мест кладовщиков или визуальных отчетов часто возникает необходимость вывести изображения (например, фотографии номенклатуры) непосредственно в ячейки табличной части или таблицы значений на форме. Начинающие разработчики часто сталкиваются с проблемой, когда платформа принудительно сжимает картинку до микроскопического размера (16х16 пикселей), делая изображение нечитаемым. Выясним причины такого поведения платформы и разберем по шагам правильные решения для управляемых и обычных форм.
В управляемом интерфейсе вывод изображений в строки таблицы реализуется достаточно просто и красиво, но требует соблюдения нескольких ключевых настроек свойств элементов формы. Если этого не сделать, платформа автоматически обожмет картинку под стандартную высоту текстовой строки.
Рассмотрим пошаговый алгоритм настройки формы для отображения крупных картинок:
Строка. В этой колонке мы будем хранить не двоичные данные картинки, а временный адрес файла в оперативной памяти сервера (путь к временному хранилищу). Назовем этот реквизит, например, АдресКартинки.АдресКартинки в элементы таблицы формы.Вид в значение Поле картинки.ВысотаСтроки. По умолчанию там установлен 0 (автоматическая высота). Нам необходимо принудительно задать фиксированную высоту строки, например, 3, 4 или 5 (значение задается в количестве строк текста). Это позволит ячейкам таблицы физически растягиваться по высоте.АдресКартинки (которая имеет вид «Поле картинки»). Находим свойство РазмерКартинки и устанавливаем для него значение Пропорционально. Это гарантирует, что изображение займет всю доступную высоту ячейки, сохранив свои исходные пропорции без искажений.После визуальной настройки элементов формы нам необходимо написать программный код для заполнения колонки временными адресами. Посмотрим на пример кода, который считывает изображения товаров и помещает их во временное хранилище для вывода в таблицу:
&НаСервере
Процедура ЗаполнитьКартинкиВТаблице()
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
// Получаем двоичные данные файла картинки из базы данных
ДвоичныеДанныеКартинки = ПолучитьДвоичныеДанныеИзображения(СтрокаТаблицы.Номенклатура);
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Помещаем данные во временное хранилище, привязывая к уникальному идентификатору формы
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
СтрокаТаблицы.АдресКартинки = АдресВХранилище;
Иначе
// Очищаем адрес, если картинки нет
СтрокаТаблицы.АдресКартинки = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В обычных формах элемент управления ТабличноеПоле спроектирован иначе. Напрямую масштабировать произвольные изображения внутри ячеек табличного поля стандартными свойствами платформы невозможно — ячейки с типом картинки жестко оптимизированы под размер иконок (примерно 16х16 или 24х24 пикселей).
Тем не менее, разберем два основных сценария работы с графикой в обычных формах:
Вариант А. Вывод небольших статусных иконок
Если задача заключается в выводе небольших пиктограмм (например, зеленый флажок, красный крестик, статус оплаты), мы можем использовать предопределенную коллекцию картинок и обрабатывать вывод в событии таблицы ПриВыводеСтроки.
Проанализируем пример кода для обработки этого события:
Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Получаем значение статуса из строки данных
СтатусДокумента = ДанныеСтроки.Ссылка.Статус;
// Включаем отображение картинки в нужной ячейке
ОформлениеСтроки.Ячейки.СтатусИконка.ОтображатьКартинку = Истина;
Если СтатусДокумента = Перечисления.Статусы.Проведен Тогда
ОформлениеСтроки.Ячейки.СтатусИконка.Картинка = БиблиотекаКартинок.ВыполненоУспешно;
Иначе
ОформлениеСтроки.Ячейки.СтатусИконка.Картинка = БиблиотекаКартинок.Ошибка;
КонецЕсли;
КонецПроцедуры
Вариант Б. Отображение крупных изображений (Best Practice)
Попытки принудительно засунуть крупное фото товара в строку обычного табличного поля делают интерфейс нечитаемым и сильно перегружают оперативную память. Общепринятым стандартом разработки в обычных формах является использование связки «Табличное поле + Отдельное поле картинки на форме».
Разберем этот паттерн по шагам:
ТабличноеПоле (список товаров).ПолеКартинки и называем его ПолеПросмотраИзображения.ПриАктивизацииСтроки. В этом событии мы будем динамически считывать картинку текущей строки и выводить ее в наше отдельное поле в крупном размере.Посмотрим на пример реализации данного метода:
Процедура ТабличноеПоле1ПриАктивизацииСтроки(Элемент)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Номенклатура) Тогда
// Извлекаем картинку номенклатуры (хранилище значений или присоединенный файл)
КартинкаТовара = ПолучитьКартинкуНоменклатуры(ТекущаяСтрока.Номенклатура);
Если ТипЗнч(КартинкаТовара) = Тип("Картинка") Тогда
ЭлементыФормы.ПолеПросмотраИзображения.Картинка = КартинкаТовара;
Иначе
// Если картинка не задана, очищаем поле
ЭлементыФормы.ПолеПросмотраИзображения.Картинка = Новый Картинка;
EndIf;
Иначе
ЭлементыФормы.ПолеПросмотраИзображения.Картинка = Новый Картинка;
КонецЕсли;
КонецПроцедуры
В старых решениях разработчики часто использовали COM-объект WIA.ImageFile (Windows Image Acquisition) для изменения разрешения изображений на стороне сервера 1С перед их передачей на форму (как показано в Сообщении 2 форума). Однако этот метод имеет критические недостатки: он работает исключительно под операционной системой Windows и может вызывать серьезные утечки памяти при интенсивной работе фоновых процессов.
В современных конфигурациях 1С на платформе 8.3 для оптимизации размеров картинок рекомендуется использовать кроссплатформенные и производительные подходы:
Картинка поддерживает методы обработки и преобразования форматов, что позволяет оптимизировать вес файлов при записи в базу данных без внешних библиотек.ЗапуститьПриложение(). Это стандартный и надежный способ массового сжатия картинок на операционных системах Linux и Windows.