Внешняя Native компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму zlib (RFC 1950), deflate (RFC 1951) и gzip (RFC 1952). Внешняя компонента не содержит в себе файла zlib.dll и никаких других динамических библиотек и файлов, весь функционал самодостаточно включен во внешнюю компоненту.
Решил наваять данную компоненту, когда начал делать что-то вроде V8Unpack, и столкнулся с тем, что часть внутренней структуры файлов 1С сжата алгоритмом deflate, а распаковать их собственно нечем, да и запаковать обратно тоже (ну я, по крайней мере, не нашел чем). Кроме того, в 1С появилась возможность работы с двоичными данными начиная с платформы 8.3.9, в связи с чем, утилиты вроде V8Unpack можно делать в виде обычных обработок, и не хватает функционала как раз в плане сжатия и распаковки данных алгоритмом deflate.
Так вот для комфортной работы с deflate я собственно и сделал данную компоненту, ну а если учесть, что файлы формата zlib и архивы формата gzip (файлы с расширением .gz, если кто не знает) - это обычные файлы, сжатые как раз алгоритмом deflate, просто имеющие дополнительно заголовки со служебной информацией о сжатом файле, то за одно решил включить в компоненту поддержку данных форматов. С помощью данной компоненты, архивы формата gzip можно как распаковывать, так и создавать, после чего такие архивы нормально читаются любыми архиваторами, поддерживающими данный формат. Ради интереса также добавил непосредственное сжатие строк и двоичных данных. Как показала практика, многим часто требуется распаковать сжатые строки и данные полученные из внешних источников (например из банка) или запаковать строку и двоичные данные для отправки.
Так же я заморочился на возможность асинхронного сжатия/распаковки файлов, опять же просто потому, что было интересно это сделать. Все выше описанные возможности продемонстрированы с помощью двух обработок, включенных в публикацию. Обработки идентичны по функционалу, одна для обычного приложения, другая для управляемого, работающего в асинхронном режиме.
Внешняя компонента написана по технологии Native API. Есть поддержка 64-х битной платформы. Далее английское и русское имя метода/свойства буду разделять символом "|".
Методы:
1. CompressString|СжатьСтроку(<Строка>, <КодировкаANSI>, <АлгоритмСжатия>) - Сжимает строку по алгоритму Deflate;
Параметры:
<Строка> - Тип Строка. Строка, которую необходимо сжать;
<КодировкаANSI> - Тип Булево. Параметр не обязательный, значение по умолчанию Ложь. Если значение Истина, то предварительно, внешней компонентой, выполняется преобразование строки в кодировку ANSI. По умолчанию смена кодировки не производится. Многие внешние приложения сжимают и принимают сжатые строки именно в кодировке ANSI, поэтому был добавлен данный параметр.
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает какой использовать алгоритм сжатия. Возможные значения:
> "zlib" или 0 - алгоритм zlib (RFC 1950);
> "deflate" или 1 - алгоритм deflate (RFC 1951);
> "gzip" или 2 - алгоритм gzip (RFC 1952);
Для строковых значений параметра регистр не имеет значения. Рекомендации по использованию данного параметра будут представлены ниже, в конце публикации.
Возвращаемое значение: Тип ДвоичныеДанные. Сжатая строка в виде двоичных данных;
2. DecompressString|РаспаковатьСтроку(<Строка>, <КодировкаANSI>, <АлгоритмСжатия>) - Распаковывает строку, сжатую по алгоритму Deflate.
Параметры:
<Строка> - Тип Двоичные данные, Строка. Двоичные данные сжатой строки которую необходимо распаковать. Поддержка передачи двоичных данных в качестве параметров внешних компонент платформой 1С появилась только начиная с версии 8.3.10.2168, поэтому если компонента будет использоваться на версии платформы ниже указанной, то двоичные данные можно передать в компоненту в виде строки Base64, полученной с помощь функции 1С Base64Строка(). При этом внешняя компонента сама предварительно преобразует строку в двоичные данные;
<КодировкаANSI> - Тип Булево. Если значение Истина, то после распаковки строки, внешней компонентой, выполняется преобразование строки из кодировки ANSI в кодировку 1С;
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает каким алгоритмом были сжаты данные. Возможные значения описаны выше.
Возвращаемое значение: Тип Строка. Распакованная строка.
3. CompressBinData|СжатьДвоичныеДанные(<ДвоичныеДанные>, <АлгоритмСжатия>) - Сжимает двоичные данные по алгоритму Deflate;
Параметры:
<ДвоичныеДанные> - Тип ДвоичныеДанные. Двоичные данные, которые необходимо сжать;
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает какой использовать алгоритм сжатия. Возможные значения описаны выше.
4. DecompressBinData|РаспаковатьДвоичныеДанные(<ДвоичныеДанные>, <АлгоритмСжатия>) - Распаковывает двоичные данные, сжатые по алгоритму Deflate. Возможные значения описаны выше.
Параметры:
<ДвоичныеДанные> - Тип ДвоичныеДанные, Строка. Сжатые двоичные данные которые необходимо распаковать. Поддержка передачи двоичных данных в качестве параметров внешних компонент платформой 1С появилась только начиная с версии 8.3.10.2168, поэтому если компонента будет использоваться на версии платформы ниже указанной, то двоичные данные можно передать в компоненту в виде строки Base64, полученной с помощь функции 1С Base64Строка(). При этом внешняя компонента сама предварительно преобразует строку в двоичные данные;
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает каким алгоритмом были сжаты данные. Возможные значения описаны выше.
Возвращаемое значение: Тип Строка. Распакованная строка.
5. CompressFile|СжатьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <Перезаписывать>, <АлгоритмСжатия>, <Комментрий>, <АсинхронныйРежим>) - Сжимает файл по алгоритму Deflate;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла, который необходимо сжать;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного сжатого файла;
<Перезаписывать> - Тип Булево. Параметр не обязательный, значение по умолчанию Истина, т.е. в случае, если конечный файл уже существует, то он будет перезаписан. Если Ложь, то указанный файл будет сжиматься дописываясь к уже имеющемуся сжатому файлу. Таким образом можно сжать несколько файлов в один. Как вы потом будете их распаковывать, понятия не имею, но возможность такая есть.
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает какой использовать алгоритм сжатия. Возможные значения описаны выше.
<Комментарий> - Тип Строка. Параметр не обязательный, значение по умолчанию "" (пустая строка). Комментарий файла в архиве gzip. Имеет значение только если используется алгоритм сжатия gzip, в противном случае игнорируется.
<АсинхронныйРежим> - Тип Булево. Параметр не обязательный, значение по умолчанию Ложь. Если Истина, то файл будет сжиматься асинхронно, т.е. после запуска сжатия можно будет продолжать работать в 1С параллельно. Так же будут генерироваться внешние события, с помощью которых можно будет отобразить движение индикатора на форме 1С.
Возвращаемое значение: Отсутствует.
6. DecompressFile|РаспаковатьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <АлгоритмСжатия>, <АсинхронныйРежим>) - Распаковывает файл, сжатый по алгоритму Deflate;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла, который необходимо распаковать;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного распакованного файла;
<АлгоритмСжатия> - Тип Число, Строка. Параметр не обязательный, значение по умолчанию 0. Указывает каким алгоритмом были сжаты данные. Возможные значения описаны выше.
<АсинхронныйРежим> - Тип Булево. Если Истина, то файл будет распаковываться асинхронно, т.е. после запуска распаковки можно будет продолжать работать в 1С параллельно. Так же будут генерироваться внешние события, с помощью которых можно будет отобразить движение индикатора на форме 1С.
Возвращаемое значение: Отсутствует.
7. GetInfoFileGZip|ИнформацияФайлаGZip(<ИмяФайлаИсточника>, <ВФорматеJSON>) - Получает информацию о файле в архиве;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла архива;
<ВФорматеJSON> - Тип Булево. Истина - результат будет возвращен в формате JSON; Ложь - результат будет возвращен в формате XML;
Возвращаемое значение: Тип Строка. Строка содержащая информацию о файле в формате JSON или XML.
Пример результата в формате JSON: {"InfoData":{"FileName":"1.txt","FileSize":27743,"Date":"30.01.2018 10:54:55","CRC":0EE76F03,"Comment":"Комментарий"}}
Пример результата в формате XML: <InfoData><FileName>1.txt</FileName><FileSize>27743</FileSize><Date>30.01.2018 10:54:55</Date><CRC>0EE76F03</CRC><Comment>Комментарий</Comment></InfoData>
Свойства:
1. Version|Версия - Тип Строка. Содержит версию компоненты в виде строки. Данное свойство доступно только для чтения. Текущая версия 5.0. Просьба обращать внимание какую версию возвращает данное свойство (отображается в заголовке скачанной обработки), особенно это касается работы обработки в режиме управляемого приложения. Если вы уже скачивали данную внешнюю компоненту, то при открытии обработки, платформа может загружать старую версию компоненты. Для удаления старой версии необходимо очистить каталог %APPDATA%\1C\1Cv8\ExtCompT, после чего платформа предложит установить внешнюю компоненту заново.
Общая рекомендация по использованию параметра <АлгоритмСжатия> такова: если вы получили сжатые данные из внешнего источника и Вам сказали, что данные сжаты алгоритмом deflate, то для распаковки попробуйте в методе распаковки указать значение параметра <АлгоритмСжатия> равное 1 или "deflate". Если при распаковке внешняя компонента выдала ошибку, то скорее всего Вам дали данные не в чистом deflate (RFC 1951), а в формате zlib (RFC 1950) или gzip (RFC 1952). Данные в этих форматах тоже сжаты алгоритмом deflate, но имеют заголовки и другую служебную информацию. Поэтому при распаковке можете поэкспериментировать, указывая поочерёдно каждый алгоритм. Для сжатия и распаковки файлов из которых состоит внутренняя структура отчетов, обработок и др. файлов 1С, нужно устанавливать значение параметра <АлгоритмСжатия> в значение 1 или "deflate", что я и делал при сборке и разборке внешних обработок 1С. Что касается сжатия/распаковки строк для Сбербанка, то нужно использовать метод СжатьСтроку/РаспаковатьСтроку, с включенной кодировкой ANSI и алгоритмом сжатия Zlib.
Примеры асинхронного сжатия/распаковки и использования всех описанных методов и свойств приведены в прилагаемых обработках. В планах развития внешней компоненты, добавить возможность указания степени сжатия (сейчас используется степень сжатия по у молчанию);
1. Переписал бОльшую часть кода внешней компоненты. Переименовал некоторые методы, сделал новые методы, объединил несколько методов в один. Методы стали более понятными, функциональными и гибкими;
2. Переписаны примеры обработок с учетом изменений во внешней компоненте;
3. Откорректировал основной текст публикации, изменил описание методов внешней компоненты, так что просьба ОБЯЗАТЕЛЬНО перечитать текст публикации ЗАНОВО!;
Кому интересно:
--> Внешняя Native компонента для распаковки RAR-архивов.
--> Внешняя компонента для создания/распаковки CAB-архивов.