Доброго всем времени суток.

В справочнике Номенклатура есть реквизит "ОсновноеИзображение" с типом "ХранилищеЗначения". В нем хранится файл картинки в двоичном коде. Есть необходимость выгрузить файлы изображений. Все картинки с разными типами например GIF или JPG, PNG и т.д. Естественно расширения файлов не сохранены. Как можно определить тип картинки (расширение файла)? Пока есть мысль сохранить во временный файл, затем побайтово прочитать первые N символов и попытаться найти ключевые фразы для каждого типа. Буду рад если ткнете в готовое решение или повернете в нужное направление.

Заранее благодарен.
---
Boneman, В справочнике "Номенклатура" есть реквизит "ОсновноеИзображение" с типом "ХранилищеЗначения". В него записывается изображение номенклатуры.

Далее имеем простой код

```1c
    СоответствиеТиповФайловКартинок = Новый Соответствие;
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.BMP, ".bmp");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.EMF, ".emf");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.GIF, ".gif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.Icon, ".ico");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.JPEG, ".jpg");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.PNG, ".png");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.TIFF, ".tif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.WMF, ".wmf");

    Процедура ВыгрузитьНоменклатуру()
    ...
    _Картинка = ТекНоменклатура.ОсновноеИзображение.Получить();
    _ТипКартинки = _Картинка.Формат();

    Если _ТипКартинки = ФорматКартинки.НеизвестныйФормат Тогда
    //Пишем обработчик, если это не картинка или неизвестный формат
    Иначе
    _ТипФайла = СоответствиеТиповФайловКартинок.Получить(_ТипКартинки);
    КонецЕсли;

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

Форма интерактивного изменения изображения записывает в реквизит "ОсновноеИзображение" объект с типом "Картинка". Но если кто-то умудрится туда запихнуть не картинку, то вернется "НеизвестныйФормат" (проверено).

Ну и если у кого-то картинка сохраняется в двоичных данных, то сначала нужно получить из них картинку, потом проверить формат.

```1c
    ...
    _Картинка = Новый Картинка(ТекНоменклатура.ОсновноеИзображение.Получить());
    ...
```

Как-то так.
---
ECartman,
Естественно расширения файлов не сохранены
это неестественно, а безалаберно.
В двоичных данных может быть все что душе угодно, поэтому должен быть реквизит, позволяющий определить хоть как-то определять содержимое, имя файла, или его расширение, для дальнейшей работы. Это все контролируется и на совести разработчика. Впрочем, как и вообще само по себе наличие данных в хранилище.
Базу очень легко раздуть до неимоверных размеров, на ровном месте.

А так, да, можно сохранить как текстовую строку, и поиском в ней символов явно из структуры тех или иных файлов, можно определять тип.
А потом сохранять заново, в определенном формате.
Медленно конечно, смотря какие там размеры файлов.

Если этот процесс будет регулярным, а не разовым, то лучше ввести такой признак в справочник номерклатуры, сделать обработку по определению типа файлов, которая пройдет, определит и пропишет расширение в реквизит. Ну и работать с этим будет намного проще.
---
Boneman, ввести такой признак в справочник номенклатуры
В справочник ХранилищеДополнительнойИнформации
---
ipoloskov, ну мы же не знаем, что там у чела за конфа.
В некоторых конфах, и хранилище в сам справочник номенклатуры не пихают, а вынесено в отдельный справочник файлы.
Пусть с архитектурой уж сам заморачивается, где и как хранить эту информацию
---
Boneman,
это неестественно, а безалаберно.

Если б я это писал. Конфа не типовая, а от франчев.

Если этот процесс будет регулярным, а не разовым, то лучше ввести такой признак в справочник номенклатуры

Будет не чаще раза-двух в год. Обработка порядка 1000-2000 элементов. Наверное, Вы правы, что стоит завести отдельный реквизит.
---
ECartman, если завести отдельный реквизит или прописать расширение в самом хранилище - то данную обработку нужно будет сделать только один раз, пропарсить файлы и прописать в реквизите.
Для последующей работы - естественно нужно править загрузку, чтобы расширение прописывалось сразу при загрузке.

Хранить в отдельном реквизите или в хранилище - решайте сами. Хранить сразу в хранилище лучше, имхо, потому что можно впихнуть любую информацию о файле, кроме того не потребуется менять структуру конфигурации. Но для это потребуется переконвертировать все хранящиеся изображения.
---
ECartman, если правильно писали, то оно должно быть записано в имени картинки. Но если через одно место, то только парсить.
---
пишите все в жепеге
---
Блин, все разобрался. Надо было просто в синтаксис-помощник заглянуть)))

P.S. Для тех, кому интересно. У типа "Картинка" есть замечательный метод "Формат()", который, собственно, и покажет что за тип картинки... И смех и грех)
---
ECartman, да интересно.
У картинки то есть, но откуда взяться картинке скажем при обработке справочника ?
Я так понимаю картинка, это декорация формы, либо в макете - куда этот файл необходимо поместить.
Но нам ведь нужно сделать выгрузку..не открывать же для этого форму каждого элемента справочника.
Ты картинку как-то программно создаешь, в нее выводишь файл из хранилища и потом считываешь формат ? А если файл в хранилище будет некартинкой, система переварит ?
В общем, просто покажи код который получился )) Для общего развития, может кому пригодится в будущем.
---
Boneman, В справочнике "Номенклатура" есть реквизит "ОсновноеИзображение" с типом "ХранилищеЗначения". В него записывается изображение номенклатуры.

Далее имеем простой код

```1c
    СоответствиеТиповФайловКартинок = Новый Соответствие;
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.BMP, ".bmp");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.EMF, ".emf");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.GIF, ".gif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.Icon, ".ico");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.JPEG, ".jpg");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.PNG, ".png");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.TIFF, ".tif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.WMF, ".wmf");

    Процедура ВыгрузитьНоменклатуру()
    ...
    _Картинка = ТекНоменклатура.ОсновноеИзображение.Получить();
    _ТипКартинки = _Картинка.Формат();

    Если _ТипКартинки = ФорматКартинки.НеизвестныйФормат Тогда
    //Пишем обработчик, если это не картинка или неизвестный формат
    Иначе
    _ТипФайла = СоответствиеТиповФайловКартинок.Получить(_ТипКартинки);
    КонецЕсли;

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

Форма интерактивного изменения изображения записывает в реквизит "ОсновноеИзображение" объект с типом "Картинка". Но если кто-то умудрится туда запихнуть не картинку, то вернется "НеизвестныйФормат" (проверено).

Ну и если у кого-то картинка сохраняется в двоичных данных, то сначала нужно получить из них картинку, потом проверить формат.

```1c
    ...
    _Картинка = Новый Картинка(ТекНоменклатура.ОсновноеИзображение.Получить());
    ...
```

Как-то так.
---
ECartman,
молодец.
Тоже неплохой прием, для распознания формата файлов.
Надо запомнить.
---
Спасибо большое, прекрасно работает способ.
---
спасибо за код. Для конвертации написал так:

```1c
    ДвоичныеДанныеФайла = Base64Значение(ЗначениеПараметра);

    СоответствиеТиповФайловКартинок = Новый Соответствие;
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.BMP, "bmp");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.EMF, "emf");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.GIF, "gif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.Icon, "ico");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.JPEG, "jpg");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.PNG, "png");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.TIFF, "tif");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.WMF, "wmf");
    СоответствиеТиповФайловКартинок.Вставить(ФорматКартинки.НеизвестныйФормат, ");

    ФайлКартинка = Новый Картинка(ДвоичныеДанныеФайла);
    ТипКартинки = ФайлКартинка.Формат();

    РасширениеБезТочки = СоответствиеТиповФайловКартинок.Получить(ТипКартинки);

    СтруктураПараметровФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
    СтруктураПараметровФайла.Автор = Пользователи.ТекущийПользователь();
    СтруктураПараметровФайла.ВладелецФайлов = ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны");
    СтруктураПараметровФайла.ИмяБезРасширения = НаименованиеСвойства + " " + Объект.Наименование;
    СтруктураПараметровФайла.РасширениеБезТочки = РасширениеБезТочки;

    АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла);

    ОписаниеФайла = НСтр("ru='Загружено при переносе данных из КА1.1/УПП в ERP2/КА2/УТ11'");

    ЗначениеПараметра = РаботаСФайлами.ДобавитьФайл(СтруктураПараметровФайла, АдресФайла, , ОписаниеФайла);
```