Имя: Пароль:
1C
 
Проблема с чтением бинарных данных из sql в 1с
0 Кукалёв Анатолий
 
19.01.10
02:38
Читаю бинарные данные из полей sql-ной таблицы. Почемуто после чтения поля в переменную попадает строка типа: 0xFFD8FFE000104A46494600010100000100010000FFFE002E496E74656C и т.д.

Скажите что это за строка? И как ее с помощью 1С-ки в картинку конвертнуть ?
1 Кукалёв Анатолий
 
19.01.10
02:52
В sql тип поля image
2 kitt
 
19.01.10
03:06
3 Кукалёв Анатолий
 
19.01.10
03:25
Про двоичные данные прочел, но как преобр. эту строку в файл с помощью 1С-ки ?
4 kitt
 
19.01.10
04:04
ну, мне неизвестно каким образом вы получаете данные из SQL в 1С
может существует способ получать данные сразу в нужном виде.
Ну а вообще алгоритм примерно такой:
допустим есть строка 0xFFD8FFE000104A46494600010100000100010000FFFE002E496E74656C
отбрасываем указатель шеснадцетеричности "0x",
затем в цикле берем два левых символа,
FF = преобразуем из шеснадцетеричной системы в десятичную FF=255,
записываем в файл символ с полученным кодом 255,
уменьшаем обрабатываемую строку на 2 символа слева D8FFE000104A46494600010100000100010000FFFE002E496E74656C
затем снова берем два левых символа D8 преобразуем из шеснадцетеричной системы в десятичную D8=216, дописываем в конец файла символ с кодом 216.
И так далее, пока символны не кончаться.
Это чисто для теории, наверняка есть какие нибудь более гуманные варианты.
Вопрос про получении данных из SQL в 1с остается открытым.
5 Кукалёв Анатолий
 
19.01.10
04:16
Коннект к sql
Запросом выбираем поля (у меня имя поля = A_IMG)
Последовательно прочитываем каждое поле (например в переменную СтрИМГ) и ...
... и дальше нужно сохранить полученную строку в изображение
6 kitt
 
19.01.10
04:19
Тогда дерзайте, способ я описал
7 Кукалёв Анатолий
 
19.01.10
04:21
Да спс Я попробую
8 Кукалёв Анатолий
 
19.01.10
04:23
Только вот вопрос: а в файле в итоге получиться строка сост из 10-х значений ?! А смысл перевода ?
9 kitt
 
19.01.10
04:28
Нет
СтрокаНач = "FFD8FFE000104A46494600010100000100010000FFFE002E496E74656C";
СтрокаДвоич = "";
Пока СтрДлина(СтрокаНач)>0 Цикл
  ТекСимволы =Лев(СтрокаНач,2);
  СтрокаНач = Прав(СтрокаНач,СтрДлина(СтрокаНач)-2);
  СимволДес = Шеснад2Дес(ТекСимволы);
  СтрокаДвоич = СтрокаДвоич+Симв(СимволДес);
КонецЦикла;

Файл = Новый ТекстовыйДокумент;
Файл.УстановитьТекст(СтрокаДвоич);
Файл.Записать("C:\binary.hex","windows-1251");//Насчет кодировки я фиг знает


То есть в файл попадают не десятичные цифры, и символы, коды которых равны тесятичным цифрам. Это разные вещи
10 Кукалёв Анатолий
 
19.01.10
04:30
Понял. Сейчас опробую
11 Кукалёв Анатолий
 
19.01.10
04:38
Шеснад2Дес - ?
12 Кукалёв Анатолий
 
19.01.10
04:41
Символ(<Код символа>)

<Код символа> (обязательный)
Тип: Число. Код получаемого символа. Код задается в соответствии с кодировкой Unicode.

Пример:
Буква_Я = Символ(1103);

Исходя из этого - точно функция "Символ" ?
13 Кукалёв Анатолий
 
19.01.10
04:42
Это в 8.1 так
14 kitt
 
19.01.10
04:42
Ну я это образно

Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт
    Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
    Значение=СокрЛП(Значение);
    Если Значение="0" Тогда Возврат(0) КонецЕсли;
    Результат=0;
    Длина=СтрДлина(Значение);
    Для Х=1 По Длина Цикл
         М=1;
         Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
         Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
    КонецЦикла;
    Возврат Окр(Результат);
КонецФункции


СимволДес = Из_Любой_В_10(ТекСимволы,16);
15 kitt
 
19.01.10
04:42
(12,13) Да, я видимо из 7ки написал функцию
16 Кукалёв Анатолий
 
19.01.10
05:08
Что то не вышло ))
17 kitt
 
19.01.10
05:11
что именно?
18 Кукалёв Анатолий
 
19.01.10
05:14
Файл создает, но в jpg переименовываю он не отображает картинку
19 Кукалёв Анатолий
 
19.01.10
05:15
По моему проблема в ф-ии "Символ". В 8-ке Код задается в соответствии с кодировкой Unicode
20 Кукалёв Анатолий
 
19.01.10
05:16
Там в хелпе пример был: Буква_Я = Символ(1103);
21 Кукалёв Анатолий
 
19.01.10
05:16
откуда значение 1103 если мы максимум ff=255 ?
22 kitt
 
19.01.10
05:40
Это юникод. Первый 127 значений там такие же как в ASCII. Вообще 0 - 127 управляющие символы, цифры, пунктуация, латинский алфавит. Больше у тебя в двоичных данных ничего не будет
23 H A D G E H O G s
 
19.01.10
09:14
Мистец
24 asady
 
19.01.10
09:30
(23) :) скажи спасибо что они в БЗню это не рекомендовали
25 kitt
 
19.01.10
09:33
в чем проблемы уважаемые?
26 H A D G E H O G s
 
19.01.10
09:39
Вот 2 процедуры чтения/записи картинки напрямую в SQL (из 1С)

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Stream=Новый COMОбъект("ADODB.Stream");
   Stream.Type=1;
   Stream.Open();
   Stream.LoadFromFile("C:\БылЗвонок.bmp");
   Connection=Новый COMОбъект("ADODB.Connection");
   Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;");
   RecordSet=Новый COMОбъект("ADODB.Recordset");
   RecordSet.CursorLocation=3;
   RecordSet.LockType=2;
   Запрос="Select data from dbo.MyTable";
   RecordSet.Open(Запрос, Connection);
   Если RecordSet.RecordCount=0 Тогда
       RecordSet.AddNew();
   //    RecordSet.Fields(0).Value=1;

   Иначе
       RecordSet.MoveFirst();
   КонецЕсли;
   RecordSet.Fields("Data").Value=Stream.Read(-1);
   RecordSet.Update();
   Stream.Close();
КонецПроцедуры

Процедура ОсновныеДействияФормыd(Кнопка)
   Stream=Новый COMОбъект("ADODB.Stream");
   Stream.Type=1;
   Stream.Open();
   Connection=Новый COMОбъект("ADODB.Connection");
   Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;");
   RecordSet=Новый COMОбъект("ADODB.Recordset");
   RecordSet.CursorLocation=3;
   RecordSet.LockType=2;
   Запрос="Select data from dbo.MyTable";
   RecordSet.Open(Запрос, Connection);
   RecordSet.MoveFirst();
   Stream.Write(RecordSet.Fields("Data").Value);
   Stream.SaveToFile("c:\БылЗвонокВост.bmp");
   Stream.Close();
КонецПроцедуры
27 H A D G E H O G s
 
19.01.10
09:40
НО.
Мне интересно, что за значения в (0) и как они получены?
28 mooo
 
19.01.10
09:46

Глобальный контекст
Base64Значение (Base64Value)
Синтаксис:
Base64Значение(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Строка, закодированная по алгоритму base64.
Возвращаемое значение:
Тип: ДвоичныеДанные.
Описание:
Получает из строки закодированной по алгоритму base64 двоичные данные.
См. также:
Глобальный контекст, метод Base64Строка
29 H A D G E H O G s
 
19.01.10
09:54
(28) Нет. Нет в (0) символа старше F
30 kitt
 
19.01.10
09:57
я говорил в (4) что есть более оптимальные способы. Но если в лоб, можно и как в (9), должно работать
31 kitt
 
19.01.10
09:59
(28) вообще то "0x" в (0) нам как бы намекает
32 Кукалёв Анатолий
 
19.01.10
13:46
Я коннектюсь так :
SQLServer    = Новый COMОбъект("SQLDMO.SQLServer");
   SQLServer.LoginSecure    = 1;
   SQLServer.Connect("(local)");
   ЗапросСтруктура            =
           "SELECT        A_IMAGE
           |FROM        E_002";
   РезультатСтруктура        = SQLServer.Databases("tel").ExecuteWithResults(ЗапросСтруктура);
   Для НомерЗаписи = 1 По РезультатСтруктура.Rows Цикл
       A_IMAGE        = РезультатСтруктура.GetColumnString(НомерЗаписи,1);
       Сообщить(A_IMAGE);
       Прервать;
   КонецЦикла;
33 shuhard
 
19.01.10
13:50
(32)[SQLDMO]
перейди на ADODB см.(26)
34 Кукалёв Анатолий
 
19.01.10
13:54
Connection    = Новый COMОбъект("ADODB.Connection");
   Connection.Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=(local);Initial Catalog=tel;");
   
   RecordSet    = Новый COMОбъект("ADODB.Recordset");
   RecordSet.CursorLocation    = 3;
   RecordSet.LockType            = 2;
   Запрос                        = "SELECT A_IMAGE FROM dbo.tel";
   RecordSet.Open(Запрос, Connection);
   RecordSet.MoveFirst();
   
   Stream        = Новый COMОбъект("ADODB.Stream");
   Stream.Type=1;
   Stream.Open();
   Stream.Write(RecordSet.Fields("Data").Value);
   Stream.SaveToFile("c:\123.jpg");
   Stream.Close();

на RecordSet.Open(Запрос, Connection); выдает ошибку.
35 shuhard
 
19.01.10
14:00
(34) udl  файлик и вперёд
36 Кукалёв Анатолий
 
19.01.10
14:02
а это как? в смысле как его к 1с-ке прикрутить ?
37 shuhard
 
19.01.10
14:04
(38) не прикрутить, отладить строку конекта
ксати было
FROM        E_002

стало
FROM dbo.tel
38 H A D G E H O G s
 
19.01.10
14:07
Как минимум:
1) Не указан пользователь
2) Имя сервера не может быть (local)
39 Кукалёв Анатолий
 
19.01.10
14:07
Вот Я затупан ... (37) - все поправил, все работает! Огромное спс
40 Кукалёв Анатолий
 
19.01.10
14:09
Сори ... всю ночь не спал практически ...

1) Пользователь - там идет аут винды
2) имя сервера как раз (local) , т.к. локально на моем буке

Ошибся в запросе вместо таблицы указал БД

Еще раз всем спавибо ... вопрос решен!
41 H A D G E H O G s
 
19.01.10
14:12
(40) У меня под 'local' ADO отвергло мои домагательства.
42 Кукалёв Анатолий
 
19.01.10
14:13
local - выдает ош, а (local) - должен работать
43 shuhard
 
19.01.10
14:13
(39) порнуху то с сиквела дашь посмотреть

(41) [У меня под 'local' ADO отвергло мои домагательства]
могли алиасы у сиквела побиться
44 Кукалёв Анатолий
 
19.01.10
14:14
(43) на счет порнухи не понял ? ))
45 H A D G E H O G s
 
19.01.10
14:15
(44) Ну если ты всю ночь ковырял - значит в базе - эксклюзив.
46 shuhard
 
19.01.10
14:15
(44) что,кроме порнухи можно всю ночь с сервера пытаться вытащить ?
47 Кукалёв Анатолий
 
19.01.10
14:16
Хаа ...
Да нее ...
Есть у орг. прога на делфях по сотовым ... а ее надо в 1с-ку заточить вот и разбирался.
48 shuhard
 
19.01.10
14:39
(47)[Да нее ]
зажал
учтём
49 H A D G E H O G s
 
модератор
19.01.10
14:59
(47) Значит делится не будем. Ну-ну :-)
Программист всегда исправляет последнюю ошибку.