Как программно открыть диалог с просмотром изображения в 1С?

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

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

Причины распространенных ошибок при программном открытии

Разберем по шагам, с какими проблемами чаще всего сталкиваются разработчики:

  1. Передача адреса хранилища вместо объекта: В управляемой форме реквизит, связанный с полем картинки, обычно содержит строковый путь вида e1cib/tempstorage/... или навигационную ссылку. Если передать такую строку в метод ПоказатьЗначение или ОткрытьЗначение, платформа воспринимает её как обычный текст и открывает стандартный диалог просмотра строкового значения, а не само изображение.
  2. Отсутствие расширения файла: При сохранении данных из временного хранилища на диск конструктор Новый Файл(...) не может автоматически определить формат файла по адресу хранилища. Если файл сохраняется без расширения (например, .png или .jpg), операционная система не может определить подходящую программу для его открытия.

Способ 1. Использование встроенного диалога просмотра через метод ПоказатьЗначение

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

Посмотрим на пример клиентского кода, если адрес изображения уже находится во временном хранилище:


&НаКлиенте
Процедура ПросмотретьКартинку(Команда)
    // АдресХранилища — реквизит формы строкового типа, содержащий адрес во временном хранилище
    Если ЗначениеЗаполнено(АдресХранилища) Тогда
        КартинкаОбъект = Новый Картинка(АдресХранилища);
        ПоказатьЗначение(Неопределено, КартинкаОбъект);
    КонецЕсли;
КонецПроцедуры

Важно: Метод ПоказатьЗначение является асинхронным и рекомендуется к использованию в современных конфигурациях, где свойство Режим использования модальности установлено в значение Не использовать. Устаревший синхронный метод ОткрытьЗначение в таких условиях вызовет исключение.

Способ 2. Открытие изображения через внешнее приложение операционной системы

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

Разберем по шагам реализацию этого варианта:

  1. Создаем объект Картинка на основе адреса из временного хранилища или получаем двоичные данные.
  2. Формируем уникальное имя файла во временном каталоге с обязательным указанием расширения (.png, .jpg).
  3. Записываем картинку на диск методом Записать.
  4. Запускаем просмотр с помощью метода ЗапуститьПриложение или ЗапуститьПриложениеАсинх.

Посмотрим на пример кода:


&НаКлиенте
Процедура ОткрытьВоВнешнейПрограмме()
    Если НЕ ЗначениеЗаполнено(Объект.Доверенность) Тогда
        Возврат;
    КонецЕсли;

    ДанныеФайла = Новый Картинка(Объект.Доверенность);
    
    // Формируем путь к файлу с расширением во временном каталоге
    ИмяФайла = КаталогВременныхФайлов() + "СканДокумента_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "") + ".png";
    
    ДанныеФайла.Записать(ИмяФайла);
    
    // Запускаем просмотр средствами операционной системы
    ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры

Способ 3. Открытие специализированной формы просмотра

Если требуется управлять оформлением окна просмотра внутри 1С (задавать размер, масштаб или блокировать родительское окно), оптимальным решением будет создание отдельной общей формы.

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


&НаКлиенте
Процедура ОткрытьФормуПросмотра()
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("АдресКартинки", Объект.ФотографияСотрудника);
    
    ОткрытьФорму("ОбщаяФорма.ПросмотрИзображений", ПараметрыОткрытия, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

В самой форме просмотра в обработчике ПриСозданииНаСервере достаточно связать полученный адрес из параметров с реквизитом формы и отобразить его в элементе интерфейса.

← На главную