В процессе разработки интеграций (например, переноса данных из МойСклад) или автоматической загрузки данных из внешних систем (маркетплейсов, интернет-магазинов) программисты часто сталкиваются с задачей программного заполнения карточки номенклатуры изображениями. В конфигурации 1С:Управление нашей фирмой (УНФ), которая построена на базе Библиотеки стандартных подсистем (БСП), этот процесс имеет свои нюансы. Простого создания элемента в справочнике присоединенных файлов часто недостаточно для того, чтобы картинка корректно отобразилась в пользовательском интерфейсе.
В данной статье мы подробно разберем, как правильно реализовать этот механизм, проанализируем типичные ошибки и рассмотрим корректный алгоритм работы с двоичными данными изображений.
Проанализируем ситуацию, описанную в сообщениях форума. Часто разработчики пытаются создать элемент справочника НоменклатураПрисоединенныеФайлы вручную, заполняя его реквизиты (Наименование, ФайлХранилище и т.д.), и затем присваивают ссылку на этот элемент реквизиту ФайлКартинки в объекте Номенклатура. Однако в современных конфигурациях механизмы отображения картинок завязаны на внутренние кэши и специфические поля БСП.
Основные причины проблем:
ХранилищеЗначения вместо вызова высокоуровневых процедур БСП по добавлению файлов.Для того чтобы картинка гарантированно появилась в карточке номенклатуры, мы должны придерживаться строгого порядка действий. Рассмотрим его по шагам.
Шаг 1. Создание и первичная запись номенклатуры
Прежде чем добавлять файл, нам необходимо убедиться, что у объекта Номенклатура есть ссылка. Если мы создаем новый товар, его нужно сначала записать.
Шаг 2. Получение двоичных данных изображения
Мы можем получить данные из интернета (через HTTPСоединение или поиск в браузере) или из локального диска. Результатом должен быть объект ДвоичныеДанные.
Шаг 3. Добавление файла в систему
Вместо ручного создания элемента справочника НоменклатураПрисоединенныеФайлы, рекомендуется использовать возможности программного интерфейса БСП, в частности метод ПрисоединенныеФайлы.ДобавитьФайл(). Это позволит системе автоматически обработать тип хранения (в базе или в томах на диске) и создать необходимые записи в служебных таблицах.
Шаг 4. Привязка файла к реквизиту «ФайлКартинки»
После создания присоединенного файла его ссылку нужно передать в основной объект Номенклатура и повторно его записать.
Проанализируем пример кода, который объединяет получение картинки по URL и её корректную привязку к карточке товара. Выясним причину, почему в исходном коде автора картинка могла не отображаться.
// Функция загружает картинку и возвращает ссылку на присоединенный файл
Функция ДобавитьКартинкуНоменклатуры(ОбъектНоменклатура, СсылкаНаКартинку) Экспорт
// 1. Получаем данные из сети
Попытка
Соединение = Новый HTTPСоединение("example.com"); // Здесь должен быть ваш домен
Запрос = Новый HTTPЗапрос(СсылкаНаКартинку);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Возврат Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
КонецЕсли;
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
Исключение
Возврат Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
КонецПопытки;
// 2. Подготовка параметров для БСП
// Нам нужно имя файла и расширение без точки
ИмяФайла = "image_nomenclature.jpg";
Расширение = "jpg";
// 3. Создание элемента в справочнике присоединенных файлов
// Если мы хотим использовать типовой механизм УНФ:
НовыйФайлОбъект = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
НовыйФайлОбъект.ВладелецФайла = ОбъектНоменклатура.Ссылка;
НовыйФайлОбъект.Наименование = "Основное изображение";
НовыйФайлОбъект.Автор = Пользователи.ТекущийПользователь();
НовыйФайлОбъект.ДатаСоздания = ТекущаяДата();
НовыйФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
НовыйФайлОбъект.Расширение = Расширение;
// Важно: записываем данные именно в реквизит ФайлХранилище через ХранилищеЗначения
НовыйФайлОбъект.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные);
НовыйФайлОбъект.Записать();
Возврат НовыйФайлОбъект.Ссылка;
КонецФункции
// Основная процедура создания номенклатуры
Процедура СоздатьТоварСКартинкой()
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = "Чайник электрический";
// ... заполнение других реквизитов ...
// Обязательно записываем ПЕРЕД добавлением файла
НоваяНоменклатура.Записать();
// Получаем ссылку на созданный файл
СсылкаНаФайл = ДобавитьКартинкуНоменклатуры(НоваяНоменклатура, "/images/item123.jpg");
Если Не СсылкаНаФайл.Пустая() Тогда
// Привязываем файл к реквизиту ФайлКартинки
НоваяНоменклатура.ФайлКартинки = СсылкаНаФайл;
НоваяНоменклатура.Записать();
КонецЕсли;
КонецПроцедуры
При работе с файлами в 1С:УНФ следует обратить внимание на следующие технические детали:
".jpg" вместо "jpg". БСП часто использует строковые функции поиска, и наличие лишней точки может привести к тому, что система не сможет определить тип контента и не сгенерирует превью (миниатюру).ФайлХранилище может быть проигнорирована или привести к ошибкам. В таких случаях обязательно используйте метод ПрисоединенныеФайлы.ДобавитьФайл() из состава БСП, который самостоятельно определит, куда положить байты.НоменклатураПрисоединенныеФайлы.Используя приведенную выше методику, мы обеспечиваем корректную работу всех механизмов конфигурации, включая отображение иконок в списках, превью в карточке и выгрузку картинок в печатные формы или на сайт. Совместное использование прямой записи и методов БСП позволяет гибко управлять процессом загрузки данных.