Как программно сохранить и отобразить картинку номенклатуры в 1С:УНФ

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

В процессе разработки интеграций (например, переноса данных из МойСклад) или автоматической загрузки данных из внешних систем (маркетплейсов, интернет-магазинов) программисты часто сталкиваются с задачей программного заполнения карточки номенклатуры изображениями. В конфигурации 1С:Управление нашей фирмой (УНФ), которая построена на базе Библиотеки стандартных подсистем (БСП), этот процесс имеет свои нюансы. Простого создания элемента в справочнике присоединенных файлов часто недостаточно для того, чтобы картинка корректно отобразилась в пользовательском интерфейсе.

В данной статье мы подробно разберем, как правильно реализовать этот механизм, проанализируем типичные ошибки и рассмотрим корректный алгоритм работы с двоичными данными изображений.

Почему стандартный подход с «ручным» созданием элемента может не работать?

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

Основные причины проблем:

  1. Отсутствие ссылки на владельца: Нельзя привязать файл к новой номенклатуре, пока сама номенклатура не записана в базу и не получила уникальный идентификатор (ссылку).
  2. Неправильный формат расширения: БСП чувствительна к формату хранения расширения (например, наличие или отсутствие точки).
  3. Игнорирование типовых методов: Использование низкоуровневой записи в ХранилищеЗначения вместо вызова высокоуровневых процедур БСП по добавлению файлов.

Разберем алгоритм правильного сохранения картинки

Для того чтобы картинка гарантированно появилась в карточке номенклатуры, мы должны придерживаться строгого порядка действий. Рассмотрим его по шагам.

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

Шаг 2. Получение двоичных данных изображения
Мы можем получить данные из интернета (через HTTPСоединение или поиск в браузере) или из локального диска. Результатом должен быть объект ДвоичныеДанные.

Шаг 3. Добавление файла в систему
Вместо ручного создания элемента справочника НоменклатураПрисоединенныеФайлы, рекомендуется использовать возможности программного интерфейса БСП, в частности метод ПрисоединенныеФайлы.ДобавитьФайл(). Это позволит системе автоматически обработать тип хранения (в базе или в томах на диске) и создать необходимые записи в служебных таблицах.

Шаг 4. Привязка файла к реквизиту «ФайлКартинки»
После создания присоединенного файла его ссылку нужно передать в основной объект Номенклатура и повторно его записать.

Пример программной реализации

Проанализируем пример кода, который объединяет получение картинки по URL и её корректную привязку к карточке товара. Выясним причину, почему в исходном коде автора картинка могла не отображаться.


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

    // 2. Подготовка параметров для БСП
    // Нам нужно имя файла и расширение без точки
    ИмяФайла = "image_nomenclature.jpg";
    Расширение = "jpg";
    
    // 3. Создание элемента в справочнике присоединенных файлов
    // Если мы хотим использовать типовой механизм УНФ:
    НовыйФайлОбъект = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
    НовыйФайлОбъект.ВладелецФайла = ОбъектНоменклатура.Ссылка;
    НовыйФайлОбъект.Наименование   = "Основное изображение";
    НовыйФайлОбъект.Автор          = Пользователи.ТекущийПользователь();
    НовыйФайлОбъект.ДатаСоздания   = ТекущаяДата();
    НовыйФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
    НовыйФайлОбъект.Расширение     = Расширение;
    
    // Важно: записываем данные именно в реквизит ФайлХранилище через ХранилищеЗначения
    НовыйФайлОбъект.ФайлХранилище  = Новый ХранилищеЗначения(ДвоичныеДанные);
    НовыйФайлОбъект.Записать();
    
    Возврат НовыйФайлОбъект.Ссылка;

КонецФункции

// Основная процедура создания номенклатуры
Процедура СоздатьТоварСКартинкой()
    
    НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
    НоваяНоменклатура.Наименование = "Чайник электрический";
    // ... заполнение других реквизитов ...
    
    // Обязательно записываем ПЕРЕД добавлением файла
    НоваяНоменклатура.Записать();
    
    // Получаем ссылку на созданный файл
    СсылкаНаФайл = ДобавитьКартинкуНоменклатуры(НоваяНоменклатура, "/images/item123.jpg");
    
    Если Не СсылкаНаФайл.Пустая() Тогда
        // Привязываем файл к реквизиту ФайлКартинки
        НоваяНоменклатура.ФайлКартинки = СсылкаНаФайл;
        НоваяНоменклатура.Записать();
    КонецЕсли;
    
КонецПроцедуры

Важные нюансы и рекомендации

При работе с файлами в 1С:УНФ следует обратить внимание на следующие технические детали:

  1. Реквизит «Расширение»: Проанализируем типичную ошибку: запись расширения как ".jpg" вместо "jpg". БСП часто использует строковые функции поиска, и наличие лишней точки может привести к тому, что система не сможет определить тип контента и не сгенерирует превью (миниатюру).
  2. Тип хранения: Если в вашей базе настроено хранение файлов в томах на диске, прямая запись в ФайлХранилище может быть проигнорирована или привести к ошибкам. В таких случаях обязательно используйте метод ПрисоединенныеФайлы.ДобавитьФайл() из состава БСП, который самостоятельно определит, куда положить байты.
  3. Обновление кэша: В некоторых случаях после программного добавления картинка не видна в открытой форме. Это связано с кэшированием на стороне клиента. После выполнения кода пользователю может потребоваться переоткрыть карточку или нажать кнопку «Обновить».
  4. Права доступа: Убедитесь, что у пользователя, под которым работает регламентное задание или внешняя обработка, достаточно прав на создание записей в справочнике НоменклатураПрисоединенныеФайлы.

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

← На главную