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

08.06.18

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

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

Скачать файлы

Наименование Файл Версия Размер
Готовая функция
.epf 8,52Kb
182
.epf 1 8,52Kb 182 Скачать

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

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

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

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

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

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

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

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

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

 

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

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

gzip deflate

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15744    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

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

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

5040 руб.

04.05.2021    17548    6    15    

13

Интеграция с сервисом vetmanager

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

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

12000 руб.

02.02.2021    16358    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25737    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88578    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 129 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 251 08.06.18 12:36 Сейчас в теме
(1) Говорят что формат deflate не используется сейчас веб серверами, хотя deflate = gzip без заголовков (чисто сжатые данные), для стандартизации все перешли на gzip.
3. PerlAmutor 129 08.06.18 16:20 Сейчас в теме
(1) К сожалению вариант с ХранилищемЗначения не работает, если на вход поступает Base64 строка с чистыми Deflate данными...
4. oyti 55 08.06.18 17:15 Сейчас в теме
Как раз совсем недавно бился над данным вопросом и временно перешел на обмен без сжатия (что так себе вариант).
Спасибо. Будем тестировать...
5. PerlAmutor 129 09.06.18 12:11 Сейчас в теме
Кстати насчет обновления курсов валют с сайта РБК. Один и тот же запрос валюты может возвращать 10 раз несжатый траффик, а потом ему что-то в голову бьет и начинает возвращать снова в gzip.
6. nbeliaev 828 09.06.18 19:40 Сейчас в теме
автор, спасибо! актуально
7. пользователь 01.08.18 11:05
Сообщение было скрыто модератором.
...
8. GoodZone 12 28.08.18 08:53 Сейчас в теме
Подскажите
ИмяСжатогоФайла="body.json";
это принципиально?
9. Malfarion 251 28.08.18 11:06 Сейчас в теме
(8) На сколько я помню нет.
10. GoodZone 12 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 234 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 489 07.07.19 15:12 Сейчас в теме
16. Dzenn 870 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 251 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 16 21.06.21 09:23 Сейчас в теме
Не работает, выдает ошибку
Прикрепленные файлы:
23. Malfarion 251 21.06.21 12:58 Сейчас в теме
(22) Не работать не может, значит на входе не GZIP
24. kholodarev 7 25.02.22 16:40 Сейчас в теме
Спасибо! То, что надо. Работает
25. KOLYNNN 15.10.22 09:31 Сейчас в теме
Доброе утро.
Подскажите пожалуйста, почему не хочет работать с моими данными. Судя по заголовкам и расшифровке на сайте там json сжатый gzip.
Приложил тело в двоичных данных и строкой, посмотрите пож., замучался уже с ним.
Валиться на этой строчке:
Файл.Извлечь(Файл.Элементы[0], КаталогВременныхФайлов,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Прикрепленные файлы:
amocrm
ДвоичныеДанные.txt
ТелоЗапросаСтрока.txt
26. Viktor_Ermakov 363 16.08.23 18:16 Сейчас в теме
смотрите в БП на ОбщегоНазначенияЭДКО.МассивОписанийИДанныхGzipФайла()
27. fixin 4252 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 Сейчас в теме
Большое Вам спасибо!
Сэкономили много часов времени.
Оставьте свое сообщение