Снегопат 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-формат Во вложении два файла с одними и теми же данными: в сжатом и несжатом виде. Помогите получить данные из запакованного вида.
|
Автор: | 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/ |