Имя: Пароль:
1C
1С v8
Varbinary. Массив байт. Двоичные данные. ПолучитьСтрокуИзДвоичныхДанных
,
0 Geroy
 
10.04.23
11:44
Необходимо из колонки _Content в таблице MSSQL получить содержимое

Колонка в MSSQL
_Content (varbinary(max), not null)


1. Через ADODB.Connection и ADODB.RecordSet выполняется запрос к СУБД
2. Получаю массив байт RecordSet.Fields("_Content").Value.Выгрузить()
3. Получаю двоичные данные

Длинна = Массив.Количество();
Буфер = новый БуферДвоичныхДанных(Длинна);
Для индекс = 0 по Длинна - 1 Цикл
    Буфер.Установить(индекс,Массив[индекс]);    
КонецЦикла;
    
Поток = новый ПотокВПамяти(Буфер);
Поток.ЗакрытьИПолучитьДвоичныеДанные()
    
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    

4. Из двоичных данных получаю строку
ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные ,КодировкаТекста.UTF8)

Но не все строка читабельного вида (

v
�f�c�¢ED?�'�(8
���n���DSU�m�
�=>o&L�[{)
��o0 �[G�S���K
����uCO�Lcy}Wt�
��bʚ�oH@�,���  *h *�
�8h�&D[��<�I1��*�
���P�����I���k*    x��̹��*@r>Выполняется передача статуса


Какие еще есть варианты получить содержимое ?
1 arsik
 
гуру
10.04.23
11:49
Ну "Буфер = новый БуферДвоичныхДанных(Длинна);" - это ты как длину то посчитал?
2 Geroy
 
10.04.23
11:51
(1) Длина = RecordSet.Fields("_Content").Value.Выгрузить().Количество()
3 arsik
 
гуру
10.04.23
11:56
(2) Мне непонятно.
>Получаю массив байт RecordSet.Fields("_Content").Value.Выгрузить()
А ты уверен, что в массиве все элементы по 1 байту?
4 H A D G E H O G s
 
10.04.23
12:01
(0) Сохрани двоичные данные в файлец, файлец winhex-ом глянь, че там у тебя в байтах и как они совпадают с MS SQL в Enterprise manager
5 H A D G E H O G s
 
10.04.23
12:02
(0) Есть уверенность, что в _Content - UFT8 ?
6 Geroy
 
10.04.23
13:23
(5) 100% нет уверенности, но там структура должна быть

(3) как проверить? я вижу что запросом к sql получаю их
7 H A D G E H O G s
 
10.04.23
13:52
(6) Почему вы думаете, что структуру можно преобразовать к строке?
8 Geroy
 
10.04.23
14:20
(7) вообщем задача, получить содержимое  колонки "_Content" (varbinary(max), not null)
9 lodger
 
10.04.23
14:25
там, небось, ХраналищеЗначения?
у него сжатие бывает. попробуй разжать.
10 Geroy
 
10.04.23
14:33
(9) это таблицы платформенной "Истории данных"

Таблица версий данных истории данных

_DataHistoryVersions
_Content — Данные версии
11 lodger
 
10.04.23
14:38
(10) это почти наверняка ХранилищеЗначений, с непубличным доступом, но с логикой, которая не противоречит существующим ранее компонентам системы.
12 lodger
 
10.04.23
14:41
почитай грязные трюки из https://infostart.ru/public/1050764/
по смыслу очень рядом
13 Geroy
 
10.04.23
14:45
(12) тут только вопрос как получить "ХранилищеЗначения" из запроса к скулю
14 lodger
 
10.04.23
14:48
(13) представь себе, что
ДанныеВBase64 = XMLСтрока(ХранилищеЗначения); // Получим Base64 хранилища значения
ДвоичныеДанные = Base64Значение(ДанныеВBase64); // Получаем двоичные данные хранилища значения

ты уже сделал? и ДвоичныеДанные у тебя = RecordSet.Fields("_Content").Value.Выгрузить().
15 Geroy
 
10.04.23
14:52
(14) так выше (3)  было замечание что там может не корректный массив байтов
16 Geroy
 
10.04.23
16:34
(14) попробовал результат пустой файл
17 lodger
 
10.04.23
16:47
(16) подождём ещё, когда ты в отладчике заглянешь что тут, что там, как это переложить.
18 Geroy
 
10.04.23
16:58
(17) да смотрю, кручу-верчу)
Пока идей нет
19 ДедМорроз
 
10.04.23
19:05
Только,кодировка utf-16,а не utf-8 должна быть
20 Geroy
 
11.04.23
08:27
(19) почему 16 ?

Выше пример разбора


именно в utf-8 получаю последнюю строку "адекватную"

v
�f�c�¢ED?�'�(8
���n���DSU�m�
�=>o&L�[{)
��o0 �[G�S���K
����uCO�Lcy}Wt�
��bʚ�oH@�,���  *h *�
�8h�&D[��<�I1��*�
���P�����I���k*    x��̹��*@r>Выполняется передача статуса
21 Geroy
 
11.04.23
11:05
(11) провел тест, для вручную созданного хранилища значений нет проблем с получением его данных через запрос к mssql

Скорее всего в колонке RecordSet.Fields("_Content") не хранилище значений


Детали теста: создал регистр и выполнил запись

    
Данные = Новый Структура;
Данные.Вставить("Б", Ложь);
Данные.Вставить("Ч", 15.5);
Данные.Вставить("С", "проверка");
Данные.Вставить("Д", ТекущаяДата());
    
ЗР = РегистрыСведений.ТестХЗ.СоздатьМенеджерЗаписи();
ЗР.УИД = Новый УникальныйИдентификатор;
ЗР.ХЗ = Новый ХранилищеЗначения(Данные);
ЗР.Записать();


Далее запросом к MSSQL получил
          
МассивБайт = RecordSet.Fields("_Fld4273").Value.Выгрузить();
            
Длинна = МассивБайт.Количество();
Буфер = новый БуферДвоичныхДанных(Длинна);
Для индекс = 0 по Длинна - 1 Цикл
    Буфер.Установить(индекс,МассивБайт[индекс]);    
КонецЦикла;
        
Поток = новый ПотокВПамяти(Буфер);    
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    
//первые способ    
НашеЗначениеПервое = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.UTF8);

// Второй способ        
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
НашеЗначениеВторое = ХЗ.Получить();
    
    

Результат:

Способ №1 НашеЗначениеПервое
�       {"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{4,
{
{"S","Б"},
{"B",0}
},
{
{"S","Ч"},
{"N",15.5}
},
{
{"S","С"},
{"S","проверка"}
},
{
{"S","Д"},
{"D",20230411085522}
}
}
}


Способ №2 НашеЗначениеВторое

Свойство                Значение                Тип
НашеЗначениеВторое    Структура            Структура
Б                    Ложь                    Булево
Д                    11.04.2023 8:55:22    Дата
С                    "проверка"            Строка
Ч                    15,5                    Число
22 lodger
 
11.04.23
12:17
(21) а теперь повтори опыт с применением

ЗР.ХЗ = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9));
23 Geroy
 
11.04.23
13:36
(22)
НашеЗначениеПервое
SKo��N��붽��
;� �w�VRV�112�00�L�5O5��5IK�Ե4LI�M2K�45L1MN�H���6@����ta�R-��䤤cP��U�"�*駤ch�g�!�*���pa߅M��]6(a��U�cd`dl`bhhhllbjR    A

НашеЗначениеВторое
Все ок, так же структура
24 Волшебник
 
модератор
11.04.23
14:00
(23) Просьба не засорять форум спецсимволами. Выкладывайте на https://pastebin.com/
25 lodger
 
11.04.23
15:08
(24) спецсимволы дороже хранить на жестком диске?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой