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

08.06.18

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Готовая функция
.epf 8,52Kb
193
193 Скачать (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 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Функциональное решение для торговли на всех популярных маркетплейсах. Работает со схемами FBO и FBS. Простое в использовании и установке, не вносит изменения в код программы. Существенно упрощает работу с товарным ассортиментом, обработку заказов с площадок, работу с поставками, а также ведение аналитики по продажам и остаткам.

72000 руб.

19.07.2024    1316    52    0    

3

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    17703    49    50    

29

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

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

22656 руб.

25.05.2021    14108    40    8    

16

Обмен с ГосИС Мастера заполнения WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

3900 руб.

08.11.2017    62819    403    295    

72

ККМ WEB-интеграция Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Универсальный драйвер для фискализации чеков для сервиса Бизнес.РУ. Чеки (https://online-check.business.ru/). Работает с любой кассой, подключенной к сервису, в том числе и без физической кассы (Аренда облачной ККТ в датацентре). Принцип работы аналогичен наличию физической кассы, подключенной к рабочему месту 1С. Фискализация выполняется с любого рабочего места через интернет. Нет ограничений на количество рабочих мест, касс, компьютеров. Поддерживает печать с нескольких рабочих мест на одну кассу. Работает в любой операционной системе (Windows, Linux) и в любом клиенте (Тонкий, Толстый, Web, Мобильный клиент).

6000 руб.

03.06.2021    13805    12    0    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 130 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 130 08.06.18 16:20 Сейчас в теме
(1) К сожалению вариант с ХранилищемЗначения не работает, если на вход поступает Base64 строка с чистыми Deflate данными...
4. oyti 58 08.06.18 17:15 Сейчас в теме
Как раз совсем недавно бился над данным вопросом и временно перешел на обмен без сжатия (что так себе вариант).
Спасибо. Будем тестировать...
5. PerlAmutor 130 09.06.18 12:11 Сейчас в теме
Кстати насчет обновления курсов валют с сайта РБК. Один и тот же запрос валюты может возвращать 10 раз несжатый траффик, а потом ему что-то в голову бьет и начинает возвращать снова в gzip.
6. nbeliaev 835 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 238 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 889 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 4268 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 Сейчас в теме
Большое Вам спасибо!
Сэкономили много часов времени.
Оставьте свое сообщение