При переносе данных из внешних систем или файлов Excel часто возникает задача наполнения карточек номенклатуры изображениями. Современные прайс-листы поставщиков редко содержат сами картинки внутри файла; чаще всего там указана прямая ссылка на веб-ресурс. Разберем подробно, как автоматизировать процесс загрузки этих изображений в 1С:Управление торговлей 11 (УТ 11), не скачивая их вручную на локальный компьютер.
Прежде всего проанализируем структуру хранения данных. В типовом решении 1С:Управление торговлей 11 изображения товаров хранятся не в самом справочнике Номенклатура, а в подчиненном справочнике НоменклатураПрисоединенныеФайлы. Это позволяет прикреплять к одному товару несколько файлов (фотографии, сертификаты, инструкции).
Рассмотрим ситуацию, когда у нас есть файл Excel, где в одной колонке указан артикул или код товара, а в другой — ссылка вида https://static.techspot.com/images/products/...jpg. Наша цель — программно пройти по строкам файла, скачать данные по ссылке и создать соответствующие записи в системе.
Иногда требуется лишь видеть картинку в карточке, не раздувая объем информационной базы. В этом случае мы можем воспользоваться советом из обсуждения и внедрить на форму ПолеHTMLДокумента. Проанализируем, как это работает:
Номенклатура строковый реквизит, в котором будет храниться ссылка на внешнее изображение.ПолеHTMLДокумента.Рассмотрим пример кода для вывода картинки:
ТекстHTML = "<html><body><img src='" + СсылкаНаКартинку + "' style='width:100%; height:auto;' /></body></html>";
Элементы.ПолеКартинкиHTML.УстановитьТекст(ТекстHTML);
Важный нюанс: этот метод работает только при наличии интернета. Если сайт-источник удалит файл или заблокирует доступ, изображение в 1С пропадет. Для надежной работы учетной системы рекомендуется физическая загрузка файла.
Выясним, как реализовать полноценную загрузку. Для этого нам понадобится объект HTTPСоединение. Основная сложность заключается в том, что большинство современных ресурсов работают по защищенному протоколу HTTPS. Следовательно, нам необходимо инициализировать защищенное соединение.
Рассмотрим по шагам процесс получения данных с сервера:
Для работы с защищенными ресурсами используем объект ЗащищенноеСоединениеOpenSSL. Это позволит избежать ошибок при обращении к https ссылкам.
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Сервер = "static.techspot.com"; // Извлекаем домен из ссылки
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);
После установки соединения нам нужно сформировать запрос к конкретному файлу. Разберем ситуацию, когда путь к файлу берется из полной ссылки.
ПутьКФайлу = "/images/products/2018/loudspeakers/org/2019-02-13-product-9.jpg";
Запрос = Новый HTTPЗапрос(ПутьКФайлу);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();
Иначе
Сообщить("Ошибка загрузки: " + Ответ.КодСостояния);
КонецЕсли;
Здесь метод ПолучитьТелоКакДвоичныеДанные() является ключевым. Он позволяет получить содержимое картинки прямо в оперативную память в виде объекта ДвоичныеДанные, минуя стадию сохранения промежуточного файла на жесткий диск пользователем.
Теперь, когда у нас есть ДвоичныеДанные, их необходимо поместить в систему хранения файлов УТ 11. В этой конфигурации используется подсистема БСП (Библиотека стандартных подсистем), поэтому создание файла лучше выполнять через встроенные механизмы, чтобы корректно заполнились все служебные реквизиты.
Проанализируем пример логики создания файла:
// Подготовка параметров для создания файла
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНаНоменклатуру);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Изображение_" + СсылкаНаНоменклатуру.Артикул);
ПараметрыФайла.Вставить("Расширение", "jpg");
// Вызов программного интерфейса БСП для создания записи
НовыйФайлСсылка = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки));
// Установка картинки как основной для номенклатуры
ОбъектНоменклатура = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатура.ФайлКартинки = НовыйФайлСсылка;
ОбъектНоменклатура.Записать();
При массовой загрузке из Excel мы можем столкнуться с рядом технических ограничений. Рассмотрим подробнее, как их обойти:
HTTPЗапрос заголовки, имитирующие реального пользователя: Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0...");.Попытка ... Исключение вокруг блока работы с сетью.WebP. Если ваша версия платформы 1С старая, она может не отобразить этот формат. В таком случае потребуется внешняя компонента для конвертации в PNG или JPG.Таким образом, мы выяснили, что загрузка картинок по ссылкам — это полностью решаемая задача. Используя объект HTTPСоединение и возможности БСП по работе с присоединенными файлами, можно автоматизировать наполнение каталога 1С:Управление торговлей 11 качественным контентом прямо из файлов поставщиков.