В процессе перехода с обычных форм на управляемые многие разработчики сталкиваются с проблемой: привычный код для отображения картинок перестает работать, вызывая ошибку «Недопустимое значение». Это происходит из-за фундаментальных изменений в архитектуре платформы 1С:Предприятие 8, начиная с версии 8.2. В данной статье мы подробно разберем, почему возникает эта ошибка, чем отличается Декорация-картинка от Поля картинки, и как правильно реализовать динамический вывод изображений, используя механизмы временного хранилища.
Рассмотрим стандартную ситуацию. Разработчик пытается использовать следующий код в модуле управляемой формы:
&НаКлиенте
Процедура ПоказатьКартинку(Команда)
ФайлКартинка = "c:/temp/s.bmp";
МояКартинка = Новый Картинка(ФайлКартинка);
Элементы.Фото.Картинка = МояКартинка; // Ошибка здесь!
КонецПроцедуры
При выполнении этого кода система выдает ошибку установки атрибута контекста. Проанализируем ситуацию: в управляемом интерфейсе существует жесткое разделение на клиентскую и серверную части. Элемент формы с видом Декорация картинка предназначен преимущественно для статического оформления интерфейса (например, логотипов или иконок из библиотеки). Согласно документации, если картинка в декорацию задается программно, она может быть либо из БиблиотекаКартинок, либо пустой. Прямая передача объекта типа Картинка, созданного из файла на диске, в свойство декорации не поддерживается.
Для отображения динамических данных (фотографий сотрудников, товаров, сканов документов) нам необходимо использовать Поле формы с видом Поле картинки. Выясним важный нюанс: если вы просто добавите поле на форму и попытаетесь изменить его вид, список доступных видов может оказаться пустым.
Это происходит потому, что Поле картинки должно быть обязательно связано с данными. Для этого выполним следующие шаги:
АдресКартинки). К слову, добавление реквизитов и элементов на форму можно выполнять и программно.Строка. Именно в этой строке будет храниться навигационная ссылка на изображение.Поскольку сервер 1С не имеет прямого доступа к файлам на клиентском компьютере (и наоборот — в веб-клиенте доступ ограничен безопасностью браузера), нам необходимо использовать посредника — Временное хранилище. Рассмотрим алгоритм действий:
1. Создаем объект Картинка из файла (если работаем в толстом клиенте или файл доступен клиенту).
2. Помещаем двоичные данные картинки во временное хранилище.
3. Полученный адрес (строку) присваиваем реквизиту формы, который связан с полем картинки.
Разберем пример рабочего кода, предложенный участниками сообщества:
&НаКлиенте
Процедура ПоказатьКартинку(Команда)
// 1. Создаем объект картинки из локального файла
ПутьКФайлу = "c:/temp/s.bmp";
Карт = Новый Картинка(ПутьКФайлу);
// 2. Помещаем картинку во временное хранилище
// АдресКартинки — это строковый реквизит формы
АдресКартинки = ПоместитьВоВременноеХранилище(Карт, ЭтаФорма.УникальныйИдентификатор);
// Теперь элемент формы "ПолеКартинки", связанный с реквизитом АдресКартинки,
// автоматически отобразит содержимое.
КонецПроцедуры
Важный момент: использование ЭтаФорма.УникальныйИдентификатор в качестве второго параметра метода ПоместитьВоВременноеХранилище гарантирует, что картинка будет «жить» в памяти сервера ровно столько, сколько открыта ваша форма. Без этого параметра данные могут быть удалены при первом же серверном вызове.
Если нам нужно, чтобы пользователь сам выбрал файл, или если мы работаем в условиях, когда прямой путь к файлу использовать нельзя, проанализируем метод ПоместитьФайл. Этот метод объединяет выбор файла и его загрузку в хранилище.
&НаКлиенте
Процедура ЗагрузитьИПоказать(Команда)
ВыбранныйАдрес = "";
// Метод открывает диалог выбора файла и помещает его в хранилище
Если ПоместитьФайл(ВыбранныйАдрес, , , Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
// Присваиваем полученную ссылку реквизиту формы
АдресКартинки = ВыбранныйАдрес;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что для современных версий платформы (8.3.15+) рекомендуется использовать асинхронные методы, такие как НачатьПомещениеФайла, чтобы не блокировать интерфейс пользователя во время загрузки.
После того как мы успешно передали адрес картинки в поле формы, проанализируем, как она выглядит. Часто изображение может быть слишком большим, неправильно ориентированным или искаженным. Чтобы этого избежать, настроим свойство РазмерКартинки у элемента формы:
Подведем итог нашему разбору. Для реализации динамического вывода изображений в управляемом приложении необходимо придерживаться следующих правил:
Декорации для динамики. Только Поле формы с видом Поле картинки.Строка).ПоместитьВоВременноеХранилище для передачи файла с клиента на сервер.УникальномуИдентификатору формы для контроля времени жизни объекта.Такой подход обеспечивает стабильную работу кода как в тонком клиенте, так и в веб-клиенте, соблюдая архитектурные принципы платформы 1С. Подобные механизмы часто используются, когда создается интерактивная внутренняя справка.