В данной статье мы подробно разберем, как программно управлять выводом изображений в элементах управляемых форм на платформе 1С:Предприятие 8.3. Часто перед разработчиком стоит задача динамического отображения контента: будь то логотипы компаний, фотографии номенклатуры или графические индикаторы статусов в списках (удобно через вывод иконок и графических индикаторов в списках). Мы изучим основные механизмы платформы, позволяющие загружать картинки из внешних файлов, использовать объекты из макетов конфигурации и организовывать их хранение в базе данных.
Для отображения одиночного изображения на форме чаще всего используются элементы типа Декорация (с видом Картинка) или специализированное Поле картинки. Этот процесс реализации достаточно прост и понятен.
Прежде всего, необходимо получить объект типа Картинка. Это можно сделать несколькими способами:
Загрузка файла с локального диска:
Для создания объекта Картинка из файла можно использовать путь к нему или предварительно полученные двоичные данные. Типовой алгоритм выглядит следующим образом:
Сначала определим путь к файлу. Как правило, для этого используется стандартный диалог выбора, позволяющий пользователю указать нужное изображение интерактивно — для этой задачи есть обработка загрузки и предпросмотра картинок.
&НаКлиенте
Процедура ЗагрузитьКартинкуИзФайлаНаДиск(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.ПолноеИмяФайла = "";
Диалог.Фильтр = "Изображения (*.png,*.jpg,*.gif)|*.png;*.jpg;*.gif";
Диалог.Заголовок = "Выберите файл изображения";
Если Диалог.Выбрать() Тогда
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
Если Не ПустаяСтрока(ВыбранныйФайл) Тогда
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ВыбранныйФайл);
НоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
// Устанавливаем картинку в элемент формы
// 'Элементы.МояДекорация' — имя соответствующего элемента на форме
Элементы.МояДекорация.Картинка = НоваяКартинка;
Сообщить("Изображение успешно загружено.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данном примере Элементы.МояДекорация ссылается на декорацию формы, у которой в свойствах задан Вид = Картинка.
Использование двоичных данных:
Если изображение уже получено в виде двоичных данных (например, прочитано из базы или пришло по API), объект Картинка создается напрямую из них:
&НаКлиенте
Процедура УстановитьИзображениеИзДанных(ДвоичныеДанныеИзображения)
Если ДвоичныеДанныеИзображения <> Неопределено Тогда
НоваяКартинка = Новый Картинка(ДвоичныеДанныеИзображения);
Элементы.МояДекорация.Картинка = НоваяКартинка;
Иначе
Предупреждение("Данные изображения отсутствуют.");
КонецЕсли;
КонецПроцедуры
Получение картинки из макета конфигурации:
Для хранения статичных элементов (иконки, логотипы) удобно использовать общие макеты типа Картинка. Обращение к ним из кода выполняется крайне эффективно:
&НаКлиенте
Процедура УстановитьКартинкуИзМакета(Команда)
// 'ЛоготипФирмы' — имя общего макета типа Картинка
КартинкаИзМакета = ПолучитьОбщийМакет("ЛоготипФирмы").ПолучитьКартинку();
Если КартинкаИзМакета <> Неопределено Тогда
Элементы.МояДекорация.Картинка = КартинкаИзМакета;
Иначе
Сообщить("Не удалось найти макет 'ЛоготипФирмы'.");
КонецЕсли;
КонецПроцедуры
Этот метод идеален для элементов интерфейса, которые не меняются в зависимости от действий пользователя.
Отображение картинок в строках таблицы (например, миниатюр в каталоге товаров) отличается тем, что каждая строка должна хранить свой уникальный объект — решить эту задачу поможет обработка вывода изображений товаров в списках. Для этого мы задействуем реквизиты табличной части или динамического списка.
Создание реквизита данных:
В структуру таблицы необходимо добавить реквизит для хранения данных картинки. Оптимальным выбором будет тип ХранилищеЗначения (для хранения объекта Картинка) или ДвоичныеДанные.
Настройка колонки таблицы:
В редакторе формы выберите нужную колонку таблицы и установите её свойство Вид в значение Поле картинки. Убедитесь, что свойство ПутьКДанным указывает на созданный ранее реквизит (например, Объект.Товары.Изображение).
Платформа 1С автоматически извлечет данные из ХранилищаЗначения и визуализирует их в ячейке.
Программное заполнение данных в строках:
Заполнение выполняется аналогично работе с одиночными полями, но с привязкой к конкретной строке:
Загрузка из файла для текущей строки:
&НаКлиенте
Процедура ЗагрузитьКартинкуВСтроку(Команда)
СтрокаТаблицы = Элементы.ТаблицаТовары.ТекущиеДанные;
Если СтрокаТаблицы = Неопределено Тогда
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда
Данные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
ОбъектКартинка = Новый Картинка(Данные);
// Помещаем объект в ХранилищеЗначения для корректного отображения
СтрокаТаблицы.Изображение = Новый ХранилищеЗначения(ОбъектКартинка);
КонецЕсли;
КонецПроцедуры
Установка иконки из макета:
&НаКлиенте
Процедура УстановитьСтандартнуюИконку(Команда)
СтрокаТаблицы = Элементы.ТаблицаТовары.ТекущиеДанные;
Если СтрокаТаблицы <> Неопределено Тогда
КартинкаМакет = БиблиотекаКартинок.ВажноеСобытие; // Пример из стандартной библиотеки
СтрокаТаблицы.Изображение = Новый ХранилищеЗначения(КартинкаМакет);
КонецЕсли;
КонецПроцедуры
Работа с графикой в 1С требует соблюдения определенных правил для обеспечения стабильности и быстродействия системы:
Производительность: Массовая загрузка тяжелых изображений в таблицы может привести к задержкам при отрисовке формы. Старайтесь использовать оптимизированные миниатюры (thumbnails) для списков.
Стратегия хранения:
Для неизменяемых элементов интерфейса всегда используйте макеты конфигурации или библиотеку картинок.
Для пользовательского контента (фото товаров) используйте ХранилищеЗначения в реквизитах справочников или документов — настроить это поможет обработка вывода изображений товаров в формах списков.
Масштабирование: У элементов формы есть свойство РазмерКартинки (Авто, Реальный размер, Растянуть, Пропорционально). Выбор правильного режима позволит избежать искажений.
Очистка данных: Чтобы программно убрать изображение, присвойте свойству или реквизиту значение Неопределено.
// Удаление картинки из декорации
Элементы.МояДекорация.Картинка = Неопределено;
// Удаление из строки таблицы
ТекущаяСтрока.Изображение = Новый ХранилищеЗначения(Неопределено);
Используя данные методы, вы сможете создавать современные и информативные интерфейсы в управляемом приложении 1С 8.3, гибко управляя визуализацией данных в зависимости от бизнес-логики вашей конфигурации.