Снегопат

Обсуждение Снегопата
Текущее время: 28 мар 2024, 12:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 04 апр 2014, 15:13 
Не в сети

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

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

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


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

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

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


Вложения:
РаспаковкаХранилища.rar [1.43 КБ]
Скачиваний: 620
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 16:02 
Не в сети

Зарегистрирован: 04 июн 2012, 09:28
Сообщения: 343
На обычный zlib не похоже... 1С и тут велосипед изобрели? :)

_________________
В реальності все не так, як насправді


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 16:09 
Не в сети

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 16:24 
Не в сети

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2014, 10:07 
Не в сети

Зарегистрирован: 24 авг 2011, 15:32
Сообщения: 722
Рабочий код для потомков:
Код:
ИмяФайлаХЗ = "...\Отладка\ТекстХЗ.txt";
ИмяРаспакованногоФайлаХЗ = "...\Отладка\ТекстХЗРаспакованный.txt";

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

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 ноя 2014, 15:57 
Не в сети

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


Последний раз редактировалось JohnyDeath 07 ноя 2014, 16:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 ноя 2014, 16:40 
Не в сети

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


Последний раз редактировалось awa 07 ноя 2014, 16:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 ноя 2014, 16:46 
Не в сети

Зарегистрирован: 24 авг 2011, 15:32
Сообщения: 722
Спасибо большое!
Получилось вытащить всю информацию в 1с


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB