Изменение размера картинок "на лету" с помощью 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 Управляемые формы Конфигурации 1cv8 Платные (руб)

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

6000 руб.

16.01.2015    61793    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

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

5000 руб.

14.01.2016    54401    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16695    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10735    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9610    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12079    1    5    

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

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

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

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

"решение с отдельным вебом на ASP.Net" - если есть возможность опишите подробнее пожалуйста, какие библиотеки для интерфейса форм, интерфейса отчетов используете? На каком уровне доступ разграничиваете?
18. Ivon 673 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 1292 02.08.21 16:02 Сейчас в теме
(19) в 14 дано краткое описание. Средствами только 1С не решить.
Оставьте свое сообщение