В предыдущей заметке я рассказал, как в 1С 8.3 выбрать файл, передать его на сервер, сохранить в базу данных, а потом извлечь обратно и сохранить обратно. Но этот рассказ будет неполным, если не дополнить его описанием с использованием асинхронных методов.
- Выбор файла на клиенте. Создаем форму с реквизитом «ПолноеИмяФайла» и размещаем этот реквизит на форме. У поля ввода «ПолноеИмяФайла» добавляем отображение кнопки выбора и создаем соответствующий обработчик.
// Обработчик события на клиенте, в котором показываем диалог выбора файла
&НаКлиенте
Процедура ПолноеИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДиалогВыбораФайла = ПолучитьДиалогВыбораФайла();
ВыбратьФайлАсинх(ДиалогВыбораФайла);
КонецПроцедуры
// Получаем диалог выбора файла
&НаКлиенте
Функция ПолучитьДиалогВыбораФайла()
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Заголовок = "Выберите файл...";
ДиалогВыбораФайла.Фильтр = "Изображение (*.jpg, jpeg)|*.jpg;*.jpeg|Архив (*.zip)|*.zip|Все файлы|*.*";
Возврат ДиалогВыбораФайла;
КонецФункции
&НаКлиенте
Асинх Функция ВыбратьФайлАсинх(ДиалогВыбораФайла)
ОбещаниеВыбора = ДиалогВыбораФайла.ВыбратьАсинх();
ВыбранныеФайлы = Ждать ОбещаниеВыбора;
ОбработатьВыборФайла(ВыбранныеФайлы);
КонецФункции
// Ожидаем выбор файла пользователем
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат)
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Количество() > 0 Тогда
ПолноеИмяФайла = Результат[0];
КонецЕсли;
ПолучитьДанныеФайлаАсинх();
КонецПроцедуры
// Получаем информацию о файле
&НаКлиенте
Асинх Процедура ПолучитьДанныеФайлаАсинх()
НайденныйФайл = ждать ПолучитьВыбранныйФайлАсинх();
Если ТипЗнч(НайденныйФайл) = Тип("Файл") Тогда
обРазмер = Ждать НайденныйФайл.РазмерАсинх();
ДанныеФайла = Новый Структура("Файл, ИмяФайла, Размер, Расширение", НайденныйФайл, НайденныйФайл.Имя, обРазмер, НайденныйФайл.Расширение);
КонецЕсли;
Возврат;
КонецПроцедуры
- Теперь передаем файл на сервер и сохраняем в базе данных. Для этого на форме создаем команду «ЗаписатьВБазуДанных» и размещаем соответствующую команде кнопку.
// Вызываем команду, в которой вызываем асинхронную процедуру для передачи файла на сервер
&НаКлиенте
Процедура ЗаписатьВБазуДанных(Команда)
ДополнительныеПараметры = Новый Структура("ПолноеИмяФайла, ИмяФайла, Размер, Расширение", ПолноеИмяФайла, ИмяФайла, РазмерФайла, РасширениеФайла);
ПередатьФайлНаСерверАсних(ДополнительныеПараметры);
КонецПроцедуры
// С использованием асинхронного метода ПоместитьФайлНаСерверАсинх передаем файл на сервер, ожидам окончания операции
&НаКлиенте
Асинх Процедура ПередатьФайлНаСерверАсних(ДополнительныеПараметры)
ОписаниеОповещения = Новый ОписаниеОповещения("ПрогрессПомещенияФайла", ЭтаФорма, ДополнительныеПараметры);
ОбПомещение = ПоместитьФайлНаСерверАсинх(ОписаниеОповещения,,, ПолноеИмяФайла,);
ПомещенныйФайл = Ждать ОбПомещение;
ЗаписатьФайлВБазуДанных(ПомещенныйФайл.Адрес, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ПрогрессПомещенияФайла(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
// Можно показать прогресс выполнения или отменить передачу
КонецПроцедуры
// Получаем данные файла из временного хранилища и записываем в заранее созданный регистр сведений
&НаСервере
Процедура ЗаписатьФайлВБазуДанных(АдресВХранилище, ДополнительныеПараметры)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ЗаписьРегистра = РегистрыСведений.СохраненныеФайлы.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Идентификатор = СокрЛП(Новый УникальныйИдентификатор);
ЗаписьРегистра.ДвоичныеДанные = Новый ХранилищеЗначения(ДвоичныеДанные);
ЗаписьРегистра.Размер = ДополнительныеПараметры.Размер;
ЗаписьРегистра.Расширение = ДополнительныеПараметры.Расширение;
ЗаписьРегистра.ПолноеИмяФайла = ДополнительныеПараметры.ПолноеИмяФайла;
ЗаписьРегистра.ИмяФайла = ДополнительныеПараметры.ИмяФайла;
ЗаписьРегистра.ДатаВремяДобавления = ТекущаяДата();
ЗаписьРегистра.Записать(Ложь);
КонецПроцедуры
Применение описанных в этой заметке методов вы можете увидеть, скачав демонстрационную конфигурацию.