Как отобразить картинку номенклатуры в форме подбора на обычных формах 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке и доработке диалоговых окон подбора номенклатуры часто требуется выводить изображение выбранного товара — например, в форме ввода количества, характеристик или упаковок. Однако при попытке присвоить значение элементу формы разработчики нередко сталкиваются с ошибками: «Поле объекта недоступно для записи» или «Несоответствие типов».

Разберем подробно, почему возникают эти ошибки, как правильно обращаться к элементу управления ПолеКартинки и как корректно извлекать двоичные данные или объект картинки из базы данных.

Причины распространенных ошибок при работе с картинками

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

  1. Неправильное обращение к элементу формы: попытка присвоить значение напрямую элементу управления ЭлементыФормы.Картинка = ... приводит к ошибке «Поле объекта недоступно для записи». Элемент управления на обычной форме представляет собой объект интерфейса, а само изображение должно передаваться в его специальное свойство Картинка: ЭлементыФормы.ИмяПоляКартинки.Картинка = ....
  2. Несоответствие типов при присвоении: реквизит ОсновноеИзображение в справочнике номенклатуры обычно содержит только ссылку на элемент справочника присоединенных файлов (например, ХранилищеДополнительнойИнформации). Передать саму ссылку в поле картинки нельзя. Требуется обратиться к реквизиту Хранилище (имеющему тип ХранилищеЗначения) и вызвать метод Получить().
  3. Некорректная очистка картинки: если у номенклатуры нет изображения или значение не заполнено, нельзя передавать в свойство число (например, 0), строку или значение Неопределено. Для очистки отображения необходимо использовать пустой объект Новый Картинка.

Пошаговый алгоритм отображения картинки

Разберем по шагам правильную реализацию вывода изображения в обработчике события формы (например, ПриОткрытии):

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

Примеры программного кода

Посмотрим на базовый и наиболее надежный пример кода, который предотвращает возникновение ошибок:


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

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


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

Важные настройки элемента управления

Для корректного визуального отображения изображения обратите внимание на следующие свойства элемента ПолеКартинки в конфигураторе:

  1. Имя элемента: убедитесь, что имя элемента в палитре свойств точно совпадает с именем, используемым в коде (например, ПолеКартинка).
  2. РежимМасштабирования: по умолчанию большие изображения могут отображаться обрезанными. Рекомендуется установить свойство в значение АвтоМасштабирование или СохранятьПропорции, чтобы изображение аккуратно вписывалось в границы формы.
← На главную