Как реализовать автоматический поиск и загрузку первой картинки товара из интернета в 1С:Управление торговлей 10.3

Программист Торговля и дистрибуция
← На главную

В процессе автоматизации работы с каталогом товаров в 1С:Управление торговлей 10.3 часто возникает задача оперативного наполнения базы визуальным контентом. Ручной поиск каждой фотографии занимает много времени, поэтому создание механизма, который по нажатию одной кнопки находит, скачивает и привязывает изображение к номенклатуре, является крайне востребованным. Разберем подробно, как реализовать такой функционал, используя современные программные интерфейсы (API).

Почему не стоит «парсить» страницу поиска напрямую

Первое, что приходит в голову многим разработчикам — это программно открыть страницу поиска Google или Яндекс, получить ее HTML-код и попытаться «вытащить» оттуда ссылку на картинку. Проанализируем, почему этот путь тупиковый. Поисковые системы активно борются с роботами: как только ваш сервер 1С начнет делать частые запросы, поисковик выдаст «капчу» или просто заблокирует ваш IP-адрес. Кроме того, структура HTML-кода поисковой выдачи постоянно меняется. Поэтому мы рассмотрим профессиональный подход — использование Google Custom Search API.

Шаг 1: Подготовка инфраструктуры поиска

Для начала работы нам необходимо получить доступ к поисковому движку Google как разработчикам. Выполним следующие действия:

  1. Регистрируем аккаунт в Google Cloud Console.
  2. Создаем новый проект и подключаем к нему Custom Search API.
  3. Получаем уникальный ключ доступа (API Key).
  4. Создаем собственную поисковую систему (Search Engine ID или cx) в панели Custom Search Engine. В настройках обязательно включаем опцию «Поиск картинок» (Image Search).

Важно: Google предоставляет 100 бесплатных запросов в день. Если ваша номенклатура насчитывает тысячи позиций, которые нужно обработать разово, придется либо растянуть процесс на несколько дней, либо оплатить дополнительные запросы.

Шаг 2: Формирование поискового запроса в 1С

Выясним, как правильно составить URL для запроса. Нам нужно передать поисковой фразе (например, артикул + наименование) правильный формат, чтобы API понял наши намерения. Проанализируем структуру строки запроса:

https://www.googleapis.com/customsearch/v1?q={ТекстПоиска}&key={ВашКлюч}&cx={ВашID}&searchType=image&fileType=jpg&imgSize=medium

Рассмотрим реализацию формирования этого запроса на языке 1С. Нам понадобится функция КодироватьСтроку, так как в названии товара могут быть пробелы и спецсимволы, недопустимые в URL.


Функция СформироватьСсылкуЗапроса(ТоварНаименование, Артикул)
    ТекстПоиска = Артикул + " " + ТоварНаименование;
    // Кодируем строку для URL (заменяем пробелы на %20 и т.д.)
    ЗапросТекст = КодироватьСтроку(ТекстПоиска, СпособКодированияСтроки.КодированиеURL);
    
    КлючAPI = "ВАШ_КЛЮЧ";
    ИдентификаторCX = "ВАШ_CX";
    
    URL = "https://www.googleapis.com/customsearch/v1?q=" + ЗапросТекст 
        + "&key=" + КлючAPI 
        + "&cx=" + ИдентификаторCX 
        + "&searchType=image&fields=items(link)&num=1"; // Нам нужна только 1 первая картинка
        
    Возврат URL;
КонецФункции

Шаг 3: Выполнение HTTP-запроса и получение JSON

Теперь разберем, как отправить этот запрос из 1С. Мы будем использовать объект HTTPСоединение. Поскольку Google работает через защищенный протокол, нам потребуется настроить ЗащищенноеСоединениеOpenSSL.


// Выполняем запрос к Google API
Соединение = Новый HTTPСоединение("www.googleapis.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/customsearch/v1?q=" + ЗапросТекст + "&key=" + КлючAPI + "&cx=" + ИдентификаторCX + "&searchType=image&fields=items(link)&num=1");

Попытка
    Ответ = Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Разбираем JSON
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
        Данные = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        Если Данные.Свойство("items") И Данные.items.Количество() > 0 Тогда
            ПрямаяСсылкаНаКартинку = Данные.items[0].link;
        КонецЕсли;
    КонецЕсли;
Исключение
    Сообщить("Ошибка при обращении к Google API: " + ОписаниеОшибки());
КонецПопытки;

Шаг 4: Загрузка изображения во временный файл

Получив прямую ссылку на изображение (например, https://example.com/photo.jpg), нам нужно скачать сам файл. Обратите внимание, что сервер, на котором лежит картинка, может отличаться от сервера Google. Поэтому нам нужно проанализировать URL, выделить имя сервера и путь к файлу.


// Функция скачивания файла
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("jpg");
// Здесь нужно распарсить ПрямаяСсылкаНаКартинку на Сервер и Путь
// Для упрощения приведем логику получения:
СоединениеКартинка = Новый HTTPСоединение(СерверИсточник, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
ЗапросКартинка = Новый HTTPЗапрос(ПутьКФайлу);
ОтветКартинка = СоединениеКартинка.Получить(ЗапросКартинка);

Если ОтветКартинка.КодСостояния = 200 Тогда
    ОтветКартинка.ЗаписатьТелоВФайл(ИмяФайлаКартинки);
КонецЕсли;

Шаг 5: Сохранение картинки в базе УТ 10.3

В конфигурации «Управление торговлей 10.3» изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Нам нужно создать новый элемент этого справочника, загрузить в него файл и установить ссылку на этот элемент в карточке номенклатуры.

Рассмотрим по шагам этот процесс:

  1. Создаем объект Картинка из скачанного файла.
  2. Проверяем, не слишком ли она большая (опционально можно программно сжать изображение).
  3. Создаем элемент справочника ХранилищеДополнительнойИнформации.
  4. Указываем Владелец — нашу номенклатуру.
  5. Записываем данные в реквизит Хранилище (тип ХранилищеЗначения).

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

// Обновляем саму номенклатуру, чтобы картинка стала основной
ОбъектНоменклатура = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатура.ОсновноеИзображение = ЭлементХранилища.Ссылка;
ОбъектНоменклатура.Записать();

Советы по оптимизации поиска

Чтобы «первая попавшаяся» картинка была максимально релевантной, проанализируем поисковый запрос. Рекомендуется:

Выясним также юридический аспект: автоматическая загрузка изображений может нарушать авторские права. Для коммерческих проектов рекомендуется в настройках Google Custom Search выставлять фильтры по типу лицензии (например, Creative Commons), чтобы использовать только разрешенные к копированию материалы.

Таким образом, мы построили надежный мост между базой 1С и глобальным поиском Google, превратив рутинную работу контент-менеджера в автоматизированный процесс.

← На главную