Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза

08.06.18

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

В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие. Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК. Друзья, хватит. Вот вам решение.

Скачать файл

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

Наименование По подписке [?] Купить один файл
Готовая функция
.epf 8,52Kb ver:1
196
196 Скачать (1 SM) Купить за 1 850 руб.

Будет работать на платформе 8.3.9 + . Потому что работа с двоичными данными появилась только в них.

Многие искали ответ на этот вопрос, и тут, и на партнерском форуме, тема действительно актуальная, сейчас все работает со сжатием.

Суть метода лежала на поверхности, что такое GZIP - это формат схожих с ZIP , но отличающейся заголовочными блоками.

1) Вставляем заголовок, чтобы сервер понимал, что мы умеем принимать этот формат

Заголовки.Вставить("Accept-Encoding", "gzip");

2) Получаем ответ в виде двоичных данных 

3) Вырезаем сжатое тело (Байты с 10 по ДлинаТела - 8)

4) Формируем валидные залоговоки формата ZIP файла и добавляем к нему сжатое тело (Пример формирование валидных ZIP заголовков взят отсюда //infostart.ru/public/618906/, и доработаны)

5) Извлекаем данные с использованием ЧтениеZipФайла

 

Во вложении готовая функция, можно копировать в проект и использовать.

Если будет советы по оптимизации и улучшению, просьба в личку.

gzip deflate

См. также

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

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

36000 руб.

03.08.2020    17886    19    22    

17

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20017    13    17    

17

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14492    42    8    

18

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

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

24000 руб.

27.09.2024    1521    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 155 08.06.18 11:57 Сейчас в теме
(0)
Будет работать на платформе 8.3.9 + . Потому что работа с двоичными данными появилась только в них.

Тема актуальная, т.к. сайт РБК "любит" отдавать курсы валют в Gzip формате, если запрашивать периодом. Никакие переданные ему ключи в заголовках на его поведение не влияют.

К сожалению у меня платформа 8.3.7. Каким-то образом в ней можно извернуться так, чтобы добавить к данным заголовок (может через прямое редактирование base64 строки)?
---
Кажется нашел как можно сделать на старых платформах, благодаря Александру Шпагину, но это работает только с deflate, а по поводу Gzip вопрос остается открытым:

// сжатие решается конструкцией: 
    
    ХЗ = Новый ХранилищеЗначения(НашеЗначениеКотороеНадоСжать, СжатиеДанных(9));
    СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
    СжатыеДвоичныеДанные = Base64Значение(СтрокаBase64);


// распаковка: 
    СтрокаBase64 = Base64Строка(СжатыеДвоичныеДанные);
    ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
    НашеЗначение = ХЗ.Получить();

Показать
Kazaams; DrAku1a; Поручик; gradi; +4 Ответить
2. Malfarion 261 08.06.18 12:36 Сейчас в теме
(1) Говорят что формат deflate не используется сейчас веб серверами, хотя deflate = gzip без заголовков (чисто сжатые данные), для стандартизации все перешли на gzip.
3. PerlAmutor 155 08.06.18 16:20 Сейчас в теме
(1) К сожалению вариант с ХранилищемЗначения не работает, если на вход поступает Base64 строка с чистыми Deflate данными...
4. oyti 59 08.06.18 17:15 Сейчас в теме
Как раз совсем недавно бился над данным вопросом и временно перешел на обмен без сжатия (что так себе вариант).
Спасибо. Будем тестировать...
5. PerlAmutor 155 09.06.18 12:11 Сейчас в теме
Кстати насчет обновления курсов валют с сайта РБК. Один и тот же запрос валюты может возвращать 10 раз несжатый траффик, а потом ему что-то в голову бьет и начинает возвращать снова в gzip.
6. nbeliaev 836 09.06.18 19:40 Сейчас в теме
автор, спасибо! актуально
7. пользователь 01.08.18 11:05
Сообщение было скрыто модератором.
...
8. GoodZone 13 28.08.18 08:53 Сейчас в теме
Подскажите
ИмяСжатогоФайла="body.json";
это принципиально?
9. Malfarion 261 28.08.18 11:06 Сейчас в теме
(8) На сколько я помню нет.
10. GoodZone 13 29.08.18 09:48 Сейчас в теме
Просто подумал может тег body )), а так проверил все работает на ура. Очень нужная вещь.
11. milanse 38 14.03.19 09:26 Сейчас в теме
Есть задача данные в формате gzip распаковывать из 1С, качнул обработину, в лоб не работает. Данные содержат заголовок gzip. Убрал заголовок, отрезал хвост в соотвествии с форматом, остались только данные deflate результирующий файл 1с не распаковывает. Файл читается 7zip и far, выдает ошибку crc, но данные достает нормально....
Может есть идеи что еще можно подшаманить ?
14. uno-c 265 18.07.19 15:59 Сейчас в теме
(11)
Может есть идеи что еще можно подшаманить ?
Посмотрите описание формата gzip: http://www.zlib.org/rfc-gzip.html Согласно этому описанию, за первыми 10 байтами не обязательно следует deflate. Перед deflate могут присутствовать также имя файла, комментарий и т.д. В случае gzip сжатого тела ответа HTTP они отсутствуют, т.е. за 10 байтами сразу начинается deflate, но для Вашей задачи нужен дальнейший разбор и проверка присутствия комментария, имени файла и проч.
15. milanse 38 18.07.19 19:15 Сейчас в теме
(14) спасибо посмотрю, но пока пришлось решить через ВК.
12. ui69 41 14.06.19 12:17 Сейчас в теме
Автору - спасибо! Работает четко.
13. boogie 490 07.07.19 15:12 Сейчас в теме
16. Dzenn 894 17.02.20 11:31 Сейчас в теме
Спасибо, добрый человек. Не скачивал пока, но верю, что это то, что доктор прописал
17. nDaDe 29.04.20 21:04 Сейчас в теме
Не подскажите как из WinHttp.WinHttpRequest.5.1 получить двоичные данные чтобы распаковать.
18. Sergafan10 24.05.21 20:28 Сейчас в теме
8.3.16
Не работает. Валится при попытке извлечения:
Неожиданная ошибка в работе архиватора: body.json
Скорее всего что-то со структурой.
19. Malfarion 261 24.05.21 22:43 Сейчас в теме
(18) Вероятнее всего вы ей на вход не gzip подали, а что-то похожее, вы заголовок ответа сервера проверили?
20. Sergafan10 25.05.21 08:08 Сейчас в теме
(19) у меня в Ответ.ПолучитьТелоКакДвоичныеДанные() торчит полноценный gzip-архив, если его Записать() то он открывается и содержимое вполне просматривается
21. Sergafan10 25.05.21 09:26 Сейчас в теме
(19) upd
Там действительно zip-архив! Зато в мануале:
В качестве возвращаемого параметра пользователь получает заархивированный csv-файл.
Файл заархивирован в формате .gzip

Прошу прощения!
22. lnnd 17 21.06.21 09:23 Сейчас в теме
Не работает, выдает ошибку
Прикрепленные файлы:
23. Malfarion 261 21.06.21 12:58 Сейчас в теме
(22) Не работать не может, значит на входе не GZIP
24. kholodarev 8 25.02.22 16:40 Сейчас в теме
Спасибо! То, что надо. Работает
25. KOLYNNN 15.10.22 09:31 Сейчас в теме
Доброе утро.
Подскажите пожалуйста, почему не хочет работать с моими данными. Судя по заголовкам и расшифровке на сайте там json сжатый gzip.
Приложил тело в двоичных данных и строкой, посмотрите пож., замучался уже с ним.
Валиться на этой строчке:
Файл.Извлечь(Файл.Элементы[0], КаталогВременныхФайлов,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Прикрепленные файлы:
amocrm
ДвоичныеДанные.txt
ТелоЗапросаСтрока.txt
26. Viktor_Ermakov 369 16.08.23 18:16 Сейчас в теме
смотрите в БП на ОбщегоНазначенияЭДКО.МассивОписанийИДанныхGzipФайла()
27. fixin 4275 01.02.24 19:26 Сейчас в теме
спасибо, с 1 декабря 2023 moysklad стал отдавать данные только в gzip.
Применил функцию успешно, только в концовочке добавил кодировку UTF-8 в явном виде:

    ЧтениеТекста=Новый ЧтениеТекста(КаталогВременныхФайлов+РазделительПутей+"body.json", "UTF-8");
    Текст=ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    УдалитьФайлы(КаталогВременныхФайлов);
    Возврат Текст;    




А то возвращалось нечитаемо.

было бы неплохо, что если бы это был не gzip, он просто распаковывал как строку, чтобы не думать, в каких ответах возвращается строка, в каких gzip.

Подробнее в статье: https://geniy1s.ru/izmeneniya-v-api-moj-sklad-v-2024/
28. valchel 20.03.24 14:21 Сейчас в теме
Большое Вам спасибо!
Сэкономили много часов времени.
Оставьте свое сообщение