|

Загрузка изображения в 1С


Содержание:

1. Подготовка формы к загрузке изображения в 1С

2. Реализация алгоритма по загрузке изображения

3. Создание регистра сведений, запись изображения в регистр и получение изображения из регистра

Подготовка формы к загрузке изображения в 1С

Для работы с файлами в 1С существует несколько различных методов таких как

  • ДиалогВыбораФайла() (не работает в веб-клиенте)
  • НачатьПомещениеФайла() (устаревший, не используется)
  • НачатьПомещениеФайлаНаСервер()
  • ПоместитьФайлНаСерверАсинх()

В данной статье предлагаю остановиться на асинхронном методе «ПоместитьФайлНаСерверАсинх()»

Для начала подготовим форму для загрузки изображения

  • Добавим реквизит формы «Адрес картинки» тип значения строка, длинна неограниченно
  • Добавим реквизит «Адрес картинки» на саму форму. Вид укажем «Поле картинки» в свойствах «Текст невыбранной картинки» для пользователя укажем прикрепить картинку.
  • Установим флаг гиперссылка, для включения возможности нажатия.

Подготовка формы для загрузки изображения

Реализация алгоритма по загрузке изображения

Далее для реквизита формы установим обработчик события «Нажатие»

Из за своей специфики асинхронные методы могут некорректно работать с обработчиками событий, у которых есть изменяемые параметры (такие как стандартная обработка) 

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

&НаКлиенте

Процедура АдресКартинкиНажатие(Элемент, СтандартнаяОбработка)

            СтандартнаяОбработка = Ложь;

            НачатьПомещениеИзображенияНаФорму();

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

&НаКлиенте

Асинх Процедура НачатьПомещениеИзображенияНаФорму()

            Фильтр = “Изображение |*.JPEG;*.JPG;*.PNG”;

            ВоВремяЗагрузкиФайла = Новый ОписаниеОповещения(“ВоВремяЗагрузкиФайла”,         ЭтотОбъект);

            ПередЗагрузкойФайла         = Новый ОписаниеОповещения(“ПередЗагрузкойФайла”,            ЭтотОбъект);

            ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов(“Выбор”,  Ложь, Фильтр);  

Результат = Ждать ПоместитьФайлНаСерверАсинх(ВоВремяЗагрузкиФайла,       ПередЗагрузкойФайла,, ПараметрыДиалога, УникальныйИдентификатор); 

            Если НЕ Результат = Неопределено Тогда

                        ЭтотОбъект.АдресКартинки = Результат.Адрес;

            КонецЕсли;

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

  • В процедуре «НачатьПомещениеИзображенияНаФорму()» пропишем следующий алгоритм:
  • Фильтр – для ограничения выбора изображения в проводнике.
  • При использовании метода «ПоместитьФайлНаСерверАсинх» выберем вариант с диалогом выбора файла.
  • В оповещении «ВоВремяЗагрузкиФайла» выведем пользователю состояние загрузки файла
  • В оповещении «ПередЗагрузкойФайла» проверим: является ли файл картинкой и установим максимальный размер файла загрузки.
  • В параметрах диалога выбора файла укажем заголовок, который будет отображаться в проводнике, отключим множественный выбор, передадим значение переменной фильтр
  • Сам метод нам вернет описание файла, помещенного во временное хранилище или Неопределено (если пользователь не выбрал файл)

&НаКлиенте

Процедура ВоВремяЗагрузкиФайла(ПомещаемыйФайл, Помещено, Отказ, ДопПараметры) Экспорт 

            Состояние(“Загружено”, Помещено);

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

&НаКлиенте

Процедура ПередЗагрузкойФайла(ПомещаемыйФайл, Отказ, ДопПараметры) Экспорт 

            ДвоичныеДанные = Новый ДвоичныеДанные(ПомещаемыйФайл.Файл.ПолноеИмя);

            Картинка = Новый Картинка(ДвоичныеДанные, Истина);

Если Картинка.Формат() = ФорматКартинки.НеизвестныйФормат ИЛИ Картинка.Формат() = Неопределено Тогда 

                        Отказ = Истина;

                        ПредупреждениеАсинх(“Файл не является картинкой”, 5, “Ошибка!”);

                        Возврат;

            КонецЕсли;

            // Для примера укажем, что максимальный размер картинки не должен превышать 2 мегабайт

            МаксимальныйРазмер = Pow(1024, 2) * 2;

            Если Картинка.РазмерФайла() > МаксимальныйРазмер Тогда

                        Отказ = Истина;

                        ПредупреждениеАсинх(“Размер файла не должен превышать 2 Мб”, 5, “Ошибка!”);

                        Возврат;

            КонецЕсли;

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

Для отображения состояния загрузки используем метод «Состояние»

Для проверки что файл является картинкой, необходимо:

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

Для проверки размера файла:

  • Получим максимальный размер изображения в байтах. Один килобайт равен 1024 байта, возведем в квадрат – получим один мегабайт и умножим на 2, это будет 2 мегабайта.
  • Сравним размер файла загрузки с максимальным размером. Если размер файла превышает максимальный размер, запретим загрузку файла, выведем оповещение пользователю и выйдем из процедуры.

Создание регистра сведений, запись изображения в регистр и получение изображения из регистра

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

Для оптимизации создадим непериодический регистр сведений «Файлы». Измерениями в нем будут «ОбъектЗаписи» тип значения составной типа, где можно выбрать все объекты конфигурации куда необходимо будет помещать изображения, в данном случае «СправочникСсылка.ФизическиеЛица», ресурс будет «Данные» тип хранилище значения, а реквизиты «Размер» тип значения чисто 10, 2, «Расширение» тип строка.

В модуле менеджера пропишем следующие методы

«ЗаписатьФайлВБазу()»  будет производить запись файла в информационную базу

Процедура ЗаписатьФайлВБазу(ОбъектЗаписи, ДанныеФайла, РазмерФайла, РасширениеФайла)   Экспорт

            АлгоритмСжатия = Новый СжатиеДанных(9);

            ДанныеХранилище = Новый ХранилищеЗначения(ДанныеФайла, АлгоритмСжатия);

            ЗаписьДанных = СоздатьМенеджерЗаписи();

            ЗаписьДанных.ОбъектЗаписи = ОбъектЗаписи;

            ЗаписьДанных.Данные = ДанныеХранилище;

            ЗаписьДанных.Размер         = РазмерФайла;

            ЗаписьДанных.Расширение = РасширениеФайла;

            ЗаписьДанных.Записать(Истина);

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

На вход будут поступать двоичные данные файла, которые преобразуем в хранилище значения и поместим в информационную базу

«ДанныеФайла()» будет производить чтение объекта куда были записаны данные файла,  получит двоичные данные файла из хранилища значения и вернет их на форму для дальнейшей обработки.

Функция ДанныеФайла(ОбъектЧтения) Экспорт

            ЧтениеФайла = СоздатьМенеджерЗаписи();

            ЧтениеФайла.ОбъектЗаписи = ОбъектЧтения;

            ЧтениеФайла.Прочитать();

            ДвоичныеДанные = ЧтениеФайла.Данные.Получить();

            Возврат ДвоичныеДанные;

КонецФункции // ()

Теперь вернемся к модулю формы и установим 2 обработчика событий «ПослеЗаписиНаСервере()» и «ПриЧтенииНаСервере()»

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

&НаСервере

Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

            Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда

                        ДанныеФайла = ПолучитьИзВременногоХранилища(АдресКартинки);

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

РегистрыСведений.Файлы.ЗаписатьФайлВБазу(ТекущийОбъект.Ссылка, ДанныеФайла,   Картинка.РазмерФайла(), Картинка.Формат());

            КонецЕсли;

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

В обработчике «ПриЧтениииНаСервере()» получим двоичные данные файла и поместим во временное хранилище.

&НаСервере

Процедура ПриЧтенииНаСервере(ТекущийОбъект)

            ДвоичныеДанные = РегистрыСведений.Файлы.ДанныеФайла(ТекущийОбъект.Ссылка);

            Если НЕ ДвоичныеДанные = Неопределено Тогда

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

            КонецЕсли;

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

Теперь при закрытии и открытии формы изображение будет отображаться на форме.

Формы изображения

Специалист компании ООО “Кодерлайн”,

Караваев Андрей


Помогла ли вам статья? Оставьте свой комментарий:

Добавить комментарий

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

Блог про 1С:Предприятие

Copyright © 2024 TopKoder

Мы занимаемся внедрением и обслуживанием программных продуктов 1С.