Как реализовать передачу ссылок на картинки из 1С через HTTP-сервис

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

При интеграции 1С со сторонними сайтами или мобильными приложениями часто возникает задача передачи изображений номенклатуры. Передача самих файлов непосредственно внутри одного массивного JSON-пакета — не всегда оптимальное решение из-за объемов данных. Разберем подробно, как правильно организовать этот процесс, какие существуют подходы и как реализовать отдачу картинок по прямым ссылкам, используя возможности 1С.

Метод 1. Передача изображений в формате Base64 внутри JSON

Проанализируем самый простой, но «тяжелый» способ. В этом случае мы считываем данные картинки из ХранилищеЗначения, преобразуем их в строку Base64 и помещаем в JSON-ответ. Этот метод подходит, если картинок немного и они имеют небольшой размер (например, иконки).

Рассмотрим пример кода для формирования такого ответа:


// Пример формирования структуры для JSON
КартинкаДвоичныеДанные = НоменклатураСсылка.ОсновноеИзображение.Хранилище.Получить();
Если КартинкаДвоичныеДанные <> Неопределено Тогда
    СтрокаBase64 = Base64Строка(КартинкаДвоичныеДанные);
КонецЕсли;

ДанныеДляОтвета = Новый Структура;
ДанныеДляОтвета.Вставить("guid", Строка(НоменклатураСсылка.УникальныйИдентификатор()));
ДанныеДляОтвета.Вставить("image_data", СтрокаBase64);

Минусы метода: увеличение объема передаваемых данных примерно на 33% и высокая нагрузка на память сервера при обработке больших массивов товаров.

Метод 2. Динамическая отдача картинок через отдельный GET-запрос

Выясним, как реализовать наиболее архитектурно правильный подход. Вместо того чтобы передавать сами данные, мы передаем в JSON ссылку на наш собственный HTTP-сервис 1С. Сайт получает список ссылок, а браузер пользователя скачивает картинки по мере необходимости.

Разберем реализацию этого механизма по шагам:

  1. Создадим в 1С HTTP-сервис (например, ImageService) с шаблоном URL /get_image/{guid}.
  2. В методе GET напишем код, который находит картинку по идентификатору и возвращает её как поток двоичных данных.

Проанализируем программную логику этого метода:


Функция ПолучитьКартинкуGET(Запрос)
    
    GUIDКартинки = Запрос.ПараметрыURL.Получить("guid");
    // Логика поиска картинки в базе по GUID
    СсылкаНаФайл = Справочники.НоменклатураПрисоединенныеФайлы.ПолучитьСсылку(Новый УникальныйИдентификатор(GUIDКартинки));
    
    Если СсылкаНаФайл.Пустая() Тогда
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;
    
    ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
    
    Ответ = Новый HTTPСервисОтвет(200);
    // Критически важный момент: установка MIME-типа
    Ответ.Заголовки.Вставить("Content-Type", "image/jpeg");
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
    
    Возврат Ответ;
    
КонецФункции

В основном JSON-ответе, который запрашивает сайт, ссылки будут выглядеть так: http://myserver/base/hs/ImageService/get_image/идентификатор-картинки. Браузер поймет это как обычный путь к файлу изображения. Для отладки и проверки работы созданных GET-запросов можно воспользоваться обработкой для тестирования HTTP-сервисов.

Метод 3. Предварительная выгрузка на веб-сервер

Рассмотрим ситуацию, когда нагрузка на сайт очень велика. Постоянные обращения к базе 1С за картинками могут замедлить работу системы. В этом случае эффективным решением будет выгрузка файлов на диск в каталог веб-сервера (например, Apache или Nginx).

Проанализируем алгоритм действий:

Этот способ позволяет сайту отдавать картинки максимально быстро, не задействуя лицензии и рабочие процессы 1С при каждом просмотре товара пользователем.

Метод 4. Использование стандартного интерфейса OData

Посмотрим на встроенные возможности платформы 1С. Если в базе включен автоматический REST-интерфейс (OData), нам даже не нужно писать свой HTTP-сервис для получения картинок. К данным ХранилищаЗначений можно обратиться напрямую. Для быстрого составления и проверки таких адресов можно использовать генератор запросов OData.

Пример ссылки для получения значения ресурса через OData:

http://server/base/odata/standard.odata/Catalog_Номенклатура(guid'XXX')/ДанныеФайла/$value

Важные технические нюансы и рекомендации

При работе с HTTP-сервисами и передачей медиаданных важно учитывать следующие моменты:

1. Заголовки (Headers): Всегда устанавливайте правильный Content-Type (image/png, image/jpeg, image/gif). Без этого браузер или стороннее приложение не смогут корректно интерпретировать поток байтов.

2. Кэширование: Чтобы снизить нагрузку на 1С, рекомендуется использовать Nginx в качестве обратного прокси. Настройте кэширование ответов от 1С, чтобы при повторном запросе одной и той же картинки Nginx отдавал её из своего временного хранилища.

3. Подготовка изображений: Часто в 1С хранятся оригиналы фотографий высокого разрешения. Передавать их на сайт «как есть» — плохая практика. Перед отправкой двоичных данных через HTTP-сервис используем объект Картинка для изменения размера (Thumbnailing). Разберем пример сжатия:


// Пример изменения размера картинки перед отправкой
ИсходнаяКартинка = Новый Картинка(ДвоичныеДанные);
ОбработаннаяКартинка = ИсходнаяКартинка.Преобразовать(ФорматКартинки.JPEG, 300, 300); // Размер 300x300
ДвоичныеДанныеДляОтвета = ОбработаннаяКартинка.ПолучитьДвоичныеДанные();

4. Безопасность: Если картинки являются конфиденциальными, добавьте в параметры запроса временный токен безопасности (Access Token), который 1С будет проверять перед отдачей файла.

Таким образом, мы выяснили, что передача ссылок — это наиболее гибкий и масштабируемый подход. Комбинируя динамическую отдачу через HTTPСервисОтвет и кэширование на стороне веб-сервера, можно создать надежную систему взаимодействия 1С с любым внешним сайтом.

← На главную