| 
    
            
         
         | 
    
    
  | 
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) спецсимволы дороже хранить на жестком диске?     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |