1. Как хранить изображение в 1С
2. Как показать картинку на форме
&НаКлиенте
Процедура АдресКартинкиНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗначениеЗаполнено(Объект.ФайлКартинки) Тогда
ПоказатьКартинку();
Иначе
ВыбратьКартинку();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Асинх Процедура ВыбратьКартинку()
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите картинку";
ПараметрыДиалога.Фильтр = "Все файлы изображений | *.jpg; *.png; *.bmp";
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога,УникальныйИдентификатор);
Если ОписаниеФайла <> Неопределено Тогда
АдресКартинки = ОписаниеФайла.Адрес;
ИнформацияОФайле = Новый Структура;
ИнформацияОФайле.Вставить("Адрес", АдресКартинки);
ИнформацияОФайле.Вставить("Имя", ОписаниеФайла.СсылкаНаФайл.Имя);
ИнформацияОФайле.Вставить("Расширение", ОписаниеФайла.СсылкаНаФайл.Расширение);
ИнформацияОФайле.Вставить("Размер", ОписаниеФайла.СсылкаНаФайл.Размер());
Объект.ФайлКартинки = СоздатьПрисоединенныйФайл(Объект.Ссылка, ИнформацияОФайле);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СоздатьПрисоединенныйФайл(Товар, ИнформацияОФайле)
ХранилищеКартинки = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(ИнформацияОФайле.Адрес),
Новый СжатиеДанных(9));
ОбъектФайла = Справочники.ТоварыПрисоединенныеФайлы.СоздатьЭлемент();
ОбъектФайла.Владелец = Товар;
ОбъектФайла.Наименование = ИнформацияОФайле.Имя;
ОбъектФайла.Расширение = ИнформацияОФайле.Расширение;
ОбъектФайла.Размер = ИнформацияОФайле.Размер;
ОбъектФайла.ДанныеФайла = ХранилищеКартинки;
ОбъектФайла.ИмяФайла = СтрЗаменить(ОбъектФайла.Наименование, ОбъектФайла.Расширение, "");
ОбъектФайла.Записать();
Возврат ОбъектФайла.Ссылка;
КонецФункции // СоздатьПрисоединенныйФайл()
&НаКлиенте
Асинх Процедура ПоказатьКартинку()
ДанныеКартинки = ПолучитьДанныеКартинки(Объект.ФайлКартинки);
ПутьКФайлу = ПолучитьИмяВременногоФайла(ДанныеКартинки.Расширение);
Ждать ПолучитьФайлССервераАсинх(ДанныеКартинки.АдресДанных, ПутьКФайлу);
Попытка
ЗапуститьПриложениеАсинх(ПутьКФайлу);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось открыть файл картинки по причине: " + ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
КонецПроцедуры // ПоказатьКартинку()
&НаСервереБезКонтекста
Функция ПолучитьДанныеКартинки(ФайлКартинки)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыПрисоединенныеФайлы.Наименование КАК Наименование,
| ТоварыПрисоединенныеФайлы.ДанныеФайла КАК АдресДанных,
| ТоварыПрисоединенныеФайлы.ИмяФайла КАК ИмяФайла,
| ТоварыПрисоединенныеФайлы.Расширение КАК Расширение,
| ТоварыПрисоединенныеФайлы.Размер КАК Размер
|ИЗ
| Справочник.ТоварыПрисоединенныеФайлы КАК ТоварыПрисоединенныеФайлы
|ГДЕ
| ТоварыПрисоединенныеФайлы.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ФайлКартинки);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
СтруктураДанных = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
ИмяКолонки = Колонка.Имя;
Если ИмяКолонки = "АдресДанных" Тогда
ЗначениеКолонки = ПоместитьВоВременноеХранилище(Выборка[ИмяКолонки].Получить());
Иначе
ЗначениеКолонки = Выборка[ИмяКолонки];
КонецЕсли;
СтруктураДанных.Вставить(ИмяКолонки, ЗначениеКолонки);
КонецЦикла;
Возврат СтруктураДанных;
КонецФункции // ПолучитьДанныеКартинки()
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.ФайлКартинки, "ДанныеФайла");
КонецПроцедуры
&НаКлиенте
Процедура УдалитьИзображение(Команда)
ПометитьНаУдалениеПрисоединенныйФайл(Объект.ФайлКартинки);
Объект.ФайлКартинки = Неопределено;
АдресКартинки = "";
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПометитьНаУдалениеПрисоединенныйФайл(ПрисоединенныйФайл)
Если НЕ ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда
Возврат;
КонецЕсли;
ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
ПрисоединенныйФайлОбъект.УстановитьПометкуУдаления(Истина);
ПрисоединенныйФайлОбъект.Записать();
КонецПроцедуры