Сжатие/Распаковка данных по алгоритму Deflate встроенными (!) средствами платформы 1С

03.07.20

Разработка - Инструментарий разработчика

Сжатие/Распаковка данных по алгоритму Deflate встроенными (и только!) средствами платформы 1С. Теперь работать напрямую с данными в СУБД стало проще ))

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

Наименование Файл Версия Размер
Deflate_Inflate
.epf 11,01Kb
125
.epf 1.1 11,01Kb 125 Скачать

Intro

Алгоритм компресии Deflate является старым, но проверенным временем форматом для сжатия данных без потерь. Яркий пример его применения - это файловые архивы ZIP. Deflate используется во многих программах. В том числе и в платформе 1С для хранения информации в более компактном представлении. Иногда приходится манипулировать данными напрямую через СУБД и тут нужен какой-то инструмент для распаковки сжатых данных. Хотя платформа 1с делает это на лету и прозрачно для пользователя.


Что под капотом

Распаковка данных, сжатых по алгоритму Deflate, осуществляется следующим образом: к сжатым данным клеятся структуры описания формата ZIP и на выходе получается почти корректный ZIP файл. Далее натравляем на него класс чтения ZIP файла и извлекаем, пусть и с выбросом ошибки, но полностью правильный, исходный файл.
Сжатие данных идет в обратном порядке: на файл натравливаем класс записи ZIP файла и пакуем этот файл, далее, отбрасываем структуры, описывающие ZIP формат, и на выходе получаем голые данные, сжатые по алгоритму Deflate.
Непосредственно, работа с Deflate здесь не реализована, выручают классы по работе с ZIP архивами. Но зато для сжатия/распаковки не требуются внешние компоненты и/или COM объекты.
Все это стало удобным с версии платформы 8.3.9+, когда появились классы для удобной работы с бинарными данными. Можно легко манипулировать отдельными байтами.


Что мы получаем

Здесь представлена обработка, позволяющая производить сжатие отдельного файла по алгоритму Deflate, а также распаковывать из сжатого файла данные. Также в коде представлены методы для преобразования чисел между любыми системами счисления (от 2 до 36). Основной движок обработки можно легко перенести в вашу БД/обработку. Механизм может независимо работать или на клиенте, или на сервере, причем в любой поддерживаемой ОС.


FAQ

Q: В коде много магических чисел, много лишних операций, зачем так неоптимально?
A: Это сделано для наглядности, чтобы расписать более подробно формат ZIP.

Q: А если обработка сжимает/распаковывает не правильно или по своему алгоритму? Как это проверить?
A: Легко. Создаете реквизит с типом ХранилищеЗначения, засовываете в него данные, указываете уровень сжатия > 0. В вашей СУБД дергаете из соответствующего поля двоичное значение, отбрасываете первые 18 байт (это эска пишет описание для ХЗ), и в остатке будет голый Deflate.

Q: Где это используется?
A: Это используется в продакшене при выносе большого объема бинарных данных из базы эски во внешнюю БД, из которой потом при запросе подтягиваются данные через внешние источники, которые разжимаются данным механизмом.


P.S.

Как оказалось, на ИС уже есть похожие публикации, но там либо применяется внешний EXE-шник, либо внешняя компонента, либо работа с бинарными данными идет через европу.


Update 25.01.2018 (v.1.1)

Исправлена ошибка в механизме сжатия (в 4-х байтовый буфер считывалось 2 байта о размере сжатых данных). Исправлены незначительные ошибки. Скорректирован интерфейс. Требуется платформа 8.3.9+ и включенный режим использования синхронных вызовов расширений платформы и внешних компонент.

Сжатие Deflate внутренние структуры распаковка ХранилищеЗначения работа с SQL напрямую

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122172    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7295    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

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

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

10000 8000 руб.

10.11.2023    3542    11    1    

34

SALE! 30%

PowerTools

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177755    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99347    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

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

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18116    6    8    

39

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28110    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23604    15    15    

32
Отзывы
1. alexandersh 263 09.05.17 16:13 Сейчас в теме
хм, а по мне так все уже придумано)
решается конструкцией:
	
	ХЗ = Новый ХранилищеЗначения(НашеЗначениеКотороеНадоСжать, СжатиеДанных(9));
	СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
	СжатыеДвоичныеДанные = Base64Значение(СтрокаBase64);

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

может на несколько байт и будет больше, за счет описания Хранилища значения, зато без костылей)
agnev; Andreyyy; apic; vit59; smirnov0ser; karpik666; i.c.h; sanfoto; user830227; link.gabauer; Dach; NoRazum; Sol; rintik; frkbvfnjh; Unknown31; asdf_88; veretennikoff; Поручик; DenisCh; Alien_job; config; SerVer1C; Caliban; Aleskey_K; SvoyakMartin; philya; ZLENKO; +28 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. alexandersh 263 09.05.17 16:13 Сейчас в теме
хм, а по мне так все уже придумано)
решается конструкцией:
	
	ХЗ = Новый ХранилищеЗначения(НашеЗначениеКотороеНадоСжать, СжатиеДанных(9));
	СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
	СжатыеДвоичныеДанные = Base64Значение(СтрокаBase64);

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

может на несколько байт и будет больше, за счет описания Хранилища значения, зато без костылей)
agnev; Andreyyy; apic; vit59; smirnov0ser; karpik666; i.c.h; sanfoto; user830227; link.gabauer; Dach; NoRazum; Sol; rintik; frkbvfnjh; Unknown31; asdf_88; veretennikoff; Поручик; DenisCh; Alien_job; config; SerVer1C; Caliban; Aleskey_K; SvoyakMartin; philya; ZLENKO; +28 Ответить
2. SerVer1C 748 10.05.17 10:10 Сейчас в теме
(1) Да, действительно, таким образом можно распаковать значение из бинарника, полученного из скульного значения 1с-ного ХЗ. Значит, приведенный в статье алгоритм останется для каких-то специфических задач при распаковке данных, сжатых алгоритмом Deflate каким-либо альтернативным ПО.
18. user894822 15.01.18 14:51 Сейчас в теме
(1) Александр, а если на входе - двоичные данные, сжатые алгоритмом deflate, а на выходе нужно получить распакованные данные. Существует ли где-то описание заголовка, который нужно добавить к входным данным, чтобы СериализаторXDTO воспринимал их как корректный тип ХранилищеЗначения, содержащий двоичные данные?
20. alexandersh 263 16.01.18 11:03 Сейчас в теме
21. alexandersh 263 16.01.18 11:04 Сейчас в теме
(18)
(1) Александр, а если на входе - двоичные данные, сжатые алгоритмом deflate, а на выходе нужно получить распакованные данные. Существует ли где-то описание заголовка, который нужно добавить к входным данным, чтобы СериализаторXDTO воспринимал их как корректный тип ХранилищеЗначения, содержащий двоичные данные?

так а тут как раз по теме самой статьи, добиваешь описанием структуры до zip-архива и распаковывашь)
22. user894822 16.01.18 14:54 Сейчас в теме
(21) Я имел в виду по вашему методу, через хранилище значения, а не через zip-файлы. Но потом посмотрел, как выглядит сериализация несжатого ХЗ и понял, что так не получится. Там двоичные данные заворачиваются в более сложную структуру, а потом это всё сжимается.
А авторская обработка у меня не заработала на моём примере данных. То, что сжато обработкой, распаковывает ок. А данные, сжатые сторонней программой - нет. Хотя данные корректные, проверял независимым распаковщиком.
23. SerVer1C 748 16.01.18 15:02 Сейчас в теме
(22) Прошу предоставить пример любого бинарника, сжатого deflate. Распаковка должна отрабатывать правильно, если это чистый deflate поток, т. к. на данном алгоритме работает распаковщик из публикации 710201 , и мной не было найдено EFD файла, который невозможно было бы распаковать.
25. user894822 26.01.18 09:19 Сейчас в теме
(23) Разобрался, оказалось у меня были данные в формате zlib (rfc-1950), там 2 байта дополнительный заголовок.
24. SerVer1C 748 25.01.18 17:02 Сейчас в теме
(22)
Хотя данные корректные, проверял независимым распаковщиком

Предлагаю вам проверить с помощью утилиты V8Unpack. С ключом "-D" сжимаете данные, распаковываете сжатый файл моей обработкой. Затем моей обработкой сжимаете данные и распаковывайте сжатый файл утилитой с ключом "-I".
53. DELOVOYDOM 11.03.24 01:31 Сейчас в теме
(1) Оно не на несколько байт больше, оно вообще непригодно там, куда вам нужно отправлять сжатые данные в чистом виде
3. lucas_ 13 10.05.17 11:51 Сейчас в теме
В развитие темы - а нельзя ли распаковать BinaryData, используя DECOMPRESS (функцию sql 2016)? Не подскажите, нет ли где описания формата запакованного бинарника 1С?
4. SerVer1C 748 10.05.17 13:56 Сейчас в теме
(3) Судя по описанию функции DECOMPRESS, она как раз может извлечь данные из сжатого 1С-кой хранилища значений. Только придется отбросить первые 18 байт - это описание для ХЗ. Точное описание формата данного заголовка не встречал.
5. lucas_ 13 10.05.17 14:20 Сейчас в теме
Нет, не получается.
Declare @b varbinary(max) =
(SELECT BinaryData FROM     Params WHERE  (FileName = N'DBNames'))
Set @b =  SUBSTRING(@b, 19, LEN(@b)-18)
Select  DECOMPRESS(@b) 


Выдает: Сообщение 9826, уровень 16, состояние 1, строка 4
В качестве аргумента во встроенную инструкцию DECOMPRESS переданы несжатые или поврежденные данные.
7. SerVer1C 748 18.05.17 08:44 Сейчас в теме
(5) Дело вот в чем: когда мы сжимаем данные функцией COMPRESS, то получается на выходе бинарник следующей структуры: 10 байт описание GZIP формата (здесь всегда 0x1F8B0800000000000400), далее идет Deflate-поток, затем 4 байта CRC несжатых данных и в конце 4 байта - размер несжатых данных. При выполнении DECOMPRESS функция сверяет CRC и размер исходных данных из сжатого бинарника с рассчитанным CRC и размером распакованных данных. В случае их расхождения получается та самая ошибка. Из поля скуля, содержащего эсовское ХЗ, мы можем получить все, кроме CRC исходных данных. Поэтому чисто средствами скуля распаковать эсовское хранилище не получится.
Deflate-поток легко распаковывается приведенной в статье обработкой.
Также если собрать вручную GZIP на основе Deflate-потока из эсовского ХЗ и подставить корректный CRC и размер исходных данных, то DECOMPRESS распакует исходные данные.
Если кто знает, как в ф. DECOMPRESS игнорить CRC, то напишите :-)
27. user792176 13.06.19 14:55 Сейчас в теме
(7) в регистре сведений ВерсииОбъектов есть реквизит КонтрольнаяCумма, не там ли хранится искомый CRC ?
28. SerVer1C 748 13.06.19 15:05 Сейчас в теме
(27)
ВерсииОбъектов
В моей конфе нет такого регистра сведений.
29. user792176 13.06.19 15:44 Сейчас в теме
(28) насколько понимаю, во всех новых конфигурациях у которых есть версионирование, есть этот регистр, в него пишется история изменений объектов.

Я этим вопросом заинтересовался в контексте извлечения истории изменения объектов средствами sql, попробовал Ваш метод, не получается.... у меня конфигурация ЕРП 2.
если поможете разобраться, был-бы благодарен..
30. SerVer1C 748 13.06.19 16:11 Сейчас в теме
(29)
благодарен
В РС "ВерсииОбъектов" реквизит "КонтрольнаяСумма" - это простой md5 хэш. (см. ОМ "ВерсионированиеОбъектов" функция "КонтрольнаяСумма"). Что конкретно вы хотите сделать через SQL ?
31. user792176 13.06.19 16:47 Сейчас в теме
(30) хочу получить строку с данными версии объекта, я так понимаю туда пишется сериализованные данные объекта, вот их и хотелось бы получить.

вот еще один путь как расшифровать, хотелосьбы чтото типа такого, но без использования sys.sp_OACreate

https://www.sql.ru/forum/1051208/chtenie-sredstvami-sql-iz-1s-8-1-polya-tipa-hranilishheznacheniya-ne-risunok
33. SerVer1C 748 13.06.19 17:48 Сейчас в теме
(31) Так данная обработка распакует 1с-ное ХЗ. См. FAQ из статьи: Создаете реквизит с типом ХранилищеЗначения, засовываете в него данные, указываете уровень сжатия > 0. В вашей СУБД дергаете из соответствующего поля двоичное значение, отбрасываете первые 18 байт (это эска пишет описание для ХЗ), и в остатке будет голый Deflate.
32. user792176 13.06.19 16:53 Сейчас в теме
(30) хотелбы получить строковое представление сериализованной версии данных объекта (в хранилище ведь оно пишется)

но без использования sys.sp_OACreate, как есть предложение на sql ru

sql.ru
34. SlavaKron 30.10.19 17:09 Сейчас в теме
(7) Судя по всему, она таки игнорирует CRC, потому что, например следующий запрос к любой базе 1С возвращает распакованные данные в кодировке UTF-8:
SEL ECT
	DECOMPRESS(0x1F8B0800000000000400 + BinaryData) as DBNames

 FR OM Params
 
 WH ERE
	FileName = 'DBNames'
Соответственно, для ХЗ:
SELECT
	DECOMPRESS(0x1F8B0800000000000400 + SUBSTRING(_Fld26, 19, LEN(_Fld26) - 18)) as Data
FR OM
	_Reference18
mefalcon; dctvghbdtn; SerVer1C; +3 Ответить
35. SerVer1C 748 31.10.19 10:18 Сейчас в теме
(34) ДА! Отличное решение. Это работает! Протестировано на 2016-м скуле. CRC не проверяется! Видимо, запутался в байтах, когда проверял в прошлый раз.

Чтобы получить чистые данные сразу из эсовского ХЗ, используем:

SELECT
SUBSTRING(DECOMPRESS(0x1F8B0800000000000400 + SUBSTRING(Field, 19, 9223372036854775807)), 9, 9223372036854775807)
FROM
Table

P.S. 9223372036854775807 - это максимальное положительное значение bigint
50. user1960796 26.06.23 18:19 Сейчас в теме
(35)

Этот запрос нужно применять к исходному полю таблицы или требуется дополнительная обработка? Запрос к таблице конфиг тоже выдается ошибку "В качестве аргумента во встроенную инструкцию DECOMPRESS переданы несжатые или поврежденные данные."

SEL ECT
SUBSTRING(DECOMPRESS(0x1F8B0800000000000400 + SUBSTRING(BinaryData, 19, 9223372036854775807)), 9, 9223372036854775807)
FR OM
Config
where FileName = 'root'
51. SerVer1C 748 26.06.23 18:27 Сейчас в теме
(50) Потому что в таблице конфиг записи НЕ "ХранилищеЗначения"
6. AlkB 27 11.05.17 12:59 Сейчас в теме
Данный метод действительно работает. А метод с СериализаторXDTO у меня не заработал.
8. lucas_ 13 18.05.17 13:31 Сейчас в теме
Ну, далее - просто мысли вслух. Я не совсем уловил. 1С-бинарник где-то внутри себя содержит CRC? Это CRC такое же, как и у аналогичных данных, сжатых COMPRESS или же другое?
9. SerVer1C 748 18.05.17 16:35 Сейчас в теме
(8) В том-то и печаль, что 1С-бинарник НЕ содержит внутри себя CRC. А ф. DECOMPRESS обязательно требует CRC исходных данных для распаковки.
10. lucas_ 13 18.05.17 17:34 Сейчас в теме
Жаль. Есть еще некая функция DECOMPRESSSCALAR. Но не найти ее описания, не заставить ее работать мне пока не удалось.
11. SerVer1C 748 19.05.17 01:18 Сейчас в теме
(10) Как я понял, это такой баг, когда IntelliSence отображает внутренние функции. И исправлять этот баг пока не собираются. Пруф: https [] connect.microsoft.com/SQLServer/feedback/details/688606/denali-ctp3-internal-system-fuctions-are-exposed-in-intellisence-hints
12. lucas_ 13 19.05.17 09:11 Сейчас в теме
То есть работать на решение поставленной задачи данная функция точно не будет?
13. SerVer1C 748 19.05.17 10:23 Сейчас в теме
(12) DECOMPRESSSCALAR - не будет. DECOMPRESS будет, если в нее передавать правильный GZIP. DECOMPRESS даже распакует архив, созданный в 7-zip с форматом GZIP и методом сжатия Deflate.
14. lucas_ 13 19.05.17 12:08 Сейчас в теме
Опять же мысли вслух - CRC есть функция сжатого бинарника? Возможно, ее имеет смысл просто вычислить средствами скуля? Вот здесь http://www.zlib.org/rfc-gzip.html#crc-code, на мой первый непросвещенный взгляд, все выглядит не очень страшно.
15. SerVer1C 748 19.05.17 13:00 Сейчас в теме
(14) CRC считается 25-ю строками кода - это не проблема. НО только CRC надо рассчитывать не от сжатых данных, а от исходных! А пока мы сжатые данные не распакуем, то не посчитаем CRC исходных данных. Вот такая вот рекурсия ))
16. Alligator84 74 24.06.17 17:45 Сейчас в теме
Есть ли возможность DECOMPRESS DT?
17. SerVer1C 748 26.06.17 11:08 Сейчас в теме
(16) Нет. Файл DT имеет сложную структуру. Вдоль и поперек данный формат исследовал пользователь awa. Почитайте его статьи.
Alligator84; +1 Ответить
19. user894822 15.01.18 17:36 Сейчас в теме
Попробовал скормить обработке свой сжатый файл - не работает, на выходе создаёт файл нулевой длины. При этом тот же файл корректно распаковывается онлайновым распаковщиком http://txtwizard.net/compression.
Платформа 8.3.10.2466.
26. markers 274 22.04.19 10:09 Сейчас в теме
Вдруг кому пригодится, результат использования данной публикации.
Автор, спасибо!
36. tr01egr 19.06.20 05:43 Сейчас в теме
Постучите, пожалуйста, в личку, отвечу на ваши вопросы по антидекомпилятору. К сожалению по другому не получается связаться.
37. dctvghbdtn 26.10.21 12:26 Сейчас в теме
"включенный режим использования синхронных вызовов расширений платформы и внешних компонент."
У вас используются какие-то внешние компоненты?
38. SerVer1C 748 26.10.21 12:42 Сейчас в теме
39. ZhokhovM 724 24.07.22 17:34 Сейчас в теме
У кого нибудь получилось скормить ХЗ сжатый файл и распаковать эсовским ХЗ? Поделитесь решением.
Например, записать байты в файл ААА
2 1 83 75 111 244 136 141 193 78 160 213 235 182 189 160 167 13 + все байты из сжатого файла выполненного обработкой 618906 (кнопка "сжать")
(поясние по байтам - 02 01 - хранилище сжато, следом идут 16 байт некой сигнатуры "SKoф€ЌБN Хл¶Ѕ §(прерыв строки)", за сигнатурой идет собственно сжатый deflate-ом поток")
и выполнить код на 1с для распаковки файла:
СтрокаBase64 = Base64Строка(Новый ДвоичныеДанные(ААА));
ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
НашеЗначение = ХЗ.Получить();
ошибка при получении значения ХЗ: "ошибка формата потока"
40. ZhokhovM 724 26.07.22 11:30 Сейчас в теме
Ошибка при сжатии файла размером 0:
Попытка записи в буфер, открытый только для чтения
{ВнешняяОбработка.DeflateInflate.Форма.Форма.Форма(303)}:Поток.Прочитать(БуферСжатыхДанных, 0, РазмерСжатогоФайла);
Есть способ исправления? Нужно сжать файл размером 0.
41. SerVer1C 748 26.07.22 16:09 Сейчас в теме
(40) Вы сами представляете, что хотите?
42. ZhokhovM 724 26.07.22 16:24 Сейчас в теме
(41)Представил, файл сжатый 1 кб распаковал обработкой, сжал распакованный файл 0 кб, при сжатии должно вернуть 1 кб, но увы ошибку выдает. Файл приложил.
Прикрепленные файлы:
users.usr
43. SerVer1C 748 26.07.22 16:36 Сейчас в теме
(42) Соберитесь, перечитайте несколько раз то, что написали... Ничего не смущает?
44. ZhokhovM 724 26.07.22 16:43 Сейчас в теме
(43)0 и 1 кб - это размер файла(распакованного и сжатого). приложенный файл имеет размер 1 кб и он сжат. при сжатии файл должен сжиматься. ничего из перечитанного и написанного не смущает.
45. SerVer1C 748 26.07.22 17:13 Сейчас в теме
(44) Я правильно понял, что сжатый файл размером X байт распаковался в 0 байт ? Если это так, нет ли у вас подозрений???
46. ZhokhovM 724 26.07.22 17:23 Сейчас в теме
(45)а, все понял, пардон, сжатый должен корректно распаковаться, а смотрел в сторону упаковки, думал сжать нулевой байт, моя ошибка.
47. vit59 57 17.03.23 11:26 Сейчас в теме
Спасибо автору !
Сильно помогло, все работает.
Нужно было сжать бинарное тело запроса перед отправкой.
Не думал что можно сжимать бинар на несколько порядков.
Суппер !!

PS: Имею ввиду вот ЭТО:

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


и обратно:
  СтрокаBase64 = Base64Строка(СжатыеДвоичныеДанные);
    ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
    НашеЗначение = ХЗ.Получить();
48. MiCe 12 26.06.23 06:14 Сейчас в теме
deflate на стороне сервера(mssql) да тут
49. SerVer1C 748 26.06.23 09:37 Сейчас в теме
(48) Начиная с 2016 скуля можно нативно распаковывать через DECOMPRESS, прицепив к deflate 10 байт заголовка GZip. См., например, тут
52. SerVer1C 748 21.07.23 09:42 Сейчас в теме
Мой алгоритм засветился в конференции для 1С специалистов от Рарус
TimkoNzt; ZhokhovM; +2 Ответить
Оставьте свое сообщение