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

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

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

Разберем по шагам правильный алгоритм настройки формы и программный код для вывода изображения, хранящегося на диске.

Шаг 1. Настройка реквизитов и элементов управляемой формы

Проанализируем структуру формы в конфигураторе и выполним необходимые настройки:

  1. Перейдем на вкладку Реквизиты управляемой формы и добавим новый реквизит (например, АдресКартинки). В качестве типа данных обязательно укажем Строка (неограниченной длины). Именно в этот строковый реквизит будет помещаться уникальный адрес временного хранилища вида e1cib/tempstorage/....
  2. Перейдем на вкладку Элементы и добавим элемент управления с видом Поле картинки.
  3. В свойствах созданного поля картинки в параметре ПутьКДанным выберем созданный строковый реквизит АдресКартинки.
  4. В свойствах элемента также рекомендуется настроить свойство РазмерКартинки со значением Пропорционально или Авто, чтобы избежать искажения исходных пропорций изображения при изменении размеров окна.

Шаг 2. Загрузка файла с диска на стороне сервера

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

Посмотрим на пример серверной процедуры:


&НаСервере
Процедура ЗагрузитьКартинкуСДискаСервера(ПутьКФайлу)
    
    // Проверяем существование файла на диске
    ФайлНаДиске = Новый Файл(ПутьКФайлу);
    Если ФайлНаДиске.Существует() Тогда
        // Считываем двоичные данные файла
        ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
        
        // Помещаем данные во временное хранилище формы
        АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
    Иначе
        ВызватьИсключение "Файл изображения не найден по указанному пути!";
    КонецЕсли;
    
КонецПроцедуры

Обратим внимание на второй параметр метода ПоместитьВоВременноеХранилище: передача свойства УникальныйИдентификатор текущей формы гарантирует, что данные будут храниться в памяти до тех пор, пока открыта форма, и автоматически удалятся при ее закрытии.

Шаг 3. Загрузка файла с локального диска клиента

Если файл находится на локальном компьютере пользователя в тонком клиенте с прямым доступом к файловой системе, мы можем получить двоичные данные прямо на клиенте и передать их во временное хранилище:


&НаКлиенте
Процедура ЗагрузитьКартинкуСДискаКлиента(ПутьКФайлу)
    
    // Получаем двоичные данные локального файла
    ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
    
    // Помещаем во временное хранилище, привязывая к форме
    АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
    
КонецПроцедуры

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

Важные нюансы и частые ошибки

  1. Неверный тип реквизита: Если реквизиту формы задан тип Картинка, элемент формы не сможет связаться с временным хранилищем. Тип реквизита должен быть исключительно Строка.
  2. Время жизни ссылки: Если при вызове ПоместитьВоВременноеХранилище не передать УникальныйИдентификатор формы (или передать Неопределено), ссылка будет считаться действующей только в рамках текущего серверного вызова и картинка исчезнет с экрана сразу после завершения процедуры.
  3. Права службы 1С: При чтении файлов на сервере убедимся, что системная учетная запись, от имени которой запущена служба сервера 1С:Предприятия (например, usr1cv8), имеет права на чтение каталога с файлами.
  4. Очистка памяти: При частой смене картинок в одном окне без закрытия формы рекомендуется предварительно освобождать память с помощью метода УдалитьИзВременногоХранилища(АдресКартинки).

Альтернативный вариант: вывод через Поле HTML документа

В некоторых задачах требуется тонкая настройка отображения (масштабирование 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-документа, обеспечивая гибкое форматирование вывода.

← На главную