Изменение размера картинок "на лету" с помощью NGINX

21.03.22

Разработка - Работа с интерфейсом

Пример использования nginx и image_filter для сжатия картинок.

Вводные

  • Конфигурация: Розница 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С, проверить доступ, инструкция

Настроить изменение размера на лету и кеширование результата

 
  /etc/nginx/conf.d/default.conf

Ссылка на источник конфигурации 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С, думаю для порядка цифр данного сравнения хватит.

 

Благодарю за внимание.

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55974    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    64308    45    60    

83

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    20297    29    6    

45

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    26191    mrXoxot    44    

130

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    13627    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    18900    1241    elcoan    53    

128

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    13250    171    acces969    31    

127

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    8864    kalyaka    6    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. infotech 3 28.05.21 13:11 Сейчас в теме
2. Sedaiko 594 28.05.21 13:14 Сейчас в теме
Nginx - как обратный прокси многое может решить.
3. triviumfan 99 31.05.21 10:08 Сейчас в теме
Выводить картинки товаров в отчет... эм... :)
4. malikov_pro 1331 31.05.21 14:04 Сейчас в теме
(3) Работа с каталогом товаров в офлайн, решается мобильным приложением, но его нужно написать, в планах.
Иногда странные решения являются оптимумом в определенный момент развития предприятия.
5. drkhaired 51 31.05.21 17:51 Сейчас в теме
Разработчики платформы могут прокомментировать, когда платформа научится этому без сторонних решений?
6. malikov_pro 1331 31.05.21 18:36 Сейчас в теме
(5) Разработчиков платформы на этом ресурсе не встречал.
7. Xershi 1536 01.06.21 09:06 Сейчас в теме
На мобиле ничего не видно.
Как я понял без сервера все быстрее работает?
Зачем тогда его ставить...
8. malikov_pro 1331 01.06.21 12:19 Сейчас в теме
(7)
На мобиле ничего не видно. - проверял только в тонком клиенте
Как я понял без сервера все быстрее работает? - если про сервер nginx, то по сравнению с обращением к файлу на диске присутствует задержка из за HTTP, выигрыш за счет меньшего объема данных между клиентом и сервером 1С.

HTTP возможно можно ускорить за счет переиспользование HTTPСоединение

У меня был выбор либо жать и контролировать наличие доп файлов или настроить на nginx, второе по реализации оказалось проще, в контексте задачи производительности хватает.
9. Xershi 1536 01.06.21 12:59 Сейчас в теме
(8) а вон вижу с ПК. я думал там 3 милисекунды против 20 секунд. Отформатируйте табличку даже на полуэкране вся не видна.
Или вывод текстом напишите.
10. malikov_pro 1331 01.06.21 13:03 Сейчас в теме
(9) ширину таблички поправил, первый опыт работы с этим объектом в рамках IS
11. Xershi 1536 01.06.21 13:04 Сейчас в теме
(10) я справку передирал по расширениям, так там вообще монстр...
12. Ivon 676 02.06.21 10:45 Сейчас в теме
Так себе решение. Вешать целую виртуалку с линухом только для того, чтобы картинку сделать размером меньше. Можно же сделать проще и менее ресурсоемко.
19. XelOla 19 02.08.21 15:59 Сейчас в теме
21. Ivon 676 08.08.21 16:09 Сейчас в теме
(19) Например, написать свой web-сервис или свой web-app. Хотя бы на том же .Net Core. Делается аж за 5 минут.
13. malikov_pro 1331 02.06.21 11:03 Сейчас в теме
(12) У меня proxmox, создать контейнер пара мин, примонтировать папку, поставить nginx и закинуть в него конфиг еще мин 15 от силы.
"Можно же сделать проще и менее ресурсоемко." - предлагайте свой вариант, дополню статью. До этого было хранение в отдельной записи НоменклатураПрисоединенныеФайлы с проблемами фильтрации и связанности (например на сайт), конвертация была за счет утилиты которая работала под win.
14. Ivon 676 09.06.21 10:32 Сейчас в теме
(13) Например, написать что-то, чтобы крутилось нативно в операционной системе, а не через виртуалку. На C# десяток строк кода и будет готовое решение для изменения размера картинок.
15. malikov_pro 1331 09.06.21 20:42 Сейчас в теме
(14) "Просто" для того кто с C# работал, для меня сейчас затруднительно сделать web сервис использующий dll библиотеку для формирования docx документа (ONLYOFFICE), хотя пример есть, хз как собрать, буду рад помощи, результат выложу в паблик.

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

При этом за микросервисы в нормальном их понимании, когда это функциональный блок за который отвечает команда с общим подходом к разработке.
1С хороша в учете и в пользовательском интерфейсе, не вижу смысла в неё тащить генерацию HTML, это уже хорошо сделано в web, по этому поводу статью про с шаблонизатор писал.

Держать на одной VM сервер 1С + сервис сложнее чем просто 1С, потенциальные конфликты. Запускать в серверном контексте NativeAPI не пробовал, их не так много. Сделать бесплатный WebSocket клиент или Kafka/Pulsar клиент мысль есть. Но как держать постоянно в памяти фонового задания не особо понимаю.
16. Ivon 676 10.06.21 10:00 Сейчас в теме
(15)
"чтобы крутилось нативно в операционной системе"

подсказываю - REST-сервис (или в 1С это называется HTTP-сервис). А по поводу веба 1С-овского: я работаю уже достаточно долго с компаниями, которым нужен веб в силу их бизнеса. В далекие времена, когда 1С только выдала свой веб-клиент на 8.2 было сделано для пробы несколько решений на 1С-ном вебе. В силу того, что не было альтернатив, пользовались, хотя и не нравилось. 8.3 с егт Такси никак не улучшил ситуацию и клиенты просто перестали пользоваться вебовским функционалом. Он тяжелый для браузера и для разработчика. Зато решение с отдельным вебом на ASP.Net, которое общается с 1С с помощью http-сервисов, зашло на ура.
17. malikov_pro 1331 10.06.21 16:03 Сейчас в теме
(16) если REST, то преимуществ перед NGINX нет, те же накладные расходы на HTTP, в Вашем контексте формирования клиента на .NET возможно доп модуль для пережатия картинок на лету более подходит.

"решение с отдельным вебом на ASP.Net" - если есть возможность опишите подробнее пожалуйста, какие библиотеки для интерфейса форм, интерфейса отчетов используете? На каком уровне доступ разграничиваете?
18. Ivon 676 10.06.21 19:49 Сейчас в теме
(17) Авторизация на уровне учетных записей и ролей 1С, для интерфейса в стандартеASP.Net MVC идет Bootstrap, но можно использовать что угодно. Хоть самому контролы на Java писать или использовать кучу имеющихся в интернете, например на JQuery. Там разлет большой, от бесплатных самописных с GitHub до платных DevExpress и прочих. Отчеты строю в 1С, а дальше или возвращаю набор в Json и вывожу его средствами HTML, либо можно средствами 1С сформировать XLSX или PDF и отдать клиенту файлом. В основном формируется по запросу табличный документ, который средствами 1С преобразовывается в нужный формат. Но есть и более сложные механизмы, когда используется DOCX в качестве шаблона, открывается 1С-ом в ворде через СОМ, заполняется, преобразовывается Word-ом в PDF и файлом отдается клиенту.
20. malikov_pro 1331 02.08.21 16:02 Сейчас в теме
(19) в 14 дано краткое описание. Средствами только 1С не решить.
Оставьте свое сообщение