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

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

В процессе перехода с обычных форм на управляемые многие разработчики сталкиваются с проблемой: привычный код для отображения картинок перестает работать, вызывая ошибку «Недопустимое значение». Это происходит из-за фундаментальных изменений в архитектуре платформы 1С:Предприятие 8, начиная с версии 8.2. В данной статье мы подробно разберем, почему возникает эта ошибка, чем отличается Декорация-картинка от Поля картинки, и как правильно реализовать динамический вывод изображений, используя механизмы временного хранилища.

Анализ причины ошибки в управляемом приложении

Рассмотрим стандартную ситуацию. Разработчик пытается использовать следующий код в модуле управляемой формы:


&НаКлиенте
Процедура ПоказатьКартинку(Команда)
    ФайлКартинка = "c:/temp/s.bmp";
    МояКартинка = Новый Картинка(ФайлКартинка);
    Элементы.Фото.Картинка = МояКартинка; // Ошибка здесь!
КонецПроцедуры

При выполнении этого кода система выдает ошибку установки атрибута контекста. Проанализируем ситуацию: в управляемом интерфейсе существует жесткое разделение на клиентскую и серверную части. Элемент формы с видом Декорация картинка предназначен преимущественно для статического оформления интерфейса (например, логотипов или иконок из библиотеки). Согласно документации, если картинка в декорацию задается программно, она может быть либо из БиблиотекаКартинок, либо пустой. Прямая передача объекта типа Картинка, созданного из файла на диске, в свойство декорации не поддерживается.

Выбор правильного элемента управления

Для отображения динамических данных (фотографий сотрудников, товаров, сканов документов) нам необходимо использовать Поле формы с видом Поле картинки. Выясним важный нюанс: если вы просто добавите поле на форму и попытаетесь изменить его вид, список доступных видов может оказаться пустым.

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

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

Использование временного хранилища

Поскольку сервер 1С не имеет прямого доступа к файлам на клиентском компьютере (и наоборот — в веб-клиенте доступ ограничен безопасностью браузера), нам необходимо использовать посредника — Временное хранилище. Рассмотрим алгоритм действий:

1. Создаем объект Картинка из файла (если работаем в толстом клиенте или файл доступен клиенту).
2. Помещаем двоичные данные картинки во временное хранилище.
3. Полученный адрес (строку) присваиваем реквизиту формы, который связан с полем картинки.

Разберем пример рабочего кода, предложенный участниками сообщества:


&НаКлиенте
Процедура ПоказатьКартинку(Команда)
    // 1. Создаем объект картинки из локального файла
    ПутьКФайлу = "c:/temp/s.bmp";
    Карт = Новый Картинка(ПутьКФайлу);
    
    // 2. Помещаем картинку во временное хранилище
    // АдресКартинки — это строковый реквизит формы
    АдресКартинки = ПоместитьВоВременноеХранилище(Карт, ЭтаФорма.УникальныйИдентификатор);
    
    // Теперь элемент формы "ПолеКартинки", связанный с реквизитом АдресКартинки,
    // автоматически отобразит содержимое.
КонецПроцедуры

Важный момент: использование ЭтаФорма.УникальныйИдентификатор в качестве второго параметра метода ПоместитьВоВременноеХранилище гарантирует, что картинка будет «жить» в памяти сервера ровно столько, сколько открыта ваша форма. Без этого параметра данные могут быть удалены при первом же серверном вызове.

Работа с файловой системой через ПоместитьФайл

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


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

Обратите внимание, что для современных версий платформы (8.3.15+) рекомендуется использовать асинхронные методы, такие как НачатьПомещениеФайла, чтобы не блокировать интерфейс пользователя во время загрузки.

Тонкая настройка отображения

После того как мы успешно передали адрес картинки в поле формы, проанализируем, как она выглядит. Часто изображение может быть слишком большим, неправильно ориентированным или искаженным. Чтобы этого избежать, настроим свойство РазмерКартинки у элемента формы:

Итоги и рекомендации

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

  1. Забыть про использование Декорации для динамики. Только Поле формы с видом Поле картинки.
  2. Данные для поля должны передаваться в виде навигационной ссылки (тип Строка).
  3. Использовать ПоместитьВоВременноеХранилище для передачи файла с клиента на сервер.
  4. Всегда привязывать адрес в хранилище к УникальномуИдентификатору формы для контроля времени жизни объекта.

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

← На главную