В управляемом приложении 1С:Предприятие 8 клиентская часть не имеет прямого доступа к оперативной памяти сервера и объектам отображения так, как это было в обычных формах. Частая ошибка разработчиков заключается в попытке создать на управляемой форме реквизит с типом Картинка. Однако для корректного отображения файлов изображений механизм управляемых форм работает через навигационные ссылки временного хранилища.
Разберем по шагам правильный алгоритм настройки формы и программный код для вывода изображения, хранящегося на диске.
Проанализируем структуру формы в конфигураторе и выполним необходимые настройки:
АдресКартинки). В качестве типа данных обязательно укажем Строка (неограниченной длины). Именно в этот строковый реквизит будет помещаться уникальный адрес временного хранилища вида e1cib/tempstorage/....Поле картинки.ПутьКДанным выберем созданный строковый реквизит АдресКартинки.РазмерКартинки со значением Пропорционально или Авто, чтобы избежать искажения исходных пропорций изображения при изменении размеров окна.Рассмотрим ситуацию, когда файл изображения находится на диске сервера 1С или в общей сетевой папке, к которой у службы сервера есть доступ. Для чтения файла мы создаем объект ДвоичныеДанные, после чего помещаем его во временное хранилище текущей формы.
Посмотрим на пример серверной процедуры:
&НаСервере
Процедура ЗагрузитьКартинкуСДискаСервера(ПутьКФайлу)
// Проверяем существование файла на диске
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
// Считываем двоичные данные файла
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
// Помещаем данные во временное хранилище формы
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
Иначе
ВызватьИсключение "Файл изображения не найден по указанному пути!";
КонецЕсли;
КонецПроцедуры
Обратим внимание на второй параметр метода ПоместитьВоВременноеХранилище: передача свойства УникальныйИдентификатор текущей формы гарантирует, что данные будут храниться в памяти до тех пор, пока открыта форма, и автоматически удалятся при ее закрытии.
Если файл находится на локальном компьютере пользователя в тонком клиенте с прямым доступом к файловой системе, мы можем получить двоичные данные прямо на клиенте и передать их во временное хранилище:
&НаКлиенте
Процедура ЗагрузитьКартинкуСДискаКлиента(ПутьКФайлу)
// Получаем двоичные данные локального файла
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
// Помещаем во временное хранилище, привязывая к форме
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
КонецПроцедуры
При работе в веб-клиенте или асинхронном режиме прямое чтение путей через ДвоичныеДанные ограничено политикой безопасности браузера. В таком случае для выбора и отправки файла применяется метод НачатьПомещениеФайлаНаСервер.
Картинка, элемент формы не сможет связаться с временным хранилищем. Тип реквизита должен быть исключительно Строка.ПоместитьВоВременноеХранилище не передать УникальныйИдентификатор формы (или передать Неопределено), ссылка будет считаться действующей только в рамках текущего серверного вызова и картинка исчезнет с экрана сразу после завершения процедуры.usr1cv8), имеет права на чтение каталога с файлами.УдалитьИзВременногоХранилища(АдресКартинки).В некоторых задачах требуется тонкая настройка отображения (масштабирование CSS, рамки, скругления). В этом случае на форму можно добавить Поле HTML документа, преобразовав изображение в формат Base64:
&НаСервере
Функция ПолучитьHTMLСКартинкой(ПутьКФайлу)
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаBase64 = Base64Строка(ДвоичныеДанныеКартинки);
ТекстHTML = "<html><body style='margin:0; padding:0; display:flex; justify-content:center; align-items:center;'>"
+ "<img src='data:image/png;base64," + СтрокаBase64 + "' style='max-width:100%; max-height:100%;' />"
+ "</body></html>";
Возврат ТекстHTML;
КонецФункции
Полученная строка присваивается строковому реквизиту формы, связанному с полем HTML-документа, обеспечивая гибкое форматирование вывода.