В процессе автоматизации работы с каталогом товаров в 1С:Управление торговлей 10.3 часто возникает задача оперативного наполнения базы визуальным контентом. Ручной поиск каждой фотографии занимает много времени, поэтому создание механизма, который по нажатию одной кнопки находит, скачивает и привязывает изображение к номенклатуре, является крайне востребованным. Разберем подробно, как реализовать такой функционал, используя современные программные интерфейсы (API).
Первое, что приходит в голову многим разработчикам — это программно открыть страницу поиска Google или Яндекс, получить ее HTML-код и попытаться «вытащить» оттуда ссылку на картинку. Проанализируем, почему этот путь тупиковый. Поисковые системы активно борются с роботами: как только ваш сервер 1С начнет делать частые запросы, поисковик выдаст «капчу» или просто заблокирует ваш IP-адрес. Кроме того, структура HTML-кода поисковой выдачи постоянно меняется. Поэтому мы рассмотрим профессиональный подход — использование Google Custom Search API.
Для начала работы нам необходимо получить доступ к поисковому движку Google как разработчикам. Выполним следующие действия:
cx) в панели Custom Search Engine. В настройках обязательно включаем опцию «Поиск картинок» (Image Search).Важно: Google предоставляет 100 бесплатных запросов в день. Если ваша номенклатура насчитывает тысячи позиций, которые нужно обработать разово, придется либо растянуть процесс на несколько дней, либо оплатить дополнительные запросы.
Выясним, как правильно составить 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;
КонецФункции
Теперь разберем, как отправить этот запрос из 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: " + ОписаниеОшибки());
КонецПопытки;
Получив прямую ссылку на изображение (например, https://example.com/photo.jpg), нам нужно скачать сам файл. Обратите внимание, что сервер, на котором лежит картинка, может отличаться от сервера Google. Поэтому нам нужно проанализировать URL, выделить имя сервера и путь к файлу.
// Функция скачивания файла
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("jpg");
// Здесь нужно распарсить ПрямаяСсылкаНаКартинку на Сервер и Путь
// Для упрощения приведем логику получения:
СоединениеКартинка = Новый HTTPСоединение(СерверИсточник, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
ЗапросКартинка = Новый HTTPЗапрос(ПутьКФайлу);
ОтветКартинка = СоединениеКартинка.Получить(ЗапросКартинка);
Если ОтветКартинка.КодСостояния = 200 Тогда
ОтветКартинка.ЗаписатьТелоВФайл(ИмяФайлаКартинки);
КонецЕсли;
В конфигурации «Управление торговлей 10.3» изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Нам нужно создать новый элемент этого справочника, загрузить в него файл и установить ссылку на этот элемент в карточке номенклатуры.
Рассмотрим по шагам этот процесс:
Картинка из скачанного файла.ХранилищеДополнительнойИнформации.Владелец — нашу номенклатуру.Хранилище (тип ХранилищеЗначения).
НоваяКартинка = Новый Картинка(ИмяФайлаКартинки);
ЭлементХранилища = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
ЭлементХранилища.Наименование = "Основное изображение (авто)";
ЭлементХранилища.Объект = СсылкаНаНоменклатуру;
ЭлементХранилища.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
ЭлементХранилища.Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных(9));
ЭлементХранилища.Записать();
// Обновляем саму номенклатуру, чтобы картинка стала основной
ОбъектНоменклатура = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатура.ОсновноеИзображение = ЭлементХранилища.Ссылка;
ОбъектНоменклатура.Записать();
Чтобы «первая попавшаяся» картинка была максимально релевантной, проанализируем поисковый запрос. Рекомендуется:
Выясним также юридический аспект: автоматическая загрузка изображений может нарушать авторские права. Для коммерческих проектов рекомендуется в настройках Google Custom Search выставлять фильтры по типу лицензии (например, Creative Commons), чтобы использовать только разрешенные к копированию материалы.
Таким образом, мы построили надежный мост между базой 1С и глобальным поиском Google, превратив рутинную работу контент-менеджера в автоматизированный процесс.