bdd2

Внешняя компонента для сжатия/распаковки файлов/строк по алгоритму 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
14
.epf 104,86Kb 14 Скачать
ZLib Async (управляемое приложение, асинхронный режим)
.epf 103,71Kb
24.05.16
12
.epf 103,71Kb 12 Скачать

См. также

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

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

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

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

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

Тип: Строка.
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
23. Андрей Лукин (frkbvfnjh) 193 21.03.16 11:11 Сейчас в теме
(21) PLAstic, кстати, я обновил публикацию и добавил новые методы, перечитайте публикацию
24. Леонид Павлиенко (PLAstic) 60 22.03.16 11:24 Сейчас в теме
(22) frkbvfnjh, изучал недавно, но пропустил последнюю строку. Спасибо.
25. Женька Ture (ture) 537 19.04.16 18:57 Сейчас в теме
Обрати свой взор на конфиг 1С8 хранящийся на sql. Ты его можешь читать и парсить теперь.
Собственно есть ссылка и имя объекта, надо вынуть УФ форму из соседней базы и нарисовать ее в текущей базе 1С (с представлениями на месте реквизитов объекта).
26. Андрей Лукин (frkbvfnjh) 193 20.04.16 05:54 Сейчас в теме
(25) ture, А что такое
конфиг 1С8 хранящийся на sql?
Не совсем понимаю о чем речь, может ссылки по теме дадите...
27. Дмитрий Семенов (Sam13) 196 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) 193 18.05.16 15:29 Сейчас в теме
(27) Sam13, ща попробую помочь...
29. Сергей Смирнов (Serginio) 498 18.05.16 16:46 Сейчас в теме
30. Дмитрий Семенов (Sam13) 196 19.05.16 09:58 Сейчас в теме
(29) Serginio, спасибо, почти получилось.
Но я не понял все-таки как сделать deflate твоим (http://www.forum.mista.ru/topic.php?id=765672#61) способом.
Хелпани, плиз.
31. Сергей Смирнов (Serginio) 498 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) 498 19.05.16 10:53 Сейчас в теме
Для Deflate нужно использовать System.IO.Compression.DeflateStream

Заменить на

zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);
33. Дмитрий Семенов (Sam13) 196 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) 498 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) 196 19.05.16 17:08 Сейчас в теме
Круто, спасибо. Я даже немножко что-то понял.
Только как это в мой код 1С сунуть?
36. Андрей Лукин (frkbvfnjh) 193 20.05.16 07:19 Сейчас в теме
(35) Sam13, кажется я решил Вашу проблему. Если еще интересует могу компоненту допилить под Вас. Дело в том, что Deflate не так прост как кажется... На самом деле вариантов сжатия методом Deflate не меренное множество и в Вашем случае как раз используется самый простой, а я в компоненте использовал алгоритм который использует 1С в формате своих файлов. У меня получилось и сжать и распаковать Ваш xml, все хэш суммы совпали.
37. Дмитрий Семенов (Sam13) 196 20.05.16 09:14 Сейчас в теме
(36) frkbvfnjh, буду очень признателен.
Думаю, что это будет полезно многим, т.к. сейчас сбер многих переводит на печатную форму со штрихкодами. Но для формирования предлагает свой софт.
Неудобно пользоваться еще одной программой, когда уже есть база 1С.
38. Андрей Лукин (frkbvfnjh) 193 20.05.16 13:03 Сейчас в теме
(37) Sam13, Обработку с новой компонентой выслал Вам на почту. Проблема оказалась куда глубже чем просто алгоритм сжатия. Дело в том, что в Вашем примере текст должен быть именно в кодировке ANSI, а из 1С, строки можно передать только в уникоде, поэтому помимо смены алгоритма сжатия еще пришлось предварительно менять кодировку строк с UTF8 в ANSI, но в итоге все отработало как надо. В дальнейшем возможно обновлю публикацию и для каждой функции по сжатию строк добавлю аналоги с постфиксом "ANSI" и добавлю функции со стандартным алгоритмом Deflate. Надеюсь помог.
39. Андрей Лукин (frkbvfnjh) 193 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) 193 20.05.16 15:04 Сейчас в теме
(40) dshevchenko, хорошо, скиньте почту
42. Дмитрий Шевченко (dshevchenko) 20.05.16 15:50 Сейчас в теме
(41) frkbvfnjh, в профиле, d.shevchenko@pokupochka.ru , заранее спасибо.
43. Сергей Смирнов (Serginio) 498 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) 193 23.05.16 11:13 Сейчас в теме
(44) dshevchenko, спасибо за ответ. Тогда скоро обновлю публикацию...
46. Дмитрий Семенов (Sam13) 196 23.05.16 16:21 Сейчас в теме
Подтверждаю, все работает. Большое спасибо.
Сбер принял штрихкод.
Постараюсь сделать публикацию по формированию ШК
47. Сергей Смирнов (Serginio) 498 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) 193 24.05.16 02:25 Сейчас в теме
49. Андрей Лукин (frkbvfnjh) 193 24.05.16 05:37 Сейчас в теме
(46) Sam13, обновил публикацию. Можете заново скачать обработку, в новой версии исправил проблемы с кириллицей.
50. Виталий Васильев (vit-vas) 07.10.16 12:57 Сейчас в теме
На 1С сервере 64 bit не работает что ли?
51. Андрей Лукин (frkbvfnjh) 193 10.10.16 05:50 Сейчас в теме
(50) vit-vas, странно, в теории должно работать... Как проверю, отпишусь, по возможности исправлю.
52. biformatus (biformatus) 19.10.16 23:03 Сейчас в теме
53. Андрей Лукин (frkbvfnjh) 193 20.10.16 06:25 Сейчас в теме
(52) biformatus, дайте формат efd, я сделаю... Я нигде не нашел описания формата. На инфостарте есть плагин для тотал коммандера, но автор то исходник не даст и формат не расскажет, а реверсингом нет ни желания, ни времени, ни опыта заниматься..
54. Виталий Васильев (vit-vas) 07.11.16 00:25 Сейчас в теме
(51) frkbvfnjh, будет версия 64 bit?
55. Андрей Лукин (frkbvfnjh) 193 07.11.16 11:34 Сейчас в теме
(54) vit-vas, какая ошибка выходит? Теоретически должно все работать, у меня нет возможности проверить, т.к. нет 64-го сервера 1С.
56. Сергей Смирнов (Serginio) 498 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 текущая версия работать точно не может. :(
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа