Загрузка файла в хранилище значений через управляемые формы осложняется тем, что реквизит с типом Хранилище значения недоступен в данных формы. То есть работать с ним напрямую не получится.
Начиная с версии 1С:Предприятие 8.3.15, доступна процедура НачатьПомещениеФайлаНаСервер(). Она позволяет с помощью диалога выбрать файл на клиенте и поместить его во Временное хранилище, чтобы потом на сервере поместить файл в Хранилище значения.
Рассмотрим пример работы с этой процедурой.
Во-первых, нам понадобится реквизит управляемой формы АдресВХранилище. Туда будет записан адрес файла во временном хранилище. Этот реквизит мы сможем прочитать и на клиенте, и на сервере.
После этого создаем кнопку, команду и процедуру НаКлиенте, которую вызывает эта кнопка (кнопку можно заменить на другой элемент управления). В процедуре размещаем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
&НаКлиенте Процедура ЗагрузитьПодпись(Команда) Фильтр = "Все картинки (*.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|"; Диалог = новый ПараметрыДиалогаПомещенияФайлов("Выберите файл с подписью", Ложь, Фильтр); Оповещение = новый ОписаниеОповещения("ПослеЗакрытияДиалогаВыбораПодписи", ЭтаФорма); НачатьПомещениеФайлаНаСервер(Оповещение,,,, Диалог, УникальныйИдентификатор); КонецПроцедуры |
Здесь мы задали фильтр на тип (расширение) файла, в данном случае выбираем картинки всевозможных форматов. После этого создали Диалог помещения файла, где указали заголовок диалогового окна, запретили множественный выбор (второй параметр — Ложь) и установили заранее подготовленный фильтр. Далее создаем Описание оповещения, которое указывает на процедуру в модуле данной формы, которая будет вызвана после помещения файла во временное хранилище. При желании можно отдельными описаниями оповещения указать процедуры, которые будут вызываться в ходе выполнения помещения файла во временное хранилище, а также непосредственно перед помещением.
И, наконец, начинаем помещение файла на сервер. При этом вызывается диалоговое окно выбора файла с теми параметрами, которые мы указали.
Теперь создадим процедуру, которую будем вызывать после завершения помещения файла во временное хранилище:
1 2 3 4 5 6 7 8 9 10 |
&НаКлиенте Процедура ПослеЗакрытияДиалогаВыбораПодписи (ОписаниеФайла, ДопПараметры) Экспорт Если ОписаниеФайла.ПомещениеФайлаОтменено ТОгда Возврат; КОнецЕсли; АдресВХранилище = ОписаниеФайла.Адрес; КонецПроцедуры |
Как обычно, асинхронный метод НачатьПомещениеФайлаНаСервер() возвращает результат и дополнительные параметры. В качестве результата возвращается переменная с типом ОписаниеФайла. Дополнительные параметры мы в нашем примере не задавали.
В первую очередь проверяем, не была ли отменена процедура помещения файла во временное хранилище. Если была, прерываем дальнейшие действия. Если же все прошло хорошо, то записываем адрес временного хранилища в реквизит формы АдресВХранилище.
Теперь осталось только перед записью объекта получить файл из временного хранилища и поместить его в реквизит с типом ХранилищеЗначения.
1 2 3 4 5 6 7 8 9 10 |
&НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЭтоАдресВременногоХранилища(АдресВХранилище) ТОгда ТекущийОбъект.Подпись = новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВХранилище)); КонецЕсли; КонецПроцедуры |
Используем обработчик события формы ПередЗаписьюНаСервере. Сначала проверяем, является ли содержимое реквизита формы АдресВХранилище адресом временного хранилища. Если да, то стандартным способом получаем файл из временного хранилища и записываем в реквизит. В нашем случае реквизит называется Подпись.