Как реализовать просмотр и масштабирование изображений в мобильном приложении 1С?

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

Разработка мобильных приложений на платформе 1С имеет свои специфические особенности, особенно когда речь идет о работе с мультимедиа. Одной из классических проблем является просмотр изображений. Если в десктопной версии стандартная функция ПоказатьЗначение работает корректно, открывая встроенный просмотрщик, то на мобильных устройствах это часто приводит к аварийному завершению работы приложения (вылету) или отсутствию возможности масштабирования изображения («pinch-to-zoom»).

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

Почему стандартные методы не работают на мобильной платформе?

Для начала выясним причину, по которой привычный код вызывает ошибки. Мобильная платформа 1С работает в условиях жестко ограниченных ресурсов оперативной памяти. При вызове ПоказатьЗначение для объекта типа Картинка, система пытается передать большой объем данных встроенному обработчику. Если разрешение фотографии высокое, мобильная ОС может принудительно закрыть процесс 1С из-за превышения лимита выделенной памяти (Heap).

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

Способ 1. Вызов внешнего приложения через временный файл

Этот метод считается наиболее надежным. Его суть заключается в том, чтобы сохранить изображение из информационной базы во временный каталог устройства, а затем скомандовать операционной системе открыть этот файл стандартным средством просмотра.

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


&НаКлиенте
Процедура НажатьНаФото(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получаем двоичные данные из реквизита или временного хранилища
    // Предположим, что данные уже находятся в объекте
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(ЭтаФорма[Элемент.Имя]);
    
    // Генерируем уникальное имя файла во временном каталоге
    ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
    
    // Записываем данные на диск устройства
    ДвоичныеДанные.Записать(ИмяФайла);
    
    // Настраиваем оповещение о завершении (даже если оно будет пустым)
    Оповещение = Новый ОписаниеОповещения("ПослеЗапускаПриложения", ЭтотОбъект);
    
    // Вызываем системное приложение для просмотра файла
    НачатьЗапускПриложения(Оповещение, ИмяФайла, , Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт
    // Здесь можно реализовать логику удаления временного файла, 
    // но лучше делать это при закрытии основной формы.
КонецПроцедуры

Рассмотрим важный нюанс, связанный с путями к файлам. В мобильной платформе использование КаталогБиблиотекиМобильногоУстройства может приводить к ошибкам доступа. Рекомендуется использовать функцию КаталогВременныхФайлов(). Это «песочница» приложения, в которую запись разрешена всегда.

Способ 2. Использование поля HTML-документа для «бесшовного» просмотра

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

Проанализируем ситуацию: нам нужно создать строку HTML, которая содержит тег img, и настроить мета-теги так, чтобы разрешить пользователю изменять масштаб страницы.

  1. Создайте на форме реквизит с типом Строка (например, ТекстHTML).
  2. Вынесите его на форму и установите вид Поле HTML-документа.
  3. При нажатии на миниатюру или при открытии формы сформируйте следующий код:

&НаКлиенте
Процедура ПоказатьФотоВHTML(ДвоичныеДанные)
    
    // Преобразуем двоичные данные в Base64 для вставки в HTML
    СтрокаBase64 = Base64Строка(ДвоичныеДанные);
    
    // Формируем HTML-контейнер с поддержкой масштабирования (viewport)
    ТекстHTML = "
    |<html>
    |<head>
    |    <meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=yes'>
    |    <style>
    |        body { margin: 0; padding: 0; background-color: black; display: flex; align-items: center; justify-content: center; height: 100vh; }
    |        img { max-width: 100%; height: auto; }
    |    </style>
    |</head>
    |<body>
    |    <img src='data:image/jpeg;base64," + СтрокаBase64 + "'>
    |</body>
    |</html>";
    
КонецПроцедуры

Важное замечание по производительности: Передача очень больших картинок (более 5-10 Мб) через строку Base64 в HTML-поле может замедлить работу интерфейса. В таких случаях лучше сначала записать файл на диск, как в первом способе, а в атрибуте src тега img указать путь к этому файлу (используя протокол file://).

Особенности работы на Android и iOS

При использовании метода НачатьЗапускПриложения следует помнить о безопасности. На последних версиях Android операционная система не позволяет сторонним приложениям (например, внешней галерее) открывать файлы напрямую из внутренней памяти 1С без специальной настройки Content Provider.

Чтобы гарантировать успех, убедитесь, что в свойствах мобильной конфигурации установлены следующие разрешения (галочки):

Оптимизация хранения и очистка данных

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

  1. Сжатие при загрузке: Не храните в мобильной базе оригиналы фото по 15 Мб. Перед сохранением в базу используйте объект ОбработкаКартинок для уменьшения разрешения до разумных пределов (например, 1920x1080).
  2. Удаление временных файлов: При использовании Записать() для временных файлов, не забывайте удалять их. Хорошей практикой считается очистка временного каталога при завершении работы с формой просмотра: УдалитьФайлы(ПутьКФайлу).
  3. Проверка расширения: Всегда проверяйте, что файл имеет корректное расширение (jpg, png). Внешние приложения-просмотрщики ориентируются именно на него для определения типа контента.

Подведем итог. Для быстрой реализации «просмотра на весь экран» идеально подходит метод НачатьЗапускПриложения. Если же ваша цель — обеспечить максимальный комфорт пользователя с возможностью плавного масштабирования внутри интерфейса вашей программы, используйте Поле HTML-документа. Оба этих способа обходят ограничение стандартной функции ПоказатьЗначение и делают работу с мобильным приложением 1С профессиональной и стабильной.

← На главную