Изменение размера картинок "на лету" с помощью 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С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    78953    52    40    

63

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

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

36600 руб.

28.08.2025    7358    2    2    

6

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

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

6100 руб.

14.01.2016    60047    22    25    

47

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    1884    3    0    

2

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

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

6100 руб.

16.01.2015    68072    46    60    

85

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    48700    mrXoxot    44    

139

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    26262    smielka    39    

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

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

У меня был выбор либо жать и контролировать наличие доп файлов или настроить на nginx, второе по реализации оказалось проще, в контексте задачи производительности хватает.
9. Xershi 1549 01.06.21 12:59 Сейчас в теме
(8) а вон вижу с ПК. я думал там 3 милисекунды против 20 секунд. Отформатируйте табличку даже на полуэкране вся не видна.
Или вывод текстом напишите.
10. malikov_pro 1355 01.06.21 13:03 Сейчас в теме
(9) ширину таблички поправил, первый опыт работы с этим объектом в рамках IS
11. Xershi 1549 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 1355 02.06.21 11:03 Сейчас в теме
(12) У меня proxmox, создать контейнер пара мин, примонтировать папку, поставить nginx и закинуть в него конфиг еще мин 15 от силы.
"Можно же сделать проще и менее ресурсоемко." - предлагайте свой вариант, дополню статью. До этого было хранение в отдельной записи НоменклатураПрисоединенныеФайлы с проблемами фильтрации и связанности (например на сайт), конвертация была за счет утилиты которая работала под win.
14. Ivon 676 09.06.21 10:32 Сейчас в теме
(13) Например, написать что-то, чтобы крутилось нативно в операционной системе, а не через виртуалку. На C# десяток строк кода и будет готовое решение для изменения размера картинок.
15. malikov_pro 1355 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 1355 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 1355 02.08.21 16:02 Сейчас в теме
(19) в 14 дано краткое описание. Средствами только 1С не решить.
Для отправки сообщения требуется регистрация/авторизация