Вводные
- Конфигурация: Розница 2.3.7
- Хранение файлов "в томах на диске"
- Сервер 1С на ubuntu 20.04, папка с файлами примонтирована по NFS
- Средний размер картинки 700 КБ
Задача
Вывести картинки товаров в отчетах, табличной части формы.
При решении "в лоб" через получение файла отчет на несколько сот строк строится относительно долго и при выгрузке в XLS для пост обработки весит 20+ МБ, что неудобно.
При выводе в табличный документ картинки кешируются на сервере 1С, возможно переполнение диска и ОЗУ, так же картинки размещаются в ОЗУ при выводе отчета на экран.
Вариант решения
Рядом с сервером 1С развернуть виртуальную машину с сервисом NGINX с модулем image filter документация
Инструкция по установке, если в системе нет add-apt-repository предварительно установить
sudo apt install software-properties-common
Подключить к сервису папку с файлами из томов 1С, проверить доступ, инструкция
Настроить изменение размера на лету и кеширование результата
Ссылка на источник конфигурации https://gist.github.com/phpdude/1451684, важно что поддерживается работа с подпапками, что для хранения 1С важно.
Варианты использования
- http://file-proxy.domain.lan/<путь до файла> - получение картинки без сжатия
- http://file-proxy.domain.lan/resize/<путь до файла> - получение картинки 100*150
- http://file-proxy.domain.lan/resize_XxY/<путь до файла> - получение картинки X*Y
Реализация на стороне 1С
Исходный вариант
В "ПриКомпоновкеРезультата", основу можно взять из //infostart.ru/1c/articles/1125765/, в процедуре ПолучитьИзображение
Если СсылкаНаФото.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда
ПолныйПуть = РаботаСФайламиВТомахСлужебный.ПолныйПутьТома(СсылкаНаФото.Том) + СсылкаНаФото.ПутьКФайлу;
Попытка
Картинка = Новый Картинка(ПолныйПуть);
Исключение
Картинка = Неопределено;
КонецПопытки;
КонецЕсли;
Добавляем обращение к NGINX
ПолныйПуть = РаботаСФайламиВТомахСлужебный.ПолныйПутьТома(СсылкаНаФото.Том) + СсылкаНаФото.ПутьКФайлу;
АдресСерверПрокси = "http://file-proxy.domain.lan/resize";
ИмяФайла = СтрЗаменить(ПолныйПуть, "/home/usr1cv8/srv1c_file_storage", "");
Ответ = хк_цб_КоннекторHTTP.get(АдресСерверПрокси + ИмяФайла);
Если Ответ.КодСостояния = 200 Тогда
ДвоичныеДанные = КоннекторHTTP.КакДвоичныеДанные(Ответ);
Картинка = Новый Картинка(ДвоичныеДанные);
Иначе
Попытка
Картинка = Новый Картинка(ПолныйПуть);
Исключение
Картинка = Неопределено;
КонецПопытки;
КонецЕсли;
Использую КоннекторHTTP //infostart.ru/public/709325/
Замеры производительности:
- NGINX на одноядерной VM с 512 ОЗУ
- Отчет 1000+ строк (Продажи с фото)
ПриКомпоновкеРезультата | Вывод на экран | |
Получение картинки напрямую | 16 сек | 3 мин |
NGINX без кеша | 40 сек | 20 сек |
NGINX с кешем | 16 сек | 20 сек |
В тестах не чистил кеш сервера 1С, думаю для порядка цифр данного сравнения хватит.
Благодарю за внимание.