В современных реалиях автоматизации бизнеса интеграция 1С с интернет-магазинами является одной из приоритетных задач. Одной из самых частых подзадач в этом процессе становится передача визуального контента, а именно — картинок товаров. В конфигурации 1С:Управление торговлей 11 (УТ 11) механизм работы с изображениями существенно отличается от предыдущих версий (например, 10.3), что часто вызывает вопросы у разработчиков. В этой статье мы подробно разберем, как устроено хранение файлов в УТ 11 и какими способами можно реализовать их отправку на сайт.
Прежде чем приступать к коду, давайте разберем, где физически находятся картинки. В отличие от старых конфигураций, в УТ 11 изображения не хранятся в реквизитах самого справочника Номенклатура. Для этих целей используется механизм присоединенных файлов. Проанализируем основные моменты:
ПрисоединенныеФайлы (Номенклатура).Номенклатура есть реквизит ФайлКартинки, который ссылается на «Основное» изображение. Это важно, так как именно эту картинку чаще всего нужно выгружать как главную.ХранилищеЗначения), либо на диске в специально настроенных томах хранения файлов.Для программного доступа к данным файла нам не нужно писать сложные запросы к таблицам хранения. Мы будем использовать типовой метод ПрисоединенныеФайлы.ПолучитьДанныеФайла(), который корректно извлечет данные вне зависимости от того, где они лежат — в базе или в томах на диске.
Рассмотрим наиболее простой путь, который не требует написания кода. Конфигурация УТ 11 «из коробки» поддерживает стандарт обмена CommerceML. Если ваш сайт построен на популярной CMS (Bitrix, UMI, Shop-Script), этот метод будет оптимальным.
Разберем процесс настройки по шагам:
При запуске такого обмена 1С автоматически сформирует файл import.xml со структурой товаров, а все картинки будут помещены в подкаталог webdata. Система сама позаботится об извлечении файлов и их правильном именовании. Это самый надежный способ, если архитектура сайта позволяет принимать данные в формате XML.
Если нам нужно реализовать нестандартную выгрузку (например, через API сайта), первым шагом всегда будет получение двоичных данных из 1С и сохранение их во временный файл на сервере или клиенте. Рассмотрим пример кода, который получает основную картинку номенклатуры:
// Получаем ссылку на основную картинку из номенклатуры
СсылкаНаФайл = СсылкаНаНоменклатуру.ФайлКартинки;
Если НЕ СсылкаНаФайл.Пустая() Тогда
// Получаем структуру с данными файла
ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(СсылкаНаФайл);
Если ДанныеФайла <> Неопределено Тогда
// Получаем двоичные данные
ДвоичныеДанные = ДанныеФайла.Данные;
// Формируем путь для временного сохранения
ИмяФайла = ПолучитьИмяВременногоФайла(ДанныеФайла.Расширение);
ДвоичныеДанные.Записать(ИмяФайла);
// Теперь файл готов к отправке (например, через HTTP или FTP)
КонецЕсли;
КонецЕсли;
В этом примере мы используем объект ДвоичныеДанные и его метод Записать. Это базовый шаг для любого сценария кастомной передачи данных.
Современные сайты часто требуют передачи данных через HTTP POST запросы. В этом случае данные могут передаваться либо как Multipart/form-data, либо в формате Base64 внутри JSON-пакета. Выясним, как реализовать отправку через HTTPСоединение.
Проанализируем пример подготовки запроса с использованием Base64:
// Преобразуем двоичные данные картинки в строку Base64
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
// Формируем структуру JSON для отправки
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("product_id", "12345");
СтруктураДанных.Вставить("image_data", СтрокаBase64);
СтруктураДанных.Вставить("file_name", "product_image.jpg");
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Настраиваем HTTP-соединение
НТТР = Новый HTTPСоединение("api.mysite.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/upload_image");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
// Отправляем
Ответ = НТТР.ОтправитьДляОбработки(Запрос);
Важный нюанс: при передаче больших изображений через Base64 объем данных увеличивается примерно на 33%. Если картинок много и они «тяжелые», лучше использовать формат Multipart или передавать файл напрямую в теле запроса, указав соответствующий Content-Type (например, image/jpeg).
Если сайт не имеет развитого API, но предоставляет доступ к файловой системе через FTP, мы можем использовать объект ФТПСоединение. Это классический и довольно надежный способ. Разберем алгоритм:
Попытка
СоединениеFTP = Новый ФТПСоединение("ftp.mysite.ru", 21, "user", "password");
СоединениеFTP.УстановитьТекущийКаталог("/www/images/products/");
СоединениеFTP.Записать(ПутьКВременномуФайлу, "product_123.jpg");
Исключение
Сообщить("Ошибка при передаче по FTP: " + ОписаниеОшибки());
КонецПопытки;
Часто фотографии, хранящиеся в 1С, имеют избыточное разрешение (например, прямо с зеркального фотоаппарата), что недопустимо для веб-страниц. Перед отправкой рекомендуется оптимизировать изображение. В платформе 8.3 для этого есть встроенные инструменты.
Рассмотрим, как уменьшить размер картинки программно:
// Предположим, у нас есть объект Картинка
КартинкаОригинал = Новый Картинка(ПутьКФайлу);
// Если картинка слишком большая, преобразуем её
// Параметры: Ширина, Высота, Формат, Качество
КартинкаСжатая = КартинкаОригинал.Преобразовать(ФорматКартинки.JPEG, 800, 600);
// Сохраняем оптимизированную версию
КартинкаСжатая.Записать(ПутьКФайлуОптимизированному);
Использование метода Преобразовать() позволяет значительно сэкономить трафик и место на сервере сайта, а также ускорить загрузку страниц у конечных пользователей.
Мы рассмотрели основные способы передачи изображений из УТ 11 на сайт. Выбор конкретного метода зависит от технических возможностей вашего веб-ресурса. Для стандартных интернет-магазинов лучше всего подходит типовой обмен по протоколу CommerceML. Для уникальных проектов и мобильных приложений идеально подойдет использование HTTPСоединение с передачей данных в формате JSON/Base64 или Multipart. Не забывайте про оптимизацию размера изображений, чтобы ваш сайт работал быстро и эффективно.