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