Снегопат
https://snegopat.ru/forum/

Как получить сжатое значение ХЗ из внешней базы
https://snegopat.ru/forum/viewtopic.php?f=6&t=593
Страница 1 из 1

Автор:  JohnyDeath [ 04 апр 2014, 15:13 ]
Заголовок сообщения:  Как получить сжатое значение ХЗ из внешней базы

Есть база 1С, в одной из таблиц которой есть колонка с типом ХранилищеЗначений.
Подключаюсь к этой базе из другой с помощью "Внешних источников данных" и возникает проблема с получением данных из этого типа.
Вариант № 1. Мы не сжимаем данные при помещении в хранилище.
Тогда все просто: текст из несжатого файла за исключением первых 11 символов может быть преобразован в значение 1с при помощи функции ЗначениеИзСтрокиВнутр(). Примерно так:
Код:
//ДвоичныеДанные.Записать("F:\Отладка\ХЗБезСжатия.txt");

ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.Прочитать("F:\Отладка\ХЗБезСжатия.txt",КодировкаТекста.UTF8);
ТекстХЗ = ТекстДок.ПолучитьТекст();
ТекстХЗ = Прав(ТекстХЗ,СтрДлина(ТекстХЗ)-11);

ЗначениеХЗ = ЗначениеИзСтрокиВнутр(ТекстХЗ);


Вариант № 2. При записи в таблицу мы сжимаем данные встроенным объектом "СжатиеДанных".
Как получить данные в этом случае - непонятно. Вроде бы это должен быть " Deflation", но
Код:
V8Unpack.exe -undeflate

говорит, что это не v8-формат

Во вложении два файла с одними и теми же данными: в сжатом и несжатом виде.
Помогите получить данные из запакованного вида.

Вложения:
РаспаковкаХранилища.rar [1.43 КБ]
Скачиваний: 878

Автор:  Magister [ 04 апр 2014, 16:02 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

На обычный zlib не похоже... 1С и тут велосипед изобрели? :)

Автор:  awa [ 04 апр 2014, 16:09 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

Подсмотрел у себя в исходниках Tool_1CD.
Если хранилище начинается с 01 01 - хранилище не сжато. Если с 02 01 - хранилище сжато. в таком случае следом идут 16 байт некой сигнатуры (зачем это - не знаю)
0x53,0x4b,0x6f,0xf4,0x88,0x8d,0xc1,0x4e,0xa0,0xd5,0xeb,0xb6,0xbd,0xa0,0xa7,0x0d
Возможно, это не сигнатура, и что-то она означает, однако, других значений я не встречал.
А вот уже следом за этой сигнатурой идет собственно сжатый deflate-ом поток. Т.е. нужно взять все байты, начиная с 19-го и до конца файла и распаковать.
Для распаковки с помощью v8Unpack версии 2.0 надо использовать команду -i (inflate).

Автор:  JohnyDeath [ 04 апр 2014, 16:24 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

Спасибо большое, будем пробовать.

Автор:  JohnyDeath [ 07 апр 2014, 10:07 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

Рабочий код для потомков:
Код:
ИмяФайлаХЗ = "...\Отладка\ТекстХЗ.txt";
ИмяРаспакованногоФайлаХЗ = "...\Отладка\ТекстХЗРаспакованный.txt";

ДвоичныеДанные.Записать(ИмяФайлаХЗ);

ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.Прочитать(ИмяФайлаХЗ,КодировкаТекста.ANSI,"");//3-ий параметр обязательный, иначе 1с дописывает лишние байты из-за переносов строк
ТекстХЗ = ТекстДок.ПолучитьТекст();
ТекстХЗ = Прав(ТекстХЗ,СтрДлина(ТекстХЗ)-18);

ТекстДок.УстановитьТекст(ТекстХЗ);
ТекстДок.Записать(ИмяФайлаХЗ,КодировкаТекста.ANSI,"");//3-ий параметр обязательный, иначе 1с дописывает лишние байты из-за переносов строк

СтрокаДляЗаписи = "...\V8Unpack.exe -i """ + ИмяФайлаХЗ + """ """ + ИмяРаспакованногоФайлаХЗ + """";

ЗапуститьПриложение(СтрокаДляЗаписи,,Истина);

ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.Прочитать(ИмяРаспакованногоФайлаХЗ,КодировкаТекста.UTF8);
ТекстХЗ = ТекстДок.ПолучитьТекст();
ТекстХЗ = Прав(ТекстХЗ,СтрДлина(ТекстХЗ)-9);

ЗначениеХЗ = ЗначениеИзСтрокиВнутр(ТекстХЗ);

Автор:  JohnyDeath [ 07 ноя 2014, 15:57 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

Тут небольшое продолжение истории. Один из регионов добавил в макет картинку и теперь код не работает.На последнем шаге, когда Двоичные данные читаю как текст, отсекаю начальные 9 символов и получаю данные через ЗначениеИзСтрокиВнутр. Выходит ошибка формата потока

Автор:  awa [ 07 ноя 2014, 16:40 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

В этом файле на самом деле 2 файла, текстовый и картинка. В первых 8 байтах содержится длина первого файла, начиная с 9го байта надо читать именно столько байт. Если после этого еще останутся байты, то, вроде как там идут 4 нулевых байта, а затем 8 байт длины следующего файла.

Автор:  JohnyDeath [ 07 ноя 2014, 16:46 ]
Заголовок сообщения:  Re: Как получить сжатое значение ХЗ из внешней базы

Спасибо большое!
Получилось вытащить всю информацию в 1с

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/