Рубрики
Примеры

Работа с файлами в 1С 8.3. Часть 2.

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

  • Выбор файла на клиенте. Создаем форму с реквизитом «ПолноеИмяФайла» и размещаем этот реквизит на форме. У поля ввода «ПолноеИмяФайла» добавляем отображение кнопки выбора и создаем соответствующий обработчик.

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

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

&НаКлиенте
Асинх Функция ВыбратьФайлАсинх(ДиалогВыбораФайла)
	
	ОбещаниеВыбора = ДиалогВыбораФайла.ВыбратьАсинх();
	ВыбранныеФайлы = Ждать ОбещаниеВыбора;
	ОбработатьВыборФайла(ВыбранныеФайлы);
	
КонецФункции

// Ожидаем выбор файла пользователем
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат)
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Количество() > 0 Тогда
		ПолноеИмяФайла = Результат[0];
	КонецЕсли;
	
	ПолучитьДанныеФайлаАсинх();
	
КонецПроцедуры

// Получаем информацию о файле
&НаКлиенте
Асинх Процедура ПолучитьДанныеФайлаАсинх()
	
	НайденныйФайл = ждать ПолучитьВыбранныйФайлАсинх();
	Если ТипЗнч(НайденныйФайл) = Тип("Файл") Тогда
		обРазмер = Ждать НайденныйФайл.РазмерАсинх();
		ДанныеФайла = Новый Структура("Файл, ИмяФайла, Размер, Расширение", НайденныйФайл, НайденныйФайл.Имя, обРазмер, НайденныйФайл.Расширение);
	КонецЕсли;
	
	Возврат;
	
КонецПроцедуры
  • Теперь передаем файл на сервер и сохраняем в базе данных. Для этого на форме создаем команду «ЗаписатьВБазуДанных» и размещаем соответствующую команде кнопку.

// Вызываем команду, в которой вызываем асинхронную процедуру для передачи файла на сервер
&НаКлиенте
Процедура ЗаписатьВБазуДанных(Команда)
	
	ДополнительныеПараметры = Новый Структура("ПолноеИмяФайла, ИмяФайла, Размер, Расширение", ПолноеИмяФайла, ИмяФайла, РазмерФайла, РасширениеФайла);
	ПередатьФайлНаСерверАсних(ДополнительныеПараметры);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПрогрессПомещенияФайла(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
	// Можно показать прогресс выполнения или отменить передачу
КонецПроцедуры

// Получаем данные файла из временного хранилища и записываем в заранее созданный регистр сведений
&НаСервере
Процедура ЗаписатьФайлВБазуДанных(АдресВХранилище, ДополнительныеПараметры)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	ЗаписьРегистра = РегистрыСведений.СохраненныеФайлы.СоздатьМенеджерЗаписи();
	ЗаписьРегистра.Идентификатор = СокрЛП(Новый УникальныйИдентификатор);
	ЗаписьРегистра.ДвоичныеДанные = Новый ХранилищеЗначения(ДвоичныеДанные);
	ЗаписьРегистра.Размер = ДополнительныеПараметры.Размер;
	ЗаписьРегистра.Расширение = ДополнительныеПараметры.Расширение;
	ЗаписьРегистра.ПолноеИмяФайла = ДополнительныеПараметры.ПолноеИмяФайла;
	ЗаписьРегистра.ИмяФайла = ДополнительныеПараметры.ИмяФайла;
	ЗаписьРегистра.ДатаВремяДобавления = ТекущаяДата();
	ЗаписьРегистра.Записать(Ложь);
	
КонецПроцедуры

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

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x