Загрузка картинки в 1С 8.3

07.04.23

Разработка - Работа с интерфейсом

В этой статье я расскажу, как программно работать на управляемой форме с картинкой в 1С 8.3: загружать их на форму, хранить в базе и выводить картинку при открытии формы.

Для демонстрации работы с картинками решим простую задачу:  в нашей условной базе имеется справочник Номенклатура, наш заказчик хочет, чтобы к каждой номенклатуре можно было привязать картинку этой номенклатуры.  Реализуем эту задачу.

Первым делом у справочника Номенклатура создадим реквизит  Картинка с типом ХранилищеЗначений.

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

Сделаем управляемую форму элемента справочника, на которой реализуем следующий функционал: на форме будет размещено поле с картинкой, если картинка не хранится в справочнике, то оно будет пустое, а иначе при открытии формы  в 1С необходимо будет получить картинку из базы автоматически, т.е. на форме нужно организовать вывод картинки.  Пользователь может загрузить в 1С файл картинки, для этого он должен кликнуть на поле картинки, после этого будет открыта форма выбора файла формата jpg, а после выбора нужного файла, картинка появится на форме. При сохранении элемента, картинка должна будет записаться в базу.

Создадим управляемую форму элемента справочника, у этой формы создадим реквизит СсылкаНаКартинку с типом Строка.

 

 

Поместим этот реквизит на форму в виде поля, а вид у данного поля установим «Поле картинки».

 

 

Сделаем так, чтобы мы могли загружать картинку по клику мышки на это поле, для этого установим в свойство поле Гиперссылка.

 

 

Создадим клиентский обработчик для события Нажатие этого поля.

 

 

В этом обработчике напишем код, который будет вызывать диалог открытия файла с расширением jpg.

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

Опишем процедуру ПослеЗагрузкиФайла, которую указали в описании оповещения, в этой процедуре, если пользователь выбрал файл, мы будем помещать его во временное хранилище при помощи метода НачатьПомещениеФайла.

&НаКлиенте 
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт 
	Если ВыбранныйФайл = Неопределено Тогда 
		Возврат; 
	КонецЕсли; 
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма); 
	НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор); 
КонецПроцедуры

Следующим шагом, необходимо в процедуре ПослеПомещенияФайла, которая указана в описании оповещения процедуры ПослеЗагрузкиФайла, присвоить реквизиту формы «СсылкаНаКартинку» адрес временного хранилища.

&НаКлиенте 
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт 
	Если Не Результат Тогда 
		Возврат; 
	КонецЕсли; 
	СсылкаНаКартинку = Адрес; 
	Модифицированность = Истина; 
КонецПроцедуры

Если мы сейчас сохраним конфигурацию, то наша картинка будет прекрасно загружаться на форму и показываться на ней, но она не будет храниться в базе.

Для того, чтобы картинка хранилась в базе, нам необходимо сохранить картинку в реквизит объекта, делать мы это будем в событии формы ПередЗаписьюНаСервере. Создадим это событие.

 

 

В обработчике события проверим, что реквизит формы СсылкаНаКартинку является адресом временного хранилища, и если это так, то получим файл картинки из временного хранилища и запишем его в реквизит Картинка нашего объекта. В конце удалим картинку из временного хранилища, а поскольку у нас реквизиту формы присвоен адрес во временном хранилище, то нужно получить адрес с реквизита объекта, чтобы картинка никуда не делась после сохранения.

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

И последний штрих: нам нужно сделать так, чтобы при открытии формы, картинка появлялась на форме, если она есть в базе (в хранилище).

Для этого, создадим обработчик для события ПриСозданииНаСервере формы.

 

 

И в этом обработчике будем получать навигационную ссылку на картинку.

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

Всё!  Задача выполнена. Теперь мы можем загружать картинку на форму с помощью диалога открытия файлов, сохранять картинку в базу, и выводить картинку на форму при открытии, если она имеется в базе.

 

 

фото картинка загрузка картинки загрузка фото загрузка изображения

См. также

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    18466    26    6    

41

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    14214    mrXoxot    43    

116

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    6443    smielka    37    

98

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    13880    837    elcoan    47    

115

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    11419    161    acces969    31    

123

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    5193    kalyaka    6    

33

Работа с интерфейсом Программист Пользователь Платформа 1С v8.3 8.3.14 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Ещё с времен платформы 8.3.13 можно изменять цвет стилей интерфейса главного окна. Данное расширение позволит вам выбрать из подготовленных десятка стилей на свой вкус.

1 стартмани

01.07.2022    23578    382    rpgshnik    67    

96
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. efin 07.04.23 17:36 Сейчас в теме
Очень часто нужно кадрирование (crop) - подскажите, как на УФ сделать?
4. vlch 11.04.23 16:46 Сейчас в теме
(1) А зачем хранить избыточные данные? Лучше загружать уже обрезанные.

Ну всякие выверты с картинкой можно сделать в поле HTML командами разметки, JS и CSS. Способов много. Ссылку на картинку можно формировать прям по навигационной ссылке.

По этой теме много статей.
2. user1559729 07.04.23 18:03 Сейчас в теме
(0) Хотя уже немало подобных публикаций, но плюсую за простоту и доступность изложения. Продолжай.
3. CheBurator 2696 08.04.23 20:43 Сейчас в теме
Как-то выморочено. И нифига не проще чем на 7.7
5. user1626759 11.04.23 18:19 Сейчас в теме
СП: НачатьПомещениеФайла - Не рекомендуется использовать, начиная с версии 8.3.15.

Самый большой вопрос, на экзамене на Спеца такое прокатывает?
OlympiaSoft; +1 Ответить
6. cheshirshik 70 12.04.23 08:23 Сейчас в теме
Отказался от отображения картинки подобным способом по причине искажения пропорций. Картинка то растягивается, то слишком большая. Использую в 1с html, как писали выше. Таких проблем там можно легко избежать.
7. vlch 12.04.23 11:05 Сейчас в теме
(6) Если задать свойство РазмерКартинки в Автоматический размер, то нарушения пропорций не будет. Маленькие картинки увеличиваться не будут, а большие уменьшаются без потери пропорций. В целом очень удобный режим.

Но иногда не обойтись без поля HTML это точно.
cheshirshik; +1 Ответить
19. user1854482 21 25.11.23 16:44 Сейчас в теме
Можно добавить еще команду на удаление картинки .Для добавления команды удаления картинки в вашу программу, создайте новую команду под названием "ОчиститьКартинку". Добавьте соответствующий элемент интерфейса на форму, а затем привяжите событие клиента к данной команде, следуя указаниям ниже:

&НаКлиенте
Процедура ОчиститКартинку(Команда)
	   СсылкаНаКартинку="" ;
	   Модифицированность=Истина;
КонецПроцедуры


Не забываем добавить код ПередЗаписьюНаСервере :
Если ПустаяСтрока(СсылкаНаКартинку) Тогда 
		ТекущийОбъект.Картинка=Неопределено;
		КонецЕсли;


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

&НаКлиенте
Процедура ОчиститКартинку(Команда)
	   СсылкаНаКартинку="" ;
	   Модифицированность=Истина;
КонецПроцедуры

Показать
24. user2023499 14.12.23 07:47 Сейчас в теме
не работало пока не поменял

ЭтоАдресВременногоХранилища(СсылкаНаКартинку) 


на

ЭтоАдресВременногоХранилища(Объект.СсылкаНаКартинку)


и в других местах тоже

За статью спасибо. полезно.
25. user2029640 19.12.23 11:39 Сейчас в теме
Не понимаю, в чем ошибка. Код верный, ошибок в синтаксе нет, а картинка все равно не вставляется после того, как я выбрала ее из папки(( В чем может быть проблема??
26. OlympiaSoft 13.02.24 21:51 Сейчас в теме
Как то так и всё работает !!!
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
	Фильтр = "Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|" 
	+ "Формат bmp (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|"
	+ "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
	+ "Формат TIFF (*.tif)|*.tif|"
	+ "Формат GIF (*.gif)|*.gif|"
	+ "Формат PNG (*.png)|*.png|"
	+ "Формат icon (*.ico)|*.ico|"
	+ "Формат метафайл (*.wmf;*.emf)|*.wmf;*.emf|";
	
	Диалог = новый ПараметрыДиалогаПомещенияФайлов("Выберите файл", Ложь, Фильтр);
	ОписаниеОповещения = новый ОписаниеОповещения("ПослеЗакрытияДиалогаВыбораПодписи", ЭтаФорма);
	
	НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,, Диалог, УникальныйИдентификатор); // c 8.3.15
	// Асинх.метод НачатьПомещениеФайлаНаСервер() возвращает результат и доп.параметры.
	// Результат - переменная (с типом ОписаниеФайла)
	// Доп.параметры - в примере пустыеКонецПроцедуры
КонецПроцедуры	
&НаКлиенте
Процедура ПослеЗакрытияДиалогаВыбораПодписи (ОписаниеФайла, ДопПараметры) Экспорт
	
	Если ОписаниеФайла.ПомещениеФайлаОтменено ТОгда
		Возврат;
	КОнецЕсли;
	
	АдресВХранилище = ОписаниеФайла.Адрес; // АдресХранилища - реквизит формы
	
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если ЭтоАдресВременногоХранилища(АдресВХранилище)  Тогда 
		ФайлКартинки = ПолучитьИзВременногоХранилища(АдресВХранилище); 
		ТекущийОбъект.Картинка = Новый ХранилищеЗначения(ФайлКартинки); 
		УдалитьИзВременногоХранилища(АдресВХранилище); 
		АдресВХранилище = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение"); 
	КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	АдресВХранилище = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Изображение");   
	Элементы.АдресКартинки.РазмерКартинки = РазмерКартинки.АвтоРазмер;
КонецПроцедуры
Показать
Прикрепленные файлы:
Оставьте свое сообщение