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