Как отправить изображения номенклатуры из 1С:Управление торговлей 11 на сайт?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

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

Понимание архитектуры хранения изображений в УТ 11

Прежде чем приступать к коду, давайте разберем, где физически находятся картинки. В отличие от старых конфигураций, в УТ 11 изображения не хранятся в реквизитах самого справочника Номенклатура. Для этих целей используется механизм присоединенных файлов. Проанализируем основные моменты:

  1. Все изображения товаров регистрируются в подчиненном справочнике ПрисоединенныеФайлы (Номенклатура).
  2. В самом справочнике Номенклатура есть реквизит ФайлКартинки, который ссылается на «Основное» изображение. Это важно, так как именно эту картинку чаще всего нужно выгружать как главную.
  3. Сами двоичные данные (бинарный код картинки) могут храниться либо в базе данных (в ХранилищеЗначения), либо на диске в специально настроенных томах хранения файлов.

Для программного доступа к данным файла нам не нужно писать сложные запросы к таблицам хранения. Мы будем использовать типовой метод ПрисоединенныеФайлы.ПолучитьДанныеФайла(), который корректно извлечет данные вне зависимости от того, где они лежат — в базе или в томах на диске.

Вариант 1: Использование типового обмена (CommerceML)

Рассмотрим наиболее простой путь, который не требует написания кода. Конфигурация УТ 11 «из коробки» поддерживает стандарт обмена CommerceML. Если ваш сайт построен на популярной CMS (Bitrix, UMI, Shop-Script), этот метод будет оптимальным.

Разберем процесс настройки по шагам:

  1. Перейдем в раздел Администрирование — Настройка интеграции — Обмен с сайтом.
  2. Создадим новый узел обмена и укажем адрес скрипта на стороне сайта.
  3. В настройках состава выгружаемых данных обязательно проверим наличие галочки «Выгружать изображения».

При запуске такого обмена 1С автоматически сформирует файл import.xml со структурой товаров, а все картинки будут помещены в подкаталог webdata. Система сама позаботится об извлечении файлов и их правильном именовании. Это самый надежный способ, если архитектура сайта позволяет принимать данные в формате XML.

Вариант 2: Программное извлечение и сохранение картинки во временный файл

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


// Получаем ссылку на основную картинку из номенклатуры
СсылкаНаФайл = СсылкаНаНоменклатуру.ФайлКартинки;

Если НЕ СсылкаНаФайл.Пустая() Тогда
    // Получаем структуру с данными файла
    ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(СсылкаНаФайл);
    
    Если ДанныеФайла <> Неопределено Тогда
        // Получаем двоичные данные
        ДвоичныеДанные = ДанныеФайла.Данные;
        
        // Формируем путь для временного сохранения
        ИмяФайла = ПолучитьИмяВременногоФайла(ДанныеФайла.Расширение);
        ДвоичныеДанные.Записать(ИмяФайла);
        
        // Теперь файл готов к отправке (например, через HTTP или FTP)
    КонецЕсли;
КонецЕсли;

В этом примере мы используем объект ДвоичныеДанные и его метод Записать. Это базовый шаг для любого сценария кастомной передачи данных.

Вариант 3: Передача изображения на сайт через HTTP-запросы (REST API)

Современные сайты часто требуют передачи данных через 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).

Вариант 4: Передача файлов по протоколу FTP

Если сайт не имеет развитого API, но предоставляет доступ к файловой системе через FTP, мы можем использовать объект ФТПСоединение. Это классический и довольно надежный способ. Разберем алгоритм:

  1. Извлекаем картинку из 1С и записываем во временный файл (как мы делали во 2-м варианте).
  2. Устанавливаем соединение с сервером.
  3. Записываем файл в нужную директорию сайта.

Попытка
    Соединение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. Не забывайте про оптимизацию размера изображений, чтобы ваш сайт работал быстро и эффективно.

← На главную