Имя: Пароль:
1C
1C 7.7
v7: Сохранение картинки полученой из базы SQLLite
0 ПеАлНи
 
14.03.19
11:50
Доброго дня.
Есть база данных SQLLite в одной из таблиц храняться картинки. Пытаюсь с 1С прочитать данные картинки и сохранить на диск.
Все читается записываеться на диск, но размер файла 0 байт.
Смотрю базу SQLLite с помощью SQLLite Studio в нужном поле есть данные.
В базе поле имеет тип данных BLOB.

Может кто то подскажет где я делаю не то.

Код процедуры

Процедура ФотоОтчет()
    ЗапросБД = БДSQLLite.НовыйЗапрос();
        
    ТекстЗапросаSQL = "
    |SELECT
    |  Visit.created,
    |  Visit.date,
    |  Visit.id,
    |  Visit.remark,
    |  Visit.userid,
    |  Visit$items.id AS picture
    |FROM Visit
    |INNER JOIN Visit$items on
    |  Visit.userid = Visit$items.Visit$userid
    |  AND Visit.date = Visit$items.Visit$date
    |WHERE
    |    datetime(Visit.date / 10000000 - 11644473600, 'unixepoch') >= :Дата1
    |    AND datetime(Visit.date / 10000000 - 11644473600, 'unixepoch') < :Дата2
    |    AND Visit.userid = :Юзер
    |";
    
    Дата1 = Формат(НачДата-1,"ДГГГГММДД");
    Дата2 = Формат(КонДата,"ДГГГГММДД");
    
    Дата1 = Лев(Дата1,4)+"-"+Сред(Дата1,5,2)+"-"+Прав(Дата1,2);
    Дата2 = Лев(Дата2,4)+"-"+Сред(Дата2,5,2)+"-"+Прав(Дата2,2);
    
    ТекАгент = ВернутьАгента();
    
    ЗапросБД.Подставлять("Дата1",Дата1);
    ЗапросБД.Подставлять("Дата2",Дата2);
    ЗапросБД.Подставлять("Юзер", Прав(ТекАгент.Код,3));

    Рез = СоздатьОбъект("ТаблицаЗначений");
    Рез = ЗапросБД.ВыполнитьЗапрос(ТекстЗапросаSQL);
            
    Если Рез.КоличествоСтрок() > 0 Тогда
            
        Попытка
            Картинка = СоздатьОбъект("BinaryData");
        Исключение
            Сообщить("Не удалось создать класс BinaryData","!");
            Возврат;
        КонецПопытки;            
            
        Рез.ВыбратьСтроки();
        Пока Рез.ПолучитьСтроку() = 1 Цикл
                
            Картинка.ПрочитатьДанные(Рез.picture);
            Папка = "G:\ФотоОтчеты\";
            Картинка.СохранитьВФайл(Папка + Прав(ТекАгент.Код,3) + "_" + Рез.id + ".jpg", 0);
            Картинка.Закрыть();

        КонецЦикла;
            
    КонецЕсли;
                          
КонецПроцедуры
1 Djelf
 
гуру
14.03.19
15:43
(0) Во первых:

ПрочитатьДанные / ReadData
Синтаксис: ПрочитатьДанные(Данные, [Режим])

Параметры:
Данные - тип: Число. Число, для приема прочитанных данных;

Режим - тип: Число. Режим чтения:

0 - читается число в 1 байт (по умолчанию);
1 - читается число в 2 байта;
2 - читается число в 4 байта.
Описание: читает число из данных объекта. Если данных недостаточно для чтения числа - происходит исключение.

Во вторых Рез.pictureв лучшем случае строка, но ни как не блоб, т.к. в блобе могут быть нули и т.п., а в строке нет.

Хочешь получить BinaryData используй 1sqlite http://catalog.mista.ru/public/559826/
2 ПеАлНи
 
14.03.19
15:48
(1)
БЛАГОДАРЮ ЗА НАВОДКУ.
БУДУ КОПАТЬ.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс