Имя: Пароль:
 
Загрузка изображений в 1С
(1) BitNinja
30 августа 2020 г.
20:29
Коллеги, хочу реализовать загрузку изображений в карточку документа. Нужно, чтобы пользователь мог выбрать файл через кнопку, а потом это изображение сохранялось в базе. Нашел несколько вариантов, но не нравится, что у некоторых решений приходится работать с внешними файлами, а я хочу хранить картинки в самой базе. Кто как делает? Я для загрузки картинок создаю на форме реквизит "Изображение" и кнопку "Загрузить". И код такой:
Показать спойлер
&НаКлиенте
Процедура Загрузить(Команда)
    
ООЗ Новый ОписаниеОповещения("ОбработкаВыбораФайла"ЭтотОбъект);
    
ПараметрДиалога Новый ПараметрыДиалогаПомещенияФайлов("Выбор изображения",Ложь,"Изображения (*.jpg,*.png)|*.jpg;*.png");
    
НачатьПомещениеФайлаНаСервер(ООЗ,,,,ПараметрДиалога,УникальныйИдентификатор);
КонецПроцедуры


&НаКлиенте
Процедура ОбработкаВыбораФайла(ОписаниеПомещенногоФайлаДополнительныеПараметрыЭкспорт
    Если 
ОписаниеПомещенногоФайла <> Неопределено Тогда
        Если 
ОписаниеПомещенногоФайла.ПомещениеФайлаОтменено Тогда
            Возврат
;
        
КонецЕсли;
        
Модифицированность Истина;
        
Изображение ОписаниеПомещенногоФайла.Адрес;
    
КонецЕсли;
КонецПроцедуры


&НаСервере
Процедура ПриСозданииНаСервере(ОтказСтандартнаяОбработка)
    
Изображение ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Фото");
КонецПроцедуры


&НаСервере
Процедура ПередЗаписьюНаСервере(ОтказТекущийОбъектПараметрыЗаписи)
    
Если ЭтоАдресВременногоХранилища(ИзображениеТогда
        
ТекущийОбъект.Фото Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Изображение));
    
КонецЕсли;
КонецПроцедуры

(2) nick86
30 августа 2020 г.
22:15
А зачем вообще хранить картинки в базе? Они же тяжелые, проще положить их на сервер и хранить путь.
(3) Ненавижу 1С
30 августа 2020 г.
23:37
nick86, иногда нужно, чтобы картинка была привязана к документу и никуда не пропала, если, например, изменится структура папок на сервере. Я делал через временное хранилище, а потом сохранял в ХранилищеЗначения.
(4) GitWhisperer
31 августа 2020 г.
7:01
отличное решение, я тоже так делал. А ты проверяешь тип файла перед сохранением?
(5) Джордж1
31 августа 2020 г.
11:55
я так делал, но у меня были проблемы с отображением. Как ты получаешь ссылку на изображение после загрузки?
(6) ДобрыйПутник
31 августа 2020 г.
13:24
О, классика! Завтра тут появится вопрос "Как добавить кнопку на форму?", а потом "Как создать реквизит?". 😂
(7) Гений 1С
31 августа 2020 г.
20:37
2020 год. На форуме обсуждение: "Как вставить кнопку 'Загрузить картинку в 1С'?"
(8) VladZ
1 сентября 2020 г.
10:18
Вот вы смеетесь, а код выше неверный :D Рабочая схема, делаю так:
Показать спойлер
// Процедура для обработки выбранного файла
// Входные параметры:
// - ОписаниеПомещенногоФайла – информация о выбранном файле
// - ДополнительныеПараметры – параметры, переданные вместе с файлом
&НаКлиенте
Процедура ОбработкаВыбораФайла(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	Если ОписаниеПомещенногоФайла <> Неопределено Тогда
		Если ОписаниеПомещенногоФайла.ПомещениеФайлаОтменено Тогда
			Возврат;
		КонецЕсли;	
		Модифицированность = Истина;
		АдресКартинки = ОписаниеПомещенногоФайла.Адрес;
	КонецЕсли;		
КонецПроцедуры // ОбработкаВыбораФайла()

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Получаем ссылку на изображение, связанное с объектом
	АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");	
КонецПроцедуры


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если ЭтоАдресВременногоХранилища(АдресКартинки) ТОгда
		ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));
	КонецЕсли;	
КонецПроцедуры    

// Процедура запускает выбор изображения на клиенте   
//
&НаКлиенте
Процедура ЗагрузитьИзображение(Команда)
	ООЗ = Новый ОписаниеОповещения("ОбработкаВыбораФайла", ЭтотОбъект);	 
	// Параметры диалога для выбора изображений
	ПараметрДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выбор изображения",Ложь,"Изображения (*.jpg,*.png)|*.jpg;*.png");
	НачатьПомещениеФайлаНаСервер(ООЗ,,,,ПараметрДиалога,УникальныйИдентификатор);
КонецПроцедуры


(9) 1Снеговик
10 сентября 2020 г.
22:52
А валидацию на формат и размер можно накинуть так:
Показать спойлер
&НаКлиенте
Процедура ОбработкаВыбораФайла(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	Если ОписаниеПомещенногоФайла <> Неопределено Тогда
		Если ОписаниеПомещенногоФайла.ПомещениеФайлаОтменено Тогда
			Возврат;
		КонецЕсли;	
		
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(ОписаниеПомещенногоФайла.Адрес);
		Изображение = Новый Картинка(ДвоичныеДанные);
		Если НЕ (Изображение.Ширина() = 500ИЛИ Изображение.Высота() = 250 ИЛИ Изображение.Формат() = ФорматКартинки.PNG) Тогда
			
			Сообщить("Формат изображения " + Строка(Изображение.Формат()) + ". Требуется PNG!"); 
			Сообщить("Ширина изображения " + Строка(Изображение.Ширина()) + ". Требуется 500!");  
			Сообщить("Высота изображения " + Строка(Изображение.Высота()) + ". Требуется 250!"); 
			
			Возврат;
		КонецЕсли;
			  
		Модифицированность = Истина;
		Картинка = ОписаниеПомещенногоФайла.Адрес;  
			  
		
	КонецЕсли;		
КонецПроцедуры

Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс
Для создания новых тем нужно войти или зарегистрироваться