При интеграции 1С со сторонними сайтами или мобильными приложениями часто возникает задача передачи изображений номенклатуры. Передача самих файлов непосредственно внутри одного массивного JSON-пакета — не всегда оптимальное решение из-за объемов данных. Разберем подробно, как правильно организовать этот процесс, какие существуют подходы и как реализовать отдачу картинок по прямым ссылкам, используя возможности 1С.
Проанализируем самый простой, но «тяжелый» способ. В этом случае мы считываем данные картинки из ХранилищеЗначения, преобразуем их в строку Base64 и помещаем в JSON-ответ. Этот метод подходит, если картинок немного и они имеют небольшой размер (например, иконки).
Рассмотрим пример кода для формирования такого ответа:
// Пример формирования структуры для JSON
КартинкаДвоичныеДанные = НоменклатураСсылка.ОсновноеИзображение.Хранилище.Получить();
Если КартинкаДвоичныеДанные <> Неопределено Тогда
СтрокаBase64 = Base64Строка(КартинкаДвоичныеДанные);
КонецЕсли;
ДанныеДляОтвета = Новый Структура;
ДанныеДляОтвета.Вставить("guid", Строка(НоменклатураСсылка.УникальныйИдентификатор()));
ДанныеДляОтвета.Вставить("image_data", СтрокаBase64);
Минусы метода: увеличение объема передаваемых данных примерно на 33% и высокая нагрузка на память сервера при обработке больших массивов товаров.
Выясним, как реализовать наиболее архитектурно правильный подход. Вместо того чтобы передавать сами данные, мы передаем в JSON ссылку на наш собственный HTTP-сервис 1С. Сайт получает список ссылок, а браузер пользователя скачивает картинки по мере необходимости.
Разберем реализацию этого механизма по шагам:
ImageService) с шаблоном URL /get_image/{guid}.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-сервисов.
Рассмотрим ситуацию, когда нагрузка на сайт очень велика. Постоянные обращения к базе 1С за картинками могут замедлить работу системы. В этом случае эффективным решением будет выгрузка файлов на диск в каталог веб-сервера (например, Apache или Nginx).
Проанализируем алгоритм действий:
{GUID}.jpg.Этот способ позволяет сайту отдавать картинки максимально быстро, не задействуя лицензии и рабочие процессы 1С при каждом просмотре товара пользователем.
Посмотрим на встроенные возможности платформы 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С с любым внешним сайтом.