Имя: Пароль:
1C
1С v8
Как получить данные из поля с типом ХранилищеЗначений со сжатием через SQL?
0 sereban
 
04.04.14
14:03
Необходимо получить данные записанные в поле с типом ХранилищеЗначений через внешний источник данных. Т.е. к одной базе 1с подключена таблица другой базы 1с через внешний источник данных. Тип данных ХЗ воспринимается во внешних источниках данных как ДвоичныеДанные. Если в этих двоичных данных находится ХЗ без сжатия, то извлекается так:

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

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

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

Если же ХЗ записано со сжатием, то данный вариант не подходит. Каким образом можно распаковать данные хранилища со сжатием, чтобы получить из него значение?
1 МихаилМ
 
04.04.14
14:18
undeflat.exe

может  сработает  ЧтениеZipФайла

или http://infostart.ru/public/21461/
2 sereban
 
07.04.14
09:53
Распаковывается при помощи V8Unpack, но нужно предварительно обрезать первые 18 байт. Просто как текст обрезать не получается. 1С дописывает какие-то лишние 2 байта. Как на 1с можно убрать из файла первые 18 байт?
3 ДенисЧ
 
07.04.14
09:56
(2) Это не лишние 2 байта, это BOM от UTF...
4 sereban
 
07.04.14
10:54
Получилось)

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

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

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

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

СтрокаЗапуска = "C:\Users\f0340633\Downloads\v8unpack\V8Unpack.exe -i """ + ИмяФайлаХЗ + """ """ + ИмяРаспакованногоФайлаХЗ + """";

WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(СтрокаЗапуска, 0, Истина);

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

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