Внешняя компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму Zlib, Deflate и GZip
Разработка - Разработка внешних компонент
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Внешняя 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. Переписал код компоненты: в за основу "ядра" компоненты теперь взял файл v8napi.pas из //infostart.ru/public/81644/ и "скрестил" его с файлом v8napi.pas из //infostart.ru/public/88060/
2. Добавил три новых метода: СжатьСтроку, РаспаковатьАрхивGZip, ИнформацияФайлаGZip.
1. В виду требований Сбербанка (подробней читать в комментариях), доработал методы сжатия строк. В методы СжатьСтроку, СжатьСтрокуBase64 и РаспаковатьСтрокуBase64 добавлен 2-ой параметр <КодировкаANSI> - Тип Булево. Если значение Истина, то предварительно выполняется преобразование строки в кодировку ANSI (внешним программам как правило требуется сжатая строка именно в кодировке ANSI), иначе строка будет сжата в юникоде.
1. Добавлена поддержка 64-х битной платформы. Тестировал на платформе 8.3.9.1850 (x64) в файловой базе в режиме предприятия. Возможности протестировать именно на сервере 1С x64 не было, т.к. нет денежек на серверный ключик, тем более x64.
1. Переписал бОльшую часть кода внешней компоненты. Переименовал некоторые методы, сделал новые методы, объединил несколько методов в один. Методы стали более понятными, функциональными и гибкими;
2. Переписаны примеры обработок с учетом изменений во внешней компоненте;
3. Откорректировал основной текст публикации, изменил описание методов внешней компоненты, так что просьба ОБЯЗАТЕЛЬНО перечитать текст публикации ЗАНОВО!;
Кому интересно:
--> Внешняя Native компонента для распаковки RAR-архивов.
--> Внешняя компонента для создания/распаковки CAB-архивов.
Вступайте в нашу телеграмм-группу Инфостарт
deflate zlib gzip сжатие распаковка архив Base64 gz Native API V8Unpack Decompress Compress Внешняя компонента Сбербанк rfc 1950 1951 1952
См. также
Разработка внешних компонент Телефония, SIP Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)
Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)
5246 руб.
04.05.2018 52198 128 68
Разработка внешних компонент Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)
Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).
5084 руб.
12.05.2020 34958 147 100
Разработка внешних компонент Инструментарий разработчика Разработчик 1С 8.3 Бесплатно (free)
Внешняя обработка проверяет выгрузку конфигурации, расширений и внешних обработок и находит места, где код руками делает то, что платформа умеет штатно: регулярки через COM, пауза пустым циклом, свой хеш и Base64, распаковка архивов программой, буфер обмена через HTML-поле. По каждой находке пишет, доступна ли замена на месте или мешает тонкий клиент.
13.10.2026 1337 145 nedomolkov.ivan 5
Разработка внешних компонент Разработчик 1С:Предприятие 8 Бесплатно (free)
Нативная внешняя компонента для 1С 8 для чтения файлов Excel без установленного Excel и делает это быстро, файл 68МБ загружается в таблицу значений ~1 секунду. Компонента поддерживает чтение двух форматов: Excel 2007+ и Excel 97-2003 Формат файла определяется автоматически по сигнатуре (первые 8 байт файла), а не по расширению. Позволяет открывать XLS и XLSX файлы и получать содержимое листов в виде ТаблицыЗначений или JSON-массива.
03.07.2026 2390 skyadmin 31
Разработка внешних компонент Разработчик 1С 8.3 Бесплатно (free)
В современных корпоративных решениях на платформе 1С:Предприятие 8.3 всё чаще возникает потребность в визуальном моделировании и автоматизации бизнес-процессов с использованием нотации BPMN 2.0. Стандартные средства платформы не предоставляют полноценного редактора BPMN, однако интеграция открытой библиотеки bpmn-js позволяет реализовать интерактивное моделирование бизнес-процессов непосредственно в 1С. В статье рассмотрены архитектура решения, пошаговая инструкция по сборке библиотеки из исходников для WebKit, а также примеры программного взаимодействия между 1С и JavaScript.
03.04.2026 4306 SultanovStas 8
Разработка внешних компонент Разработчик 1С 8.3 Россия Бесплатно (free)
Создать NativeAPI-компоненту для Python-скриптов? Это просто!
20.10.2025 11033 IlyaKuznetsov 10
Разработка внешних компонент Системный администратор Разработчик Стажер Бесплатно (free)
Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!
14.01.2025 8237 bayselonarrend 17
Разработка внешних компонент Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.
04.12.2024 13837 kovalevdmv 29
Проблема же метода РаспаковатьФайлGZip в том, что под него надо создавать папку из-за проблем с определением имени файла в архиве. Ну создали мы папку, есть на это СоздатьКаталог(). А удалить потом за собой чем?
Сделай функцию, возвращающую массив имён файлов внутри архива и возможность извлечения файла по имени.
Добавлено:
Метод РаспаковатьФайлGZip не работает. На том же архиве с одним файлом внутри. Просто ничего не распаковывает. При этом 7-zip нормально его распаковывает.
УдалитьФайлы (DeleteFiles)
Синтаксис:
УдалитьФайлы(<Путь>, <Маска>)
Параметры:
<Путь> (обязательный)
Тип: Строка.
Путь к удаляемым файлам.
<Маска> (необязательный)
Тип: Строка.
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
Собственно есть ссылка и имя объекта, надо вынуть УФ форму из соседней базы и нарисовать ее в текущей базе 1С (с представлениями на месте реквизитов объекта).
Стоит задача подготовить препроводительную ведомость для сбербанка, данные которой должны быть закодированы также в двумерном штрихкоде.
Штрихкод формируется следующим образом:
- формируется XML-описание препроводительной ведомости
- к результирующему XML применяется deflate
- затем результат кодируется base64, к результирующей строке добавляется сигнатура @NN@ - номер версии формата. 01 или 02
c deflate и base64 возникли проблемы.
В инструкции сбербанка приведена закодированная строка (сжатая) и ее xml-исходник и команда проверки (linuxового шелла)
echo "@01@eJw9UMlugzAQvfcrkO/ENoZCpWFy6xe0Z+SAS1CMHWGKmr/vmM2nt4z
Результат:
<?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
Как я не бился, у меня не удается получить сходный результат.
Как получить результат, который был сходным со сбербанком? Имею ввиду именно кодирование deflate
стр = "Строка для теста компрессии декомпрессии";
// Получим используемые типы
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 ПоказатьВот код, который я исполняю в 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==)
В чем может быть причина?
добавить файлы байты
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();
}
} ПоказатьДумаю, что это будет полезно многим, т.к. сейчас сбер многих переводит на печатную форму со штрихкодами. Но для формирования предлагает свой софт.
Неудобно пользоваться еще одной программой, когда уже есть база 1С.
обработкой, нормально распаковываются Сбером. Огромное вам спасибо!
врап=новый 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);
ПоказатьДанные взяты из 1CD:
Исходная строка: {2,e0666db2-45d6-49b4-a200-061c6ba7d569,}
Упаковано компонентой: eJwdjAkKgDAQxPIgC1V60OdY7SvEvzcsA0vIDPtxcbDItMjL1CQKVW5BQ1ek
h59+NrkRCpE=
Хранится в 1CD: e797f7WRTqqBmZlZSpKRrolpipmuiWWSiW6ikYGBroGZYbJZUqJ5iqmZpU4t
Это еще один вариант Deflate или неправильно пользуюсь компонентой?
P.S. на 64-bit текущая версия работать точно не может. :(
В моём случае сжатые данные поступают в формате zlib (см. rfc-1950), от чистого дефлета он отличается наличием 2-байтного заголовка в начале и 4-байтной контрольной суммы ADLER32 в конце. Поэтому мне приходится сначала отсекать заголовок zlib.
Функция РаспаковатьДвоичныеДанные(ДД, ZLIB)
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДД);
// Получить срез со смещением 2 байта, чтобы пропустить заголовок формата ZLIB (RFC-1950)
Срез = Буфер.ПолучитьСрез(2, Буфер.Размер - 2);
СтрокаBase64 = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(Срез);
Возврат ZLIB.РаспаковатьСтрокуBase64(СтрокаBase64);
КонецФункции
ПоказатьА контрольную сумму я даже не проверяю, т.к. средствами 1С она считается очень медленно. Когда я, в порядке прикола, написал свой собственный распаковщик дефлета на языке 1С, цикл вычисления контрольной суммы занимал 25% (!) общего времени выполнения. А полное время распаковки составляло что-то около 10 секунд на 50кб сжатых данных.
Но на 64-бит сервере такое решение всё равно не помогло, по-прежнему вылетает фатальная ошибка. Возможно, это потому, что на сервере я использую синхронную версию ВК?
И ещё одна странность обнаружилась. Если я сохраняю сжатые данные в файл (чистый дефлет), то ваша внешняя обработка этот файл успешно распаковывает. Но если я эти же данные перегоняю в base64 и пытаюсь распаковать функцией НачатьВызовРаспаковатьСтрокуBase64, то ВК выдает ошибку - на этот раз не фатальную, просто "Ошибка внешней компоненты".
Вообще, работа с буферами двоичных данных в платформе пока еще сыровата. Вот еще пример. Я читаю сжатые данные из внешнего источника (база MSSQL). В выборке из запроса поле blob возвращается в виде объекта ДвоичныеДанные. При попытке вызвать ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных() прямо по полю выборки, происходит фатальная ошибка (серверный процесс вылетает). А если поле выборки сначала присвоить промежуточной переменной, а потому уже получить буфер по этой переменной - тогда всё в порядке.
ОбъектAddIn.РаспаковатьФайл("C:\test1.", "C:\test1.txt", 2);ДвоичныеДанные = ОбъектAddIn.РаспаковатьДвоичныеДанные(ОтветHTTP.ПолучитьТелоКакДвоичныеДанные(), 2);
ИсходнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);Получаешь двоичныеданные из это файла и подсовываешь в РаспаковатьСтроку и получаешь Внешняя компонента : Data error.
Одинаковые алгоритмы используются в этих методах?
Интересует ваша модификация v8napi.pas для своих разработок внешних компонент на Delphi.
Как можно приобрести?
ПодключитьAddInИзМакета("МакетAddIn", "Arc1Cx86", "ZLib");
УстановитьВнешнююКомпоненту("ОбщийМакет.Arc1C");
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.Arc1C", "ZLib", ТипВнешнейКомпоненты.Native);
Если ПодключениеВыполнено Тогда
Попытка
ОбъектAddIn = Новый("AddIn.Arc1C.ZLib");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли; Показать1. Создал общий макет(двоичные данные), Arc1C. Поместил zip архив компоненты, как положено
2. Выполняю установку методом УстановитьВнешнююКомпоненту("ОбщийМакет.Arc1C"); - ВСЕ ОК, внешняя компонента спешно установлена. В папке ExtCompT появился Arc1Cx86.dll
3. Выполняю подключение - ПодключитьВнешнююКомпоненту("ОбщийМакет.Arc1C", "ZLib", ТипВнешнейКомпоненты.Native); - ВСЕ ОК
4. Пытаюсь создать объект Новый("AddIn.Arc1C.ZLib"); - ОШИБКА Тип не определен (AddIn.Arc1C.ZLib)
Я давно не работал с ВК, предполагал, что мой порядок действий неверный, но проверил на ВК от печати штрихкода - все заработало. В 8.3 подключение ВК происходит через ОписаниеОповещения, но неужели только из за этого не получится создать объект в 8.2..?
Подскажите пожалуйста, почему не хочет работать с моими данными. Судя по заголовкам и расшифровке на сайте там json сжатый gzip.
Приложил тело в двоичных данных и строкой, посмотрите пож., замучался уже с ним. Ошибка компоненты пишет
ДвоичныеДанные.txt
ТелоЗапросаСтрока.txt
При считывании данных со штрихкода (прикрепил файл) получаю строку с заголовком (WB12),
данными в base64 (eNpbFhul,GQjc-K8JXt-mCgfYDJg1PQKmrIUJ8FAMyAoKIDMZRSEgjIGlgsMKxg4HRj4mRkXMHgwMBxg
и секцией окончания (.).
После преобразовываю строку из base64 в двоичные данные с помощью метода Base64Значение().
Есть ли возможность разархивировать двоичные данные с помощью вашей обработки (алгоритм RFC 1950) ?
Если да, то возможно ли ее приобрести не за стартмани ?
После нескольких использований компоненты падает серверная часть платформы (rphost)...
Под 8.3.19 все работало нормально.
Есть идеи из-за чего это может быть?
В общем модуле сделана функция, а сама компонента залита в общий макет.
После 8-10 вызовов все падает.
Функция РаспаковатьДД(ДД) Экспорт
Попытка
AddinArc1CZlib = Новый("Addin.Arc1C.Zlib");
Исключение
ПодключитьВнешнююКомпоненту("ОбщийМакет.МакетAddIn_ZLIB", "Arc1C", ТипВнешнейКомпоненты.Native);
AddinArc1CZlib = Новый("Addin.Arc1C.Zlib");
КонецПопытки;
ДД2 = AddinArc1CZlib.РаспаковатьДвоичныеДанные(ДД, 0);
AddinArc1CZlib = 0;
Возврат ДД2;
КонецФункции
ПоказатьДобрый день! Решение не нашли? аналогичная ситуация возникает...
Не подскажете утилиту? Что-то поиск по Zlib скудноват.
А вот автоматическая кроссплатформенная сборка стала для меня относительно новой областью знаний. Но, с помощью cmake и такой-то матери, я ее осилил.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 487987
Создание 15.03.16 09:16
Обновление 08.07.22 09:03
Просмотры 51011
Загрузки 194
Рейтинг
55
Комментарии 129
Код открыт Нет
Рубрики Разработка внешних компонент
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)