gifts2017

Внешняя компонента для сжатия/распаковки файлов/строк по алгоритму Deflate и для создания/распаковки архивов GZip

Опубликовал Андрей Лукин (frkbvfnjh) в раздел Программирование - Внешние компоненты

Внешняя Native компонента для сжатия/распаковки файлов по алгоритму Deflate и для создания/распаковки архивов в формате GZip

Внешняя Native компонента для сжатия/распаковки файлов по алгоритму Deflate, в том числе сжатия/распаковки архивов в формате GZip. Внешняя компонента не содержит в себе файла zlib.dll и никаких других динамических библиотек и файлов, весь функционал самодостаточно включен во внешнюю компоненту. Решил наваять данную компоненту, когда начал делать что-то вроде V8Unpack, и столкнулся с тем, что часть внутренней структуры файлов 1С сжата алгоритмом Deflate, а распаковать их собственно нечем, да и запаковать обратно тоже (ну я, по крайней мере, не нашел чем). Кроме того, 1С планирует развитие средств работы с двоичными данными в платформе 8.3.9, в связи с чем, в недалеком будущем, утилиты вроде V8Unpack можно будет делать в виде обычных обработок, и не хватать функционала 1С будет как раз в плане сжатия и распаковки данных алгоритмом Deflate. Так вот для комфортной работы с Deflate я собственно и сделал данную компоненту, ну а если учесть, что архивы формата GZip (файлы с расширением GZ, если кто не в курсе) - это обычные файлы, сжатые как раз алгоритмом Deflate, просто имеющие дополнительно заголовок, в котором храниться вся информация о сжатом файле, то за одно решил включить в компоненту поддержку архивов формата GZip. С помощью данной компоненты, архивы формата GZip можно как распаковывать, так и создавать, после чего такие архивы нормально читаются любыми архиваторами, поддерживающими данный формат. Ради интереса также добавил непосредственное сжатие строк в двоичные данные, а также сжатие строк в двоичные данные закодированные в виде строки Base64. Т.к. передача двоичных данных из 1С во внешние компоненты не возможна, то распаковать сжатую строку из двоичных данных можно только передав ее в компоненту в виде строки Base64.  Толку конечно от данной функциональности по сжатию строк мало, но кто знает, может кому пригодиться. Так же заморочился на возможность асинхронного сжатия по алгоритму Deflate, опять же просто потому, что было интересно это сделать. Все выше описанные возможности продемонстрированы с помощью двух обработок, включенных в публикацию. Обработки идентичны по функционалу, одна для обычного приложения, другая для управляемого, работающего в асинхронном режиме.

Внешняя компонента написана по технологии Native API, имеет 9 методов и 1 свойство. Далее английское и русское имя метода/свойства буду разделять символом "|".

Методы:

1. CompressString|СжатьСтроку(<Строка>, <КодировкаANSI>) - Сжимает строку по алгоритму Deflate; 
Параметры: 
<Строка> - Тип Строка. Строка, которую необходимо сжать;
<КодировкаANSI> - Тип Булево. Если значение Истина, то предварительно выполняется преобразование строки в кодировку ANSI;
Возвращаемое значение: Тип ДвоичныеДанные. Сжатая строка в виде двоичных данных;

2. CompressStringBase64|СжатьСтрокуBase64(<Строка><КодировкаANSI>) - Сжимает строку по алгоритму Deflate; 
Параметры:
<Строка> - Тип Строка. Строка, которую необходимо сжать;
<КодировкаANSI> - Тип Булево. Если значение Истина, то предварительно выполняется преобразование строки в кодировку ANSI;
Возвращаемое значение: Тип Строка. Сжатая строка в формате Base64;

3. DecompressStringBase64|РаспаковатьСтрокуBase64(<Строка><КодировкаANSI>) - Распаковывает строку, сжатую по алгоритму Deflate.
Параметры:
<Строка> - Тип Строка. Двоичные данные строки в формате Base64 которую необходимо распаковать;
<КодировкаANSI> - Тип Булево. Если значение Истина, то предварительно выполняется преобразование строки в кодировку ANSI;
Возвращаемое значение: Тип Строка. Распакованная строка.

4. CompressFile|СжатьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ДописыватьВФайл>, <АсинхронныйРежим>) - Сжимает файл по алгоритму Deflate;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла, который необходимо сжать;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного сжатого файла;
<ДописыватьВФайл> - Тип Булево. Если Истина, то указанный файл будет сжиматься дописываясь к уже имеющемуся сжатому файлу. Таким образом можно сжать несколько файлов в один. Как вы потом будете их распаковывать, понятия не имею, но возможность есть на всякий случай.
<АсинхронныйРежим> - Тип Булево. Если Истина, то файл будет сжиматься асинхронно, т.е. после запуска сжатия можно будет продолжать работать в 1С параллельно. Так же будут генерироваться внешние события, с помощью которых можно будет отобразить движение индикатора на форме 1С.
Возвращаемое значение: Отсутствует.

5. DecompressFile|РаспаковатьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <АсинхронныйРежим>) - Распаковывает файл, сжатый по алгоритму Deflate;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла, который необходимо распаковать;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного распакованного файла;
<АсинхронныйРежим> - Тип Булево. Если Истина, то файл будет распаковываться асинхронно, т.е. после запуска распаковки можно будет продолжать работать в 1С параллельно. Так же будут генерироваться внешние события, с помощью которых можно будет отобразить движение индикатора на форме 1С.
Возвращаемое значение: Отсутствует.

6. CompressFileGZip|СжатьФайлGZip(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>) - Сжимает файл по алгоритму Deflate в архив формата GZip;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла, который необходимо поместить в архив;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного файла архива. В архиве данного формата всегда храниться только 1 файл.
Возвращаемое значение: Отсутствует.

7. DecompressArchiveGZip|РаспаковатьАрхивGZip(<ИмяФайлаИсточника>, <ИмяКаталогаПриемника>) - Распаковывает  архив GZip в указанный каталог;
Параметры:
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла архива, который необходимо распаковать;
<ИмяКаталогаПриемника> - Тип Строка. Полное имя конечного каталога, в который необходимо распаковать архив;
Возвращаемое значение: Отсутствует.

8. DecompressFileGZip|РаспаковатьФайлGZip(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>) - Распаковывает архив GZip в указанный файл;
Параметры: 
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла архива, который необходимо распаковать;
<ИмяФайлаПриемника> - Тип Строка. Полное имя конечного файла, в который необходимо распаковать архив;
Возвращаемое значение: Отсутствует.

9. InfoFileGZip|ИнформацияФайлаGZip(<ИмяФайлаИсточника>) - Получает информацию о файле в архиве;
Параметры: 
<ИмяФайлаИсточника> - Тип Строка. Полное имя файла архива;
Возвращаемое значение: Тип Строка. Строка содержащая информацию о файле в архиве в виде значений разделенных символом ";" (точка с запятой): ИмяФайла;РазмерИсходногоФайлаВБайтах;ДатаФайла;CRC;Комментарий
Комментарий может содержать знак разделителя, поэтому он расположен в самом конце, так что комментарием считается все, что расположено после 4-го разделителя.

Свойства:

1. Version|Версия - Тип Строка. Содержит версию компоненты в виде строки. Данное свойство доступно только для чтения.

С асинхронностью сжатия и распаковки архивов GZip заморачиваться не стал. Примеры использования всех методов и свойств приведены в прилагаемых обработках.

Update 2016.03.19
1. Переписал код компоненты: в за основу "ядра" компоненты теперь взял файл v8napi.pas из http://infostart.ru/public/81644/ и "скрестил" его с файлом v8napi.pas из http://infostart.ru/public/88060/
2. Добавил три новых метода:  СжатьСтроку, РаспаковатьАрхивGZipИнформацияФайлаGZip.

Update 2016.05.24
1. В виду требований Сбербанка (подробней читать в комментариях), доработал методы сжатия строк. В методы СжатьСтроку, СжатьСтрокуBase64 и РаспаковатьСтрокуBase64 добавлен 2-ой параметр <КодировкаANSI> - Тип Булево. Если значение Истина, то предварительно выполняется преобразование строки в кодировку ANSI (внешним программам как правило требуется сжатая строка именно в кодировке ANSI), иначе строка будет сжата в юникоде. Кроме того сжатие строк теперь выполняется по классическому алгоритму Deflate, а сжатие файлов по прежнему по алгоритму Deflate используемому в 1С для сжатия файлов собственного формата.

Кому интересно:
--> Внешняя Native компонента для распаковки RAR-архивов.
--> Внешняя компонента для создания/распаковки CAB-архивов.

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

Наименование Файл Версия Размер Кол. Скачив.
ZLib (обычное приложение)
.epf 104,86Kb
24.05.16
11
.epf 104,86Kb 11 Скачать
ZLib Async (управляемое приложение, асинхронный режим)
.epf 103,71Kb
24.05.16
9
.epf 103,71Kb 9 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Рудаков (fishca) 15.03.16 12:38
Исходники компоненты будут?
2. Никита Грызлов (nixel) 15.03.16 12:53
Добро пожаловать в клуб "Yet another unpack"
Скорость работы с тем же zlib сравнивали? Есть прирост?
3. Андрей Лукин (frkbvfnjh) 15.03.16 13:49
(1) fishca, нет, исходники пока выкладывать не буду :(
4. Андрей Лукин (frkbvfnjh) 15.03.16 13:51
(2) nixel, нет скорость не замерял, не думаю, что есть существенная разница
5. Алексей Шачнев (saa@kuzov.org) 15.03.16 15:03
В типовом примере ВК на ИТС показано, как передавать двоичные данные из ВК в 1С.
6. Сергей Рудаков (fishca) 15.03.16 16:28
(3) компонента писана на С++ или ???
7. Андрей Лукин (frkbvfnjh) 15.03.16 18:05
(5) saa@kuzov.org, оооо, спасибо, гляну, попробую разобраться
8. Андрей Лукин (frkbvfnjh) 15.03.16 18:05
(6) fishca, компонента написана на Delphi
9. biformatus (biformatus) 15.03.16 21:56
10. Алекс zhu4 (Arxxximed) 16.03.16 00:27
Так это же круто))) можно наконец сжатый http ответ дешифровывать . Или не получиться на лету?
11. Андрей Лукин (frkbvfnjh) 16.03.16 06:00
(10) Arxxximed, со сжатым http-ответом не работал, не знаю как там чего устроено, но если он приходит в виде сжатой строки в BASE64, то по крайней мере можно попробовать.
12. Андрей Лукин (frkbvfnjh) 16.03.16 06:19
(9) biformatus, я не знаю, что это за зверь efd, вернее не знаю как устроен этот формат, но обработкой он распаковался, правда что дальше делать с этим файлом, не понятно, видимо нужно знать формат распакованного efd.
13. Сергей Боровик (BorovikSV) 16.03.16 07:13
14. Александр Соломатин (v77) 16.03.16 08:50
Двоичные данные это VTYPE_BLOB.
function TV8UserObject.V8SetBlob(V: PV8Variant; Value: PByte;
Length: integer): boolean;
15. Андрей Лукин (frkbvfnjh) 16.03.16 09:12
(13) BorovikSV, да, спасибо, я тоже нарыл эту публикацию, но сам формат файла там не обсуждался :(
16. Андрей Лукин (frkbvfnjh) 16.03.16 10:50
(14) v77, да, большое спасибо, кажись это оно! Попробую допилить...
17. Игорь Steelvan (Steelvan) 16.03.16 13:15
Надо добавить возможность шифрования паролем, тогда можно получить симметричное шифрование без использования диска (сейчас нужен диск при использовании ZIP пароля).
18. Сергей Смирнов (Serginio) 16.03.16 16:17
(10) http://infostart.ru/public/466052/ Там есть пример использования сжатия трафика.

http://infostart.ru/public/448668/ в 35 есть пример сжатия разжатия
http://www.forum.mista.ru/topic.php?id=765672#72
19. Леонид Павлиенко (PLAstic) 16.03.16 17:16
В папке лежит архив формата gzip с одним файлом внутри. Пытаюсь извлечь файл с помощью РаспаковатьФайл. Спустя ожидание от 2 секунд до 5 минут задумчивости вылетает приятное окно с информированием, что "работа была завершена, перезапустить или завершить работу". Перезапуск не помогает, файл не распаковывается.
Проблема же метода РаспаковатьФайлGZip в том, что под него надо создавать папку из-за проблем с определением имени файла в архиве. Ну создали мы папку, есть на это СоздатьКаталог(). А удалить потом за собой чем?
Сделай функцию, возвращающую массив имён файлов внутри архива и возможность извлечения файла по имени.

Добавлено:
Метод РаспаковатьФайлGZip не работает. На том же архиве с одним файлом внутри. Просто ничего не распаковывает. При этом 7-zip нормально его распаковывает.
20. Андрей Лукин (frkbvfnjh) 17.03.16 05:59
(19) PLAstic, извините, но не совсем понятно, что Вы делаете. Из текста я понял, что вы gzip файл пытаетесь распаковать методом РаспаковатьФайл. Этот метод не может этого сделать. На данный момент это можно сделать только методом РаспаковатьФайлGZip. И да, за папками нужно следить из 1С самостоятельно, сама компонента ничего удалять не будет. Я добавлю метод получения имени файла и распаковку в файл для GZip. На файл который Вы пытаетесь распаковать я бы посмотрел. Если хотите отправьте мне на почту, я гляну.
21. Леонид Павлиенко (PLAstic) 21.03.16 10:00
(20) frkbvfnjh, подскажи, чем удалять папки из 1С?
22. Андрей Лукин (frkbvfnjh) 21.03.16 11:07
(21) PLAstic, Глобальный контекст (Global context)
УдалитьФайлы (DeleteFiles)
Синтаксис:

УдалитьФайлы(<Путь>, <Маска>)
Параметры:

<Путь> (обязательный)

Тип: Строка.
Путь к удаляемым файлам.
<Маска> (необязательный)

Тип: Строка.
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
23. Андрей Лукин (frkbvfnjh) 21.03.16 11:11
(21) PLAstic, кстати, я обновил публикацию и добавил новые методы, перечитайте публикацию
24. Леонид Павлиенко (PLAstic) 22.03.16 11:24
(22) frkbvfnjh, изучал недавно, но пропустил последнюю строку. Спасибо.
25. Женька Ture (ture) 19.04.16 18:57
Обрати свой взор на конфиг 1С8 хранящийся на sql. Ты его можешь читать и парсить теперь.
Собственно есть ссылка и имя объекта, надо вынуть УФ форму из соседней базы и нарисовать ее в текущей базе 1С (с представлениями на месте реквизитов объекта).
26. Андрей Лукин (frkbvfnjh) 20.04.16 05:54
(25) ture, А что такое
конфиг 1С8 хранящийся на sql?
Не совсем понимаю о чем речь, может ссылки по теме дадите...
27. Дмитрий Семенов (Sam13) 18.05.16 12:08
Коллеги, плиз, хелп!
Стоит задача подготовить препроводительную ведомость для сбербанка, данные которой должны быть закодированы также в двумерном штрихкоде.
Штрихкод формируется следующим образом:
- формируется XML-описание препроводительной ведомости
- к результирующему XML применяется deflate
- затем результат кодируется base64, к результирующей строке добавляется сигнатура @NN@ - номер версии формата. 01 или 02
c deflate и base64 возникли проблемы.

В инструкции сбербанка приведена закодированная строка (сжатая) и ее xml-исходник и команда проверки (linuxового шелла)
echo "@01@eJw9UMlugzAQvfcrkO/ENoZCpWFy6xe0Z+SAS1CMHWGKmr/vmM2nt4z­fLHD9G22ymCkM3tVMXgRLjGt9N7i+Zt9fn2nFkjBr12nrnamZ8+yK8GwW0yF­0etaYCalSkadZBnwVwDX+huVHkQtZlVIKehL4qpIXXuNDo8qLTOVR3ThMTXs­3M+aiFFklRaEqWdBHVah34LsJYWoxTH330wfgkYDz4+C0bR7engSp5UUICt8­5RJdGWIsWbWk/g9QE+EGiOr+eBuOkBz4DtnQa9OZtOAAKWniHEH7Hs2vEh0P­VfDvW2z8i03VO" | sed 's/@01@//' | base64 -d | zlib-flate -uncompress

Результат:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><p_ved><data>2013-04-22</data><n_ob>795401871100001</n_ob><n_symka>345234</n_symk­a><r_chet>40702810538150003536</r_chet><src>srgdfgs</src><no­minal_kol><nominal>100.00</nominal><kol>1</kol><valcode>810</valcode><valtype>01</v­altype></nominal_kol><symbols><symbol>02</symbol><sum>100.00</sum></symbols></p_ved>

Как я не бился, у меня не удается получить сходный результат.

Как получить результат, который был сходным со сбербанком? Имею ввиду именно кодирование deflate
28. Андрей Лукин (frkbvfnjh) 18.05.16 15:29
(27) Sam13, ща попробую помочь...
30. Дмитрий Семенов (Sam13) 19.05.16 09:58
(29) Serginio, спасибо, почти получилось.
Но я не понял все-таки как сделать deflate твоим (http://www.forum.mista.ru/topic.php?id=765672#61) способом.
Хелпани, плиз.
31. Сергей Смирнов (Serginio) 19.05.16 10:21
Если тебе нужно просто сжать данные и получить Base64

стр = "Строка для теста компрессии декомпрессии"; 
     
    // Получим используемые типы

    MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
    
    
    СжатыйПоток = врап.СоздатьОбъект(MemoryStream);//Поток куда запишутся сжатые данные

    
    
    zipStr = врап.СоздатьОбъект("System.IO.Compression.GZipStream", СжатыйПоток, CompressionMode.Compress);
    
    МассивДанных= UTF8.GetBytes(стр)// Получим массив данных используя кодировку  UTF8

    ПотокДляСжатия = Врап.СоздатьОбъект(MemoryStream,МассивДанных);  // Создадим поток из массива данных


    ПотокДляСжатия.CopyTo(zipStr);
    zipStr.Flush();// Сбросим данные в  СжатыйПоток

    zipStr.Close();// Закроем  GZipStream

    compressed = СжатыйПоток.ToArray();// Получим массив байт сжатых данных


    Convert=Врап.ПолучитьТип("System.Convert");
    стр64=Convert.ToBase64String(compressed);// Переведем сжатые данные в Base64
...Показать Скрыть
32. Сергей Смирнов (Serginio) 19.05.16 10:53
Для Deflate нужно использовать System.IO.Compression.DeflateStream

Заменить на

zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);
33. Дмитрий Семенов (Sam13) 19.05.16 13:55
Спасибо тебе за помощь. Алгоритм отработал нормально, выдал результат. Вот только он не совпадает с тем, что выдает linux

Вот код, который я исполняю в 1С:

Стр = "1234567890";
	
	Врап = Новый COMОбъект("NetObjectToIDispatch45");
	MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
	UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
	CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
	
	СжатыйПоток = врап.СоздатьОбъект(MemoryStream);//Поток куда запишутся сжатые данные

	zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);	
	
	МассивДанных= UTF8.GetBytes(стр);// Получим массив данных используя кодировку  UTF8
	ПотокДляСжатия = Врап.СоздатьОбъект(MemoryStream,МассивДанных);  // Создадим поток из массива данных
	ПотокДляСжатия.CopyTo(zipStr);
	zipStr.Flush();// Сбросим данные в  СжатыйПоток
	zipStr.Close();// Закроем  GZipStream
	
	compressed = СжатыйПоток.ToArray();// Получим массив байт сжатых данных
	
	Convert=Врап.ПолучитьТип("System.Convert");
	стр64=Convert.ToBase64String(compressed);// Переведем сжатые данные в Base64
...Показать Скрыть


Мне возвращается результат: MzQyNjE1M7ewNAAA

Если я делаю методом проверки сбербанка, (echo '1234567890'| zlib-flate -compress | base64), то мне возвращается результат: eJwzNDI2MTUzt7A04AIADUQCGA==
Если пытаюсь результирующую сжатую строку 1с сунуть в линукс, применяю echo 'MzQyNjE1M7ewNAAA'| base64 -d | zlib-flate -uncompress, получаю:
flate: inflate: dat a: incorrect header check

Ну и соответственно алгоритм 1С не может расшифровать строку, которая сжата командой линукс (eJwzNDI2MTUzt7A04AIADUQCGA==)

В чем может быть причина?
34. Сергей Смирнов (Serginio) 19.05.16 14:16
http://stackoverflow.com/questions/34387549/zlib-compression-incompatibile-c-vs-c-sharp-implementations

добавить файлы байты

public static byte[] DecompressZLibRaw(byte[] bCompressed)
{
    byte[] bHdr = new byte[] { 0x1F, 0x8b, 0x08, 0, 0, 0, 0, 0 };

    using (var sOutput = new MemoryStream()) 
    using (var sCompressed = new MemoryStream())
    {
        sCompressed.Write(bHdr, 0, bHdr.Length);
        sCompressed.Write(bCompressed, 0, bCompressed.Length);
        sCompressed.Position = 0;
        using (var decomp = new GZipStream(sCompressed, CompressionMode.Decompress))
        {
            decomp.CopyTo(sOutput);
        }
        return sOutput.ToArray();
    }
}
...Показать Скрыть
35. Дмитрий Семенов (Sam13) 19.05.16 17:08
Круто, спасибо. Я даже немножко что-то понял.
Только как это в мой код 1С сунуть?
36. Андрей Лукин (frkbvfnjh) 20.05.16 07:19
(35) Sam13, кажется я решил Вашу проблему. Если еще интересует могу компоненту допилить под Вас. Дело в том, что Deflate не так прост как кажется... На самом деле вариантов сжатия методом Deflate не меренное множество и в Вашем случае как раз используется самый простой, а я в компоненте использовал алгоритм который использует 1С в формате своих файлов. У меня получилось и сжать и распаковать Ваш xml, все хэш суммы совпали.
37. Дмитрий Семенов (Sam13) 20.05.16 09:14
(36) frkbvfnjh, буду очень признателен.
Думаю, что это будет полезно многим, т.к. сейчас сбер многих переводит на печатную форму со штрихкодами. Но для формирования предлагает свой софт.
Неудобно пользоваться еще одной программой, когда уже есть база 1С.
38. Андрей Лукин (frkbvfnjh) 20.05.16 13:03
(37) Sam13, Обработку с новой компонентой выслал Вам на почту. Проблема оказалась куда глубже чем просто алгоритм сжатия. Дело в том, что в Вашем примере текст должен быть именно в кодировке ANSI, а из 1С, строки можно передать только в уникоде, поэтому помимо смены алгоритма сжатия еще пришлось предварительно менять кодировку строк с UTF8 в ANSI, но в итоге все отработало как надо. В дальнейшем возможно обновлю публикацию и для каждой функции по сжатию строк добавлю аналоги с постфиксом "ANSI" и добавлю функции со стандартным алгоритмом Deflate. Надеюсь помог.
39. Андрей Лукин (frkbvfnjh) 20.05.16 13:10
(37) Sam13, кстати если работаете в управляемом приложении то перед тестирование предварительно удалите файлы из каталога %APPDATA%\1C\1Cv8\ExtCompT, по крайней мере удалите файл Arc1C.dll, а то 1С будет упорно использовать старую версию...
40. Дмитрий Шевченко (dshevchenko) 20.05.16 14:16
(38) frkbvfnjh, а можете выслать и мне исправленный вариант? У меня та же проблема, заморочки со Сбербанком.
41. Андрей Лукин (frkbvfnjh) 20.05.16 15:04
(40) dshevchenko, хорошо, скиньте почту
42. Дмитрий Шевченко (dshevchenko) 20.05.16 15:50
(41) frkbvfnjh, в профиле, d.shevchenko@pokupochka.ru , заранее спасибо.
43. Сергей Смирнов (Serginio) 20.05.16 16:55
(35)
Замени
UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;

на
UTF8=Врап.СоздатьОбъект("System.Text.Encoding",1251);
44. Дмитрий Шевченко (dshevchenko) 23.05.16 10:34
Ура, все работает! Тестовые xml, запакованные вашей исправленной
обработкой, нормально распаковываются Сбером. Огромное вам спасибо!
45. Андрей Лукин (frkbvfnjh) 23.05.16 11:13
(44) dshevchenko, спасибо за ответ. Тогда скоро обновлю публикацию...
46. Дмитрий Семенов (Sam13) 23.05.16 16:21
Подтверждаю, все работает. Большое спасибо.
Сбер принял штрихкод.
Постараюсь сделать публикацию по формированию ШК
47. Сергей Смирнов (Serginio) 23.05.16 17:47
34+ Если добавить заголовочные файлы то разжимает

врап=новый COMОбъект("NetObjectToIDispatch45");
	MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").GetEncoding(1251);
    Convert=Врап.ПолучитьТип("System.Convert");
	
	Загол= Convert.FromBase64String("H4sIAAAAAAA=");
    стр64="eJwzNDI2MTUzt7A04AIADUQCGA==";
	compressed=Convert.FromBase64String(стр64);
    
	
ПотокСжатыхДанных = врап.СоздатьОбъект(MemoryStream);
ПотокСжатыхДанных.Write(Загол, 0,   Загол.GetLength(0));
ПотокСжатыхДанных.Write(compressed, 0, compressed.GetLength(0));

ПотокСжатыхДанных.Position = 0;
GZipПоток =врап.СоздатьОбъект("System.IO.Compression.GZipStream",ПотокСжатыхДанных, CompressionMode.Decompress);
ПотокРазжатыхДанных = врап.СоздатьОбъект(MemoryStream);
GZipПоток.CopyTo(ПотокРазжатыхДанных);
Данные=ПотокРазжатыхДанных.ToArray();
 output = UTF8.GetString(Данные);

    Сообщить(output);
...Показать Скрыть
48. Андрей Лукин (frkbvfnjh) 24.05.16 02:25
49. Андрей Лукин (frkbvfnjh) 24.05.16 05:37
(46) Sam13, обновил публикацию. Можете заново скачать обработку, в новой версии исправил проблемы с кириллицей.
50. Виталий Васильев (vit-vas) 07.10.16 12:57
На 1С сервере 64 bit не работает что ли?
51. Андрей Лукин (frkbvfnjh) 10.10.16 05:50
(50) vit-vas, странно, в теории должно работать... Как проверю, отпишусь, по возможности исправлю.
52. biformatus (biformatus) 19.10.16 23:03
53. Андрей Лукин (frkbvfnjh) 20.10.16 06:25
(52) biformatus, дайте формат efd, я сделаю... Я нигде не нашел описания формата. На инфостарте есть плагин для тотал коммандера, но автор то исходник не даст и формат не расскажет, а реверсингом нет ни желания, ни времени, ни опыта заниматься..
54. Виталий Васильев (vit-vas) 07.11.16 00:25
(51) frkbvfnjh, будет версия 64 bit?
55. Андрей Лукин (frkbvfnjh) 07.11.16 11:34
(54) vit-vas, какая ошибка выходит? Теоретически должно все работать, у меня нет возможности проверить, т.к. нет 64-го сервера 1С.
56. Сергей Смирнов (Serginio) 07.11.16 12:26
Поставь 64 разрядного 8.3.9 клиента. Полезно для отладки
57. mbzapas 15.11.16 16:00
Что-то пошло не так...
Данные взяты из 1CD:
Исходная строка: {2,e0666db2-45d6-49b4-a200-061c6ba7d569,}
Упаковано компонентой: eJwdjAkKgDAQxPIgC1V60OdY7SvEvzcsA0vIDPtxcbDItMjL1CQKVW5BQ1ek­2yabFOuTxzu13WWV
h59+NrkRCpE=
Хранится в 1CD: e797f7WRTqqBmZlZSpKRrolpipmuiWWSiW6ikYGBroGZYbJZUqJ5iqmZpU4t­AA==

Это еще один вариант Deflate или неправильно пользуюсь компонентой?

P.S. на 64-bit текущая версия работать точно не может. :(
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа