В случаях, когда необходим доступ к медиа-контенту с витрины используется стороннее хранилище данных. В качестве хранилища может использоваться сетевой каталог, S3 или CDN-решение. По сути это аналог хранилища двоичных данных с высокими требованиями доступности и скорости. Почему бы решению на 1С не использовать те же хранилища, если они удовлетворяют требования таких высоконагруженных систем как витрины: сайты, мобильные приложения.
Повлияет ли на скорость работы подход основанный на использовании стороннего хранилища? Да, может, но тут опять же апелляция к требованиям со стороны витрин, а так же оценке влияния в каждом конкретном случае.
Механика вывода картинок в динамическом списке основана на всем известном приеме: поместить двоичные данные во временное хранилище , получить адрес, сохранить адрес в строковый реквизит, который на форме отображается как поле картинки.
Предположим, у нас есть справочник с данными. В реквизитах справочника есть URL картинки. Необходимо вывести на форму динамический список справочника с отображением картинки в каждой строке.
Создаем форму списка справочника. Заполнение динамического списка меняем на "Произвольный запрос". Отключаем динамическое считывание данных, оно в нашем случае может привести к нестабильности работы.
Добавляем в параметры запроса строковый параметр ИдентификаторФормы, в который соответственно будем передавать идентификатор нашей формы.
В вычисляемые поля запроса добавляем строковое поле Картинка. Значение будет возвращаться из метода общего модуля, в который как параметр будет передаваться URL изображения текущей записи справочника.
На форме в табличное поле списка выводим реквизит "Картинка" с типом "Поле картинки".
Метод общего модуля выполняет запрос по переданному URL, получает двоичные данные, сохраняет во временное хранилище нашей формы по ее уникальному идентификатору, и возвращает адрес временного хранилища, который и используется для отображения в динамическом списке на форме.
В конфигурации примера для оптимизации реализовал кеширование результата метода в пределах сеанса (через свойства общего модуля), а так же выполнение запроса к URL в фоновом задании.
Запрос по URL самый обычный. Желательно ограничивать минимально-возможным таймаутом, чтобы пул фоновых заданий не копился.
//
//
Функция ПолучитьДвоичныеДанные(АдресURL) Экспорт
Результат = Неопределено;
лАдресURL = АдресURL;
////infostart.ru/bitrix/templates/.default/mmenu/images/directions/personal.svg
Если ЗначениеЗаполнено(лАдресURL) Тогда
Порт = 80;
Если СтрНачинаетсяС(НРег(лАдресURL), "https") Тогда
ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL();
Порт = 443;
КонецЕсли;
лАдресURL = Сред(лАдресURL, СтрНайти(лАдресURL, "://") + 3);
Сервер = "";
Метод = "";
Таймаут = 2;
МассивЧастиURL = СтрРазделить(лАдресURL, "/", Ложь);
Если МассивЧастиURL.Количество() > 0 Тогда
МассивЧастейХост = СтрРазделить(МассивЧастиURL[0], ":", Ложь);
Сервер = МассивЧастейХост[0];
Если МассивЧастейХост.Количество() > 1 Тогда
Порт = МассивЧастейХост[1];
КонецЕсли;
МассивЧастиURL.Удалить(0);
Метод = СтрСоединить(МассивЧастиURL, "/");
КонецЕсли;
Заголовки = Новый Соответствие;
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт,,,, Таймаут, ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос(Метод, Заголовки);
Попытка
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Если Ответ.КодСостояния - 200 < 100 Тогда
Результат = Ответ.ПолучитьТелоКакДвоичныеДанные();
КонецЕсли;
Исключение
// логируем ошибку
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
В результате после вывода динамического списка на форму картинки догружаются в фоне. Естественное обновление картинок по строкам выполнится при действиях со список: пролистывании, изменении данных. Чтобы ускорить обновление добавил на форму при открытии однократный обработчик ожидания с задержкой в 2 секунда, который обновит содержимое элемента динамического списка.
Тестировалось на релизе 8.3.25.1286.
Что мы получаем при использовании данного решения:
- отображение произвольных картинок в динамических списках, а соответственно и любых других объектах, использующих СКД;
- минимальные затраты на хранение БД, т.к. перманентно хранится только строка с URL, а сама картинка хранится в стороннем хранилище, с которым кроме нашего решения могут работать и любые другие сервисы в контуре;
- минимальное влияние на скорость отклика интерфейса с оговоркой стабильной сети и наличия быстрого стороннего хранилища двоичных данных (существенное требование);
- клиент-серверные вызовы по картинкам отсутствуют, вся работа на сервере;
- затрат на клиентские лицензии нет, т.к. для работы фоновых заданий нужна только серверная лицензия;
- данные загруженных картинок удаляются при закрытии формы, т.к. помещаются во временное хранилище этой формы (вся надежда на стабильность механик самой платформы);
Новый механизм работы с хранилищами двоичных данных (S3) платформы скорре всего реализует в итоге что-то похожее, не щупал. В данном случае выходит сильно дешевле, если КОРП вам нужен только ради такой задачи )).