Как получить сжатое значение ХЗ из внешней базы

Обсуждение различных вопросов, связанных с разработкой и эксплуатацией 1С-Предприятия 8.X
Ответить
JohnyDeath
Сообщения: 722
Зарегистрирован: 24 авг 2011, 15:32

Как получить сжатое значение ХЗ из внешней базы

Сообщение JohnyDeath »

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

Код: Выделить всё

//ДвоичныеДанные.Записать("F:\Отладка\ХЗБезСжатия.txt");

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

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


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

Код: Выделить всё

V8Unpack.exe -undeflate

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

Во вложении два файла с одними и теми же данными: в сжатом и несжатом виде.
Помогите получить данные из запакованного вида.
Вложения
РаспаковкаХранилища.rar
(1.43 КБ) 1312 скачиваний
Magister
Сообщения: 343
Зарегистрирован: 04 июн 2012, 09:28

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение Magister »

На обычный zlib не похоже... 1С и тут велосипед изобрели? :)
В реальності все не так, як насправді
awa
Сообщения: 42
Зарегистрирован: 24 авг 2011, 15:47

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение awa »

Подсмотрел у себя в исходниках 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
Сообщения: 722
Зарегистрирован: 24 авг 2011, 15:32

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение JohnyDeath »

Спасибо большое, будем пробовать.
JohnyDeath
Сообщения: 722
Зарегистрирован: 24 авг 2011, 15:32

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение JohnyDeath »

Рабочий код для потомков:

Код: Выделить всё

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

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

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

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

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

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

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

ЗначениеХЗ = ЗначениеИзСтрокиВнутр(ТекстХЗ);
JohnyDeath
Сообщения: 722
Зарегистрирован: 24 авг 2011, 15:32

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение JohnyDeath »

Тут небольшое продолжение истории. Один из регионов добавил в макет картинку и теперь код не работает.На последнем шаге, когда Двоичные данные читаю как текст, отсекаю начальные 9 символов и получаю данные через ЗначениеИзСтрокиВнутр. Выходит ошибка формата потока
Последний раз редактировалось JohnyDeath 07 ноя 2014, 16:46, всего редактировалось 1 раз.
awa
Сообщения: 42
Зарегистрирован: 24 авг 2011, 15:47

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение awa »

В этом файле на самом деле 2 файла, текстовый и картинка. В первых 8 байтах содержится длина первого файла, начиная с 9го байта надо читать именно столько байт. Если после этого еще останутся байты, то, вроде как там идут 4 нулевых байта, а затем 8 байт длины следующего файла.
Последний раз редактировалось awa 07 ноя 2014, 16:48, всего редактировалось 1 раз.
JohnyDeath
Сообщения: 722
Зарегистрирован: 24 авг 2011, 15:32

Re: Как получить сжатое значение ХЗ из внешней базы

Сообщение JohnyDeath »

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