В процессе разработки интерфейсов на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность детального просмотра изображений. Стандартное поле формы с видом Поле картинки по умолчанию поддерживает контекстное меню, в котором есть пункт «Посмотреть картинку». При его выборе открывается отдельное окно, где изображение отображается в исходном размере с возможностью масштабирования. Однако иногда требуется вызвать это же окно не через правую кнопку мыши, а программно — например, при нажатии на саму картинку или по отдельной кнопке «Увеличить».
В этой статье мы подробно разберем, как реализовать этот функционал для управляемых и обычных форм, проанализируем возможные типы данных и рассмотрим нюансы работы с временными хранилищами.
Для современной платформы 8.3 (управляемое приложение) наиболее правильным и рекомендуемым способом является использование метода глобального контекста ПоказатьЗначение. Этот метод позволяет открыть стандартное окно просмотра для значений различных типов, включая объект Картинка.
Рассмотрим ситуацию, когда у нас на форме есть реквизит с адресом картинки во временном хранилище. Разберем по шагам, как написать обработчик нажатия:
&НаКлиенте
Процедура КартинкаНажатие(Элемент, СтандартнаяОбработка)
// Отменяем стандартное действие платформы, если оно предусмотрено
СтандартнаяОбработка = Ложь;
// Проверяем, заполнена ли картинка
Если ЗначениеЗаполнено(Объект.АдресКартинки) Тогда
// Преобразуем адрес из временного хранилища в объект типа Картинка
// Это критически важно, так как метод ПоказатьЗначение ожидает именно объект
ВыбраннаяКартинка = Новый Картинка(ПолучитьИзВременногоХранилища(Объект.АдресКартинки));
// Вызываем стандартное окно просмотра
ПоказатьЗначение(Неопределено, ВыбраннаяКартинка);
КонецЕсли;
КонецПроцедуры
В данном примере мы используем ПоказатьЗначение без описания оповещения (первый параметр — Неопределено), так как нам не требуется выполнять какие-либо действия после закрытия окна просмотра. Платформа самостоятельно откроет окно, которое будет вести себя точно так же, как системное окно «Посмотреть картинку».
Проанализируем распространенную ошибку: попытку передать в метод ПоказатьЗначение строку (навигационную ссылку) или двоичные данные напрямую. Если вы передадите строку-адрес, система попытается «показать» саму строку текста, а не изображение. Поэтому мы всегда должны предварительно инициализировать объект Картинка.
Если ваши данные хранятся в базе как ДвоичныеДанные, алгоритм будет следующим:
ДвоичныеДанные из реквизита или хранилища значений.ТекущаяКартинка = Новый Картинка(ПолученныеДвоичныеДанные);В старых конфигурациях или при использовании обычных форм (платформа 8.2 или 8.3 в режиме совместимости) часто применялся метод ОткрытьЗначение. Несмотря на внешнюю схожесть, у него есть существенные отличия, особенно в части модальности.
Рассмотрим пример кода для обычной формы:
Процедура ОсновноеИзображениеНажатие(Элемент)
// Получаем картинку из элемента формы или реквизита
пКартинка = ЭлементыФормы.ОсновноеИзображение.Картинка;
Если пКартинка <> Неопределено Тогда
// Открываем модальное окно просмотра
ОткрытьЗначение(пКартинка);
КонецЕсли;
КонецПроцедуры
Важное предупреждение: Как отмечают опытные разработчики, использование ОткрытьЗначение в режиме обычных форм может привести к проблемам. В некоторых случаях окно просмотра открывается модально и «блокирует» основной интерфейс, при этом кнопка закрытия (крестик) может не срабатывать корректно, если нарушена иерархия вызовов окон. Если вы столкнулись с тем, что программа «зависает» при просмотре картинки, рекомендуем рассмотреть альтернативный вариант с созданием собственной формы просмотра.
Если стандартное окно 1С вас не устраивает (например, нужно добавить кнопку «Печать» или «Повернуть»), мы можем создать простую вспомогательную форму. Это решение гарантированно работает на всех типах форм и предоставляет полный контроль над интерфейсом.
Разберем логику создания такой формы:
ФормаПросмотраИзображения.Строка (для адреса во временном хранилище) и элемент формы типа Поле картинки.РазмерКартинки в значение Пропорционально или Автоматически.
&НаКлиенте
Процедура ПросмотретьРасширенно()
ПараметрыОткрытия = Новый Структура("АдресКартинки", Объект.АдресКартинки);
ОткрытьФорму("ОбщаяФорма.ФормаПросмотраИзображения", ПараметрыОткрытия);
КонецПроцедуры
Такой подход позволяет избежать проблем с модальностью и дает возможность реализовать удобный «слайдер» для перелистывания нескольких картинок, чего стандартное окно просмотра сделать не позволяет.
Иногда требуется открыть изображение не в 1С, а в стандартном просмотрщике Windows или другой ОС. Это полезно, если пользователю нужно использовать специфические инструменты редактирования. Выясним, как это реализовать:
Проанализируем последовательность действий:
ЗапуститьПриложение.
&НаКлиенте
Процедура ОткрытьВСистемномПросмотрщике()
// Получаем данные из хранилища
Данные = ПолучитьИзВременногоХранилища(Объект.АдресКартинки);
// Генерируем путь к временному файлу
ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
// Записываем данные на диск
Данные.Записать(ИмяФайла);
// Запускаем приложение по умолчанию для расширения .jpg
ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры
Этот метод является самым мощным с точки зрения функционала просмотра, но требует наличия прав на запись во временные папки и управления жизненным циклом временного файла.
Таким образом, для большинства задач в современных конфигурациях достаточно использовать ПоказатьЗначение, предварительно убедившись, что данные преобразованы в объект Картинка. Это обеспечит бесшовную интеграцию и привычный для пользователя интерфейс.