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

Работа с файлами в 1С 8.3

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

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

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


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

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

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

// Получаем информацию о файле - имя, размер, расширение
&НаКлиенте
Функция ПолучитьДанныеФайла()
	
	Результат = Неопределено;

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

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

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

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

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

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

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

// Показываем пользователю сообщение о завершении операции
&НаКлиенте
Процедура ПослеСохраненияФайла(Результат, ДополнительныеПараметры) Экспорт
	
	ПоказатьПредупреждение(, "Сохранен файл " + СокрЛП(ДополнительныеПараметры.ПолноеИмяФайла));
	
КонецПроцедуры

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

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