Уменьшаем трафик: читаем HTTP ответ, сжатый GZip, используя ХранилищеЗначения 1С (без ЧтениеZipФайла)

07.11.24

Интеграция - WEB-интеграция

Обработка демонстрирует распаковку gzip-сжатого ответа HTTP сервера средствами платформы 1С (без внешней компоненты, без COMОбъекта). Для этого используется объект ХранилищеЗначения, а не ЧтениеZipФайла.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Распаковка gzip из HTTP-ответа с помощью объекта ХранилищеЗначения
.epf 6,96Kb
12
12 Скачать (1 SM) Купить за 1 850 руб.

В сети есть примеры, как средствами 1С распаковывать ответ HTTP сервера, закодированный gzip. Однако метод без использования ЧтениеZipФайла я не встречал. Методы в сети из gzip-кодированного тела HTTP-ответа формируют zip-файл с последующей его распаковкой. Мой метод формирует ХранилищеЗначения с последующим получением данных из него. Преимуществом распаковки через Хранилище является то, что не нужно записывать временные файлы. При этом код 1C функции распаковки в несколько раз короче, чем при использовании ЧтениеZipФайла.

Для демонстрации обработка получает курсы валют с сайта Центробанка. Чтобы ответ сервера Центробанка был сжат в gzip, в HTTPЗапросе устанавливается заголовок "accept-encoding: gzip". На скринах видно, что установка такого заголовка порой дает существенную экономию трафика, в данном случае получилось сжатых 1406 байтов вместо несжатых 11212.

Разрабатывалась на платформе 8.3.25, должна работать начиная с 8.3.9.

gzip распаковка HTTPОтвет сжатие deflate inflate ХранилищеЗначения

См. также

Оптовая торговля Розничная торговля WEB-интеграция Конфигурации 1cv8 Платные (руб)

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

57600 руб.

26.11.2024    802    1    1    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18157    19    22    

17

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20340    13    19    

18

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    2003    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 824 07.11.24 17:10 Сейчас в теме
По скорости сравнивали, насколько быстрее?
Как я понимаю, суть алгоритма проста: приклеиваете заголовок ХЗ к сжатым данным и просто распаковываете. Но такой вариант не универсален - нужно заранее знать, какой тип данных внутри deflate.
2. uno-c 265 07.11.24 17:44 Сейчас в теме
(1) Вариант универсален. Из deflate берем двоичные данные, поскольку любые данные, упакованные в gzip, в своей основе двоичные, а что с ними делать после распаковки - на усмотрение разработчика: можно ПолучитьСтрокуИзДвоичныхДанных(Двоичные, Кодировка), можно Двоичные.Записать(ИмяФайла), можно Двоичные.ОткрытьПотокДляЧтения() и т.д. Суть алгоритма не совсем проста, используется особенность спецификации (RFC 1951, 3.2.4. Non-compressed blocks), которая позволяет внедрять прямо в запакованный deflate незапакованные данные. По скорости не сравнивал, но идея интересная, как-нибудь на досуге сравню.
13. uno-c 265 08.11.24 16:01 Сейчас в теме
(1) Сравнил по скорости на одном примере. ОбщийМодуль и БОНД_Коннектор - модули в свежей конфигурации, в метаданных которой только два этих модуля.
&НаСервереБезКонтекста
Процедура КурсыВалютРазнымиСпособамиНаСервере()
	ХТТПСоединение = Новый HTTPСоединение("www.cbr.ru",,,,,60,Новый ЗащищенноеСоединениеOpenSSL,Ложь);
	ХТТПЗапрос = Новый HTTPЗапрос("/scripts/XML_dynamic.asp?date_req1=01/01/2000&date_req2=08/11/2024&VAL_NM_RQ=R01235");
	ХТТПЗапрос.Заголовки.Вставить("Accept-Encoding", "gzip");
	ХТТПОтвет = ХТТПСоединение.Получить(ХТТПЗапрос);
	ДвоичноеТелоОтвета = ХТТПОтвет.ПолучитьТелоКакДвоичныеДанные();
	
	мсХранилищеНачало = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ДвоичныеРаспакованыХранилищем = ОбщийМодуль.ПрочитатьGZipХранилищем(ДвоичноеТелоОтвета);
	мсХранилищеОкончение = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	мсЧтениеZipНачало = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ДвоичныеРаспакованыЧтениемZip = БОНД_Коннектор.ПрочитатьGZip(ДвоичноеТелоОтвета);
	мсЧтениеZipОкончение = ТекущаяУниверсальнаяДатаВМиллисекундах();

	Сообщить("Миллисекунд на Хранилище: " + (мсХранилищеОкончение - мсХранилищеНачало));
	Сообщить("Миллисекунд на ЧтениеZip: " + (мсЧтениеZipОкончение - мсЧтениеZipНачало));
	Сообщить("Размер раскодированных двоичных данных, байт: " + ДвоичныеРаспакованыХранилищем.Размер());
	Сообщить("Результат распаковки разными способами тождественнен: " + (ДвоичныеРаспакованыХранилищем = ДвоичныеРаспакованыЧтениемZip)); 
КонецПроцедуры
Показать
Миллисекунд на Хранилище: 3
Миллисекунд на ЧтениеZip: 18
Размер раскодированных двоичных данных, байт: 732 064
Результат распаковки разными способами тождественнен: Да
14. uno-c 265 08.11.24 16:37 Сейчас в теме
(13) при этом
Сообщить("Размер сжатых двоичных данных, байт: " + ДвоичноеТелоОтвета.Размер()); 
Размер сжатых двоичных данных, байт: 77 117

Т.е. экономия трафика за счет сжатия - в данном случае трафик сжимается в 9,5 раз. Исходные данные 732 064 байта, а в передаче данных через сеть из-за установки заголовка "Accept-Encoding:gzip" прошло всего 77 117 байт.
3. Malfarion 261 08.11.24 01:20 Сейчас в теме
ПотокGZip.Закрыть();

Надо закрывать поток потому что приводит к утечкам памяти.
uno-c разрешает использовать код ?
5. uno-c 265 08.11.24 08:04 Сейчас в теме
(3) Платформа 1С автоматом не закрывает поток по завершении процедуры? Код позвольте пока не выкладывать в обсуждении моей обработки. Идея использовать gzip Non-compressed block пришла мне перед сном, всю ночь просидел из-за того, что какой-то онлайн-декодер gzip не воспринимал этот блок ) Повезло, что 1С нормально отрабатывает такие блоки.
10. uno-c 265 08.11.24 10:32 Сейчас в теме
(5) * не gzip, а deflate имел в виду: deflate Non-compressed blocks и deflate онлайн-декодер. Хотя, возможно с онлайн-декодером ошибаюсь, может я что неправильно делал, время было за полночь...
11. markers 277 08.11.24 11:04 Сейчас в теме
(5) 1С освобождает только по завершению метода и только если не будет ссылок (метод подсчёта ссылок сборщиком мусора).
При использовании объектов использующие большой объём памяти, крайне желательно помочь сборщику мусора.
Плюс при использовании некоторых объектов, платформа может не позволить использовать этот тип объекта, пока не закрыт старый (в рамках одного метода).
12. uno-c 265 08.11.24 13:19 Сейчас в теме
(11) ПотокGZip - локальная переменная внутри функции распаковки gzip через ХранилищеЗначения. В функции она создается, на выходе из функции она прекращает существование. Уверен, что платформа 1С закрывает поток автоматом, поскольку локальной переменной ПотокGZip больше не существует. Так что ПотокGZip.Закрыть() - думаю, это лишнее.

Эксперимент. Запаковал dt-шник размером 1 гигабайт в gzip. Далее в цикле скормил этот гигабайтный gzip моей функции распаковки gzip. Утечек памяти за пройденный на настоящий момент цикл в 39 распаковок гигабайтного гзипа - не обнаружено. В процессе циклической распаковки использование памяти компа колеблется на 35-46% (всего в компе установлено 64 Гб памяти)
&НаСервереБезКонтекста
Процедура ТестБольшойГзипНаСервере()
	Для сч = 1 по 64 Цикл
		ДвоичныеГзип = Новый ДвоичныеДанные("d:\Virtuals\FOLDERS\gzip\Base1Gb.dt.gz");
		ДвоичныеРаспакованы = ПрочитатьGZipХранилищем(ДвоичныеГзип);
		ДвоичныеРаспакованы.Записать("d:\Virtuals\FOLDERS\gzip\РаспакованХранилищем_" 
		+ Формат(ТекущаяДатаСеанса(),"ДФ=yyyyMMdd_hhmmss") + ".dt"); 
	КонецЦикла;
КонецПроцедуры
Показать

Так что, пожалуй, не буду менять код обработки. Пусть внутри функции распаковки gzip через ХранилищеЗначения так и останется всего 9 строк кода.
Прикрепленные файлы:
4. webester 26 08.11.24 06:18 Сейчас в теме
Предлагаю ознакомиться с
https://github.com/vbondarevsky/Connector/
https://openintegrations.dev/
Весь код открыт, работа с gzip в наличии
bayselonarrend; user2013751; Serg O.; +3 Ответить
7. uno-c 265 08.11.24 08:26 Сейчас в теме
(4) В коннекторе через ЧтениеZipФайла, что приводит к записи временных файлов. Распаковке через ХранилищеЗначения временные файлы не нужны. Кроме того, мой код раз в 10 короче кода распаковки в gzip коннекторе.
bayselonarrend; Serg O.; +2 Ответить
6. uno-c 265 08.11.24 08:25 Сейчас в теме
8. webester 26 08.11.24 09:31 Сейчас в теме
(7) Тогда самое время сделать пулреквест в обе репы. А не прятать код за стартманями.
BomjBandit; Il; yufan; kamisov; lostcay; pintov; starik-2005; swenzik; Xershi; +9 Ответить
9. zlllarc 08.11.24 09:43 Сейчас в теме
Идея шикарна! Создать хранилище значения, но не конструктором, а чтоб помещенное значение было уже закодировано, а потом прочитать как обычно и платформа раскодирует
Оставьте свое сообщение