Собственно, вопрос: как получить BLOB-поле прямым запросом к MS SQL? Есть необходимость обращаться к скулевской базе и тащить из нее инфу с прикрепленными файлами (лежат в поле с типом значения image) и помещать в ХранилищеЗначения. Обычным селектом получить BLOB, конечно, нельзя. Можно сначала сохранить из MS SQL в файл (нашел вот здесь - https://support.microsoft.com/ru-ru/kb/258038), но делать так не хочется, если только другого способа не найду.
---
newgluk, держи.

Для вас наибольшую ценность представляют процедуры:

```1c
    БиоСКУД_ОткрытьСоединение()
    ПолучитьВыборкуНаSQL(Connection, СтрокаКоманды)
    БиоСКУД_СохранитьКартинку(BinaryData, ИмяФайла)
```

Возможно еще:

```1c
    БиоСКУД_ВыгрузитьВсеФотографии()
```

- остальное вторично
---
Построить внешний источник данных (объект такой в 1С - в самом низу дерева метаданных =))с табличкой, указав строку ODBC подключения, и выполнить запрос.

Ну или использовать иные пути извращенного получения двоичных данных. Навскидку:
1) Прочитать из файла.
2) Десериализовать из строки (base 64 или hex представление)
2.1) Получить из COM (ADO или какой нибудь экзотический SpMemoryStream) COMSafeArray, содержащий байты. Ковыряться с ним для получения строки.
2.2) Получать строку на стороне SQL сервера
3) Написать внешнюю компоненту, которая вернет двоичные данные
---
Messenger Unchained, "Построить внешний источник данных" - и смотреть, как медленно и печально это извращение работает...

"1) Прочитать из файла." - как запасной вариант

"2) Десериализовать из строки (base 64 или hex представление)" - размер данных в SQL увеличится втрое

"2.1) Получить из COM (ADO или какой нибудь экзотический SpMemoryStream) COMSafeArray, содержащий байты. Ковыряться с ним для получения строки.
2.2) Получать строку на стороне SQL сервера "
 - если есть примеры, поделитесь

"3) Написать внешнюю компоненту, которая вернет двоичные данные" - вот тут я пас
---
newgluk, держи.

Для вас наибольшую ценность представляют процедуры:

```1c
    БиоСКУД_ОткрытьСоединение()
    ПолучитьВыборкуНаSQL(Connection, СтрокаКоманды)
    БиоСКУД_СохранитьКартинку(BinaryData, ИмяФайла)
```

Возможно еще:

```1c
    БиоСКУД_ВыгрузитьВсеФотографии()
```

- остальное вторично
---
echo77, photo.Image как хранится? какой тип?
---
newgluk, Image и есть
---
echo77, спасибо за развернутый пример. А filestream использовать не пробовали?
---
Ты этот FileStream имел в виду?
---
Serginio, да. Можно ли избавиться от временных файлов и читать из файлстрим? (вопрос, наверное, для программистов на "нормальных" языках)
---
Ну вопервых я тебе дал ссылки для преобразования ComSafeArray в ДД.
Ну и если тебе нужно использования специфического АПИ ты всегда можешь воспользоваться ВК или
Использование сборок .NET в 1С 7.x b 8.x
---
Самое простое для base64:

```1c
    SEL ECT
    Source.RawImageData AS '*'
    FR OM
    Pix as Source
    WHERE
    Source.Id = 1
    FOR XML PATH('')
```

Нужен, по моему SQL 2008 и выше. Остальное - в доках =)
---
Забавно движок sql корячит. Защита от sql инъекции, что ли =)
---
посмотрите в сторону GetChunk
https://support.microsoft.com/ru-ru/kb/194975
---
Я делал на 1С вполне успешно вот так:

```1c
    Процедура БиоСКУД_СохранитьКартинку(BinaryData, ИмяФайла)

    // Определим начало заголовка JPEG FF,D8
    Массив = BinaryData.Unload();
    Смещение = 8;
    Для н=0 По Массив.ВГраница()-2 Цикл
    Если Массив[н] = 255 // 0xFF
    И Массив[н+1] = 216 // 0xD8
    Тогда
    Смещение = н;
    Прервать;
    КонецЕсли;
    КонецЦикла;

    StreamTypeEnum = Новый Структура("adTypeBinary, adTypeText", 1, 2);
    SaveOptionsEnum = Новый Структура("adSaveCreateNotExist, adSaveCreateOverWrite", 1, 2);
    ConnectModeEnum = Новый Структура(
    "adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
    |adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
    |adModeUnknown, adModeWrite", 1, 3, 4194304, 16, 4, 8, 12, 0, 2);

    Stream = Новый COMОбъект("ADODB.Stream");
    NewStream = Новый COMОбъект("ADODB.Stream");
    NewStream.Type = StreamTypeEnum.adTypeBinary;
    NewStream.Mode = ConnectModeEnum.adModeReadWrite;
    NewStream.Open();
    Stream.Type = StreamTypeEnum.adTypeBinary;
    Stream.Mode = ConnectModeEnum.adModeReadWrite;
    Stream.Open();
    Stream.Write(BinaryData);
    Stream.Position = Смещение;
    Stream.CopyTo(NewStream, Stream.Size - Смещение);
    NewStream.SaveToFile(ИмяФайла, SaveOptionsEnum.adSaveCreateOverWrite);
    Stream.Close();
    NewStream.Close();

    КонецПроцедуры
```

BinaryData - это поле выборки содержащее изображение.
Могу полностью программу показать чуть позже
---
echo77, жду программу полностью)
---
А чем тебе не нравится сохранение в файл.
Можно так http://www.forum.mista.ru/topic.php?id=445625#11
---
https://helpf.pro/faq/view/1518.html

 конце статьи приведена функция Преобразовать64(Строка64 = неопределено, Массив64 = неопределено), которая преобразовывает строку в массив байтов, и обратно.
Для того, чтобы получить массив байтов из строки, вызываем ее так:

Код 1C v 8.2 УП Массив64 = Преобразовать64(Строка64 , );

Для обратного преобразования вызываем так:

Код 1C v 8.2 УП Строка64 = Преобразовать64( , Массив64 );
---
но конактенацию строк лучше делать через
ЗаписьXML и ЗаписатьБезОбработки
http://speshuric.livejournal.com/163665.html