При разработке управляемых форм часто возникает задача сделать интерфейс более интуитивным. Одной из таких задач является открытие полноценного окна просмотра изображения при обычном клике левой кнопкой мыши по полю картинки, вместо того чтобы заставлять пользователя искать пункт «Просмотреть картинку» в контекстном меню. Рассмотрим несколько способов реализации этой функциональности, начиная от простых встроенных методов платформы и заканчивая продвинутыми техниками с использованием внешних средств.
Проанализируем наиболее эффективный и простой способ, который предоставляет сама платформа 1С:Предприятие. Для того чтобы вызвать стандартное окно просмотра, которое обладает функциями масштабирования, печати и сохранения, мы можем воспользоваться методом ПоказатьЗначение(). Этот метод универсален и работает в большинстве случаев, когда нам нужно быстро показать объект пользователю.
Разберем по шагам, что необходимо сделать. Во-первых, для элемента формы типа Поле картинки нужно установить свойство Гиперссылка в значение Истина. Это позволит полю реагировать на нажатие как на активное действие. Во-вторых, необходимо прописать логику в событии Нажатие.
Посмотрим на пример кода, который реализует этот механизм:
&НаКлиенте
Процедура ДекорацияКартинкаНажатие(Элемент)
// Получаем адрес картинки из данных формы.
// Предполагаем, что ПутьКДанным указывает на реквизит, содержащий навигационную ссылку.
АдресКартинки = Объект.СсылкаНаИзображение;
Если ЭтоАдресВременногоХранилища(АдресКартинки) Или Найти(АдресКартинки, "e1cib/data/") > 0 Тогда
// Создаем объект Картинка на основании данных из хранилища
ВыбраннаяКартинка = Новый Картинка(ПолучитьИзВременногоХранилища(АдресКартинки));
// Вызываем системное окно просмотра
ПоказатьЗначение(, ВыбраннаяКартинка);
КонецЕсли;
КонецПроцедуры
В данном примере мы используем объект Картинка, инициализированный двоичными данными. Метод ПоказатьЗначение принимает этот объект и открывает модальное (или блокирующее, в зависимости от настроек) окно. Это самый «чистый» способ с точки зрения разработки, так как он задействует стандартные механизмы платформы.
Рассмотрим ситуацию, когда стандартное окно ПоказатьЗначение по каким-то причинам не устраивает. Выясним причину: иногда разработчику требуется более глубокая кастомизация интерфейса. Платформа 1С содержит внутри себя встроенные формы, написанные на языке 1С, включая форму просмотра изображений image.lf.
Проанализируем возможность использования этих ресурсов. Хотя вызвать их напрямую через ОткрытьФорму получается не всегда (особенно те, что завязаны на внутренние объекты extObj), опытные разработчики могут извлечь их с помощью инструментов анализа ресурсов. После извлечения форму можно добавить в конфигурацию как ОбщаяФорма и модифицировать под свои нужды. Стоит учитывать, что код в таких формах часто написан на английском языке (внутренний стандарт платформы), поэтому при переносе может потребоваться адаптация модулей.
Если стоит задача предоставить пользователю максимально привычный интерфейс (например, стандартный просмотрщик фотографий Windows), мы можем воспользоваться методом ЗапуститьПриложение(). Разберем этот алгоритм подробнее:
ПолучитьИмяВременногоФайла(), обязательно указывая правильное расширение файла (например, ".jpg" или ".png"). Это критически важно для того, чтобы операционная система поняла, какой программой открывать файл.ЗапуститьПриложение(ПутьКФайлу).Пример реализации данной логики:
&НаКлиенте
Процедура ОткрытьВоВнешнемПриложении(АдресКартинки)
ДанныеКартинки = ПолучитьИзВременногоХранилища(АдресКартинки);
ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
ДанныеКартинки.Записать(ИмяФайла);
// Запуск приложения по умолчанию для данного типа файла
ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры
Этот способ гарантирует, что пользователь сможет использовать все привычные инструменты своей ОС: масштабирование колесиком мыши без зажатого Ctrl, поворот изображения и отправку на печать через системные диалоги.
Посмотрим на специфику работы в мобильном клиенте. Обычные методы управления окнами в мобильной среде могут работать не так эффективно, как на десктопе. Для мобильных устройств рекомендуется использовать объект СредстваМультимедиа.
Проанализируем ситуацию: на смартфоне пользователь ожидает возможности «раздвигать» картинку пальцами (зуммирование). Чтобы задействовать нативный просмотрщик мобильной операционной системы, следует использовать метод СредстваМультимедиа.ПоказатьФотографию(). Это обеспечит наилучший пользовательский опыт, так как интерфейс будет полностью соответствовать стандартам iOS или Android.
Выясним, когда может понадобиться ПолеHTMLДокумента. Если вам нужно внедрить просмотрщик прямо внутрь формы без открытия новых окон, но при этом обеспечить возможность перетаскивания (drag-and-drop) и масштабирования внутри области, HTML-поле является отличным выходом. С помощью простых JavaScript-библиотек можно реализовать полноценный интерактивный просмотрщик.
Преимущество этого метода заключается в том, что вы не ограничены возможностями платформы 1С по работе с графикой. Однако это требует навыков работы с HTML и JS, а также корректной передачи двоичных данных картинки в формате base64 внутрь HTML-кода.
Рассмотрим несколько советов, которые помогут сделать работу с картинками быстрее и надежнее:
ПоместитьВоВременноеХранилище() для оптимизации трафика.Пропорционально. Это позволит картинке не искажаться, сохраняя свои пропорции в рамках выделенной области.Таким образом, мы проанализировали различные подходы к реализации просмотра изображений. Выбор конкретного метода зависит от ваших бизнес-задач: требуется ли вам простота реализации (ПоказатьЗначение) или максимальная функциональность для пользователя (внешний просмотрщик или HTML-поле).