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