- Регистрация
- 9 Май 2015
- Сообщения
- 1,071
- Баллы
- 155
- Возраст
- 51
1С Предприятие позволяет прикреплять к объектам конфигурации произвольные объекты, в том числе файлы.
Это бывает очень полезно. Поскольку позволяет, например, хранить не только информацию о документах, но и сами документы в формате pdf, txt и т.д. Механизм сохранения и выгрузки одинаков для всех типов файлов.
Создание хранилища файлов
Файлы можно хранить непосредственно в самих объектах конфигурации, к которым они относятся. Но, это не лучшее решение, так как файлы могут иметь очень большой размер. Гораздо эффективнее создать для них отдельной хранилище.
Создадим справочник Файлы. В нём, помимо стандартных, будут следующие атрибуты:
Процесс загрузки файлов состоит из двух этапов:
В качестве примера, рассмотрим информационную базу «Библиотека» в которой планируется хранить полнотекстовые произведения классических авторов.
Для справочника «Авторы» создадим специальную форму, а в ней команду «Добавить файл».
В клиентской процедуре мы вызываем диалог выбора файла, и, если файл выбран, помещаем прочитанный файл во временное хранилище. При этом для окончательной записи в справочник передаём на сервер адрес файла во временном хранилище и его имя.
&НаКлиенте
Процедура ДобавитьФайл(Команда)
ПолноеИмяФайла = "";
ПутьФайла = "";
Если ПоместитьФайл(ПутьФайла, , ПолноеИмяФайла, Истина) = Истина Тогда
АдресВоВременномХранилище = ПутьФайла;
ЗаписатьФайл(АдресВоВременномХранилище, ПолучитьИмяФайла(ПолноеИмяФайла));
КонецЕсли;
КонецПроцедуры
Имя файла получаем из полного имени (полного пути на диске) с помощью шаблонного решения:
Функция ПолучитьИмяФайла(ПолныйПуть)
ИсхСтрока = ПолныйПуть;
Позиция = Найти(ИсхСтрока, "\");
ПозицияКонечная = 0;
Пока Позиция <> 0 Цикл
ПозицияКонечная = ПозКонечная + Позиция;
ИсхСтрока = Сред(ИсхСтрока, Позиция+1);
Позиция = Найти(ИсхСтрока, "\");
КонецЦикла;
ИмяФайла = Сред(ПолныйПуть, ПозицияКонечная + 1);
Возврат ИмяФайла;
КонецФункции
На сервере мы создаём новый элемент справочника «Файлы» и записываем в реквизит «Файл» данные из временного хранилища. После этого записываем в реквизит «ИмяФайла» исходное имя файла, полученное с клиентской стороны, а в атрибут «Владелец» записываем ссылку на элемент справочника «Авторы» к которому относится загруженный файл.
После этого сохраняем вновь созданный элемент в справочнике «Файлы».
&НаСервере
Процедура ЗаписатьФайл(АдресВоВременномХранилище,ИмяФайла)
НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
НовыйФайл.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище));
НовыйФайл.ИмяФайла=ИмяФайла;
НовыйФайл.Владелец=Объект.Ссылка;
НовыйФайл.Записать();
КонецПроцедуры
Процесс загрузки файла в информационную базу 1С завершён.
Загрузка файлов (улучшенный способ)
Выше был приведён так называемый «стандартный» способ загрузки файлов, в котором используется временное хранилище. Но, он работает не всегда и бывает, что файлы не загружаются.
Это обстоятельство вызвано издержками работы временного хранилища. Однако помимо «стандартного», есть и другой более надёжный способ.
Он основан на использовании объекта «ДвоичныеДанные» и подразумевает загрузку файла в этот объект вместо временного хранилища.
&НаКлиенте
Процедура ДобавитьКартинку(Команда)
ПолноеИмяФайла = "";
Если ПоместитьФайл( , , ПолноеИмяФайла, Истина) = Истина Тогда
Данные = Новый ДвоичныеДанные(ПолноеИмяФайла);
ЗаписатьФайл(ПолучитьИмяФайла(ПолноеИмяФайла), Данные);
КонецЕсли;
КонецПроцедуры
Вместо адреса во временном хранилище, из которого ещё требуется извлечь необходимые данные, в этом способе на серверной стороне обрабатывается сразу непосредственное содержимое файла.
&НаСервере
Процедура ЗаписатьФайл(ИмяФайла, Данные)
НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
НовыйФайл.Файл=Новый ХранилищеЗначения(Данные, Новый СжатиеДанных());
НовыйФайл.Наименование=ИмяФайла;
НовыйФайл.ИмяФайла=ИмяФайла;
НовыйФайл.Владелец=Объект.Ссылка;
НовыйФайл.Записать();
КонецПроцедуры
В результате получаем надёжное средство загрузки файлов информационную базу, которое работает корректно практически всегда.
Выгрузка файлов
Для выгрузки файлов из информационной базы на жёсткий диск создадим простейшую форму элемента справочника «Файлы».
Эта форма не содержит ничего, кроме команды «Выгрузить файл».
Выгрузка файлов также состоит из двух этапов:
На клиентской стороне с помощью объекта «ДиалогВыбораФайла» выбираем папку для сохранения и передаём её имя на сервер.
&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите папку для сохранения";
Диалог.МножественныйВыбор = Ложь;
Если Диалог.Выбрать() Тогда
ПолучитьДанные(Диалог.Каталог);
КонецЕсли;
КонецПроцедуры
В свою очередь на сервере формируем полное имя файла и, получив двоичные данные файла из справочника, сохраняем файл.
К сожалению 1С Предприятие не всегда добавляет символ «\» в конец имени папки. Поэтому при формировании полного имени файла добавлена проверка.
&НаСервере
Процедура ПолучитьДанные(Каталог)
Если Прав(Каталог,1)="\" Тогда
ИмяФайла=Каталог+Объект.ИмяФайла;
Иначе
ИмяФайла=Каталог+"\"+Объект.ИмяФайла;
КонецЕсли;
Знч=Объект.Ссылка.Файл.Получить();
Знч.Записать(ИмяФайла);
КонецПроцедуры
С помощью приведённой процедуры файл, хранящийся в информационной базе 1С можно выгрузить в любую выбранную папку.
Это бывает очень полезно. Поскольку позволяет, например, хранить не только информацию о документах, но и сами документы в формате pdf, txt и т.д. Механизм сохранения и выгрузки одинаков для всех типов файлов.
Создание хранилища файлов
Файлы можно хранить непосредственно в самих объектах конфигурации, к которым они относятся. Но, это не лучшее решение, так как файлы могут иметь очень большой размер. Гораздо эффективнее создать для них отдельной хранилище.
Создадим справочник Файлы. В нём, помимо стандартных, будут следующие атрибуты:
- Файл – тип данных хранилище значения.
В нём и будут храниться двоичные данные файла; - ИмяФайла – тип данных строка (неограниченная длина).
Исходное имя файла вместе с расширением (будет использоваться для выгрузки); - Владелец – тип данных ссылка на объект конфигурации (справочник, документ) или любая ссылка.
Хранит ссылку на объект конфигурации, к которому относится файл.
Процесс загрузки файлов состоит из двух этапов:
- На клиенте – выбор файла и его загрузка файла во временное хранилище;
- На сервере – сохранение файла в ранее созданный справочник.
В качестве примера, рассмотрим информационную базу «Библиотека» в которой планируется хранить полнотекстовые произведения классических авторов.
Для справочника «Авторы» создадим специальную форму, а в ней команду «Добавить файл».
В клиентской процедуре мы вызываем диалог выбора файла, и, если файл выбран, помещаем прочитанный файл во временное хранилище. При этом для окончательной записи в справочник передаём на сервер адрес файла во временном хранилище и его имя.
&НаКлиенте
Процедура ДобавитьФайл(Команда)
ПолноеИмяФайла = "";
ПутьФайла = "";
Если ПоместитьФайл(ПутьФайла, , ПолноеИмяФайла, Истина) = Истина Тогда
АдресВоВременномХранилище = ПутьФайла;
ЗаписатьФайл(АдресВоВременномХранилище, ПолучитьИмяФайла(ПолноеИмяФайла));
КонецЕсли;
КонецПроцедуры
Имя файла получаем из полного имени (полного пути на диске) с помощью шаблонного решения:
Функция ПолучитьИмяФайла(ПолныйПуть)
ИсхСтрока = ПолныйПуть;
Позиция = Найти(ИсхСтрока, "\");
ПозицияКонечная = 0;
Пока Позиция <> 0 Цикл
ПозицияКонечная = ПозКонечная + Позиция;
ИсхСтрока = Сред(ИсхСтрока, Позиция+1);
Позиция = Найти(ИсхСтрока, "\");
КонецЦикла;
ИмяФайла = Сред(ПолныйПуть, ПозицияКонечная + 1);
Возврат ИмяФайла;
КонецФункции
На сервере мы создаём новый элемент справочника «Файлы» и записываем в реквизит «Файл» данные из временного хранилища. После этого записываем в реквизит «ИмяФайла» исходное имя файла, полученное с клиентской стороны, а в атрибут «Владелец» записываем ссылку на элемент справочника «Авторы» к которому относится загруженный файл.
После этого сохраняем вновь созданный элемент в справочнике «Файлы».
&НаСервере
Процедура ЗаписатьФайл(АдресВоВременномХранилище,ИмяФайла)
НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
НовыйФайл.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище));
НовыйФайл.ИмяФайла=ИмяФайла;
НовыйФайл.Владелец=Объект.Ссылка;
НовыйФайл.Записать();
КонецПроцедуры
Процесс загрузки файла в информационную базу 1С завершён.
Загрузка файлов (улучшенный способ)
Выше был приведён так называемый «стандартный» способ загрузки файлов, в котором используется временное хранилище. Но, он работает не всегда и бывает, что файлы не загружаются.
Это обстоятельство вызвано издержками работы временного хранилища. Однако помимо «стандартного», есть и другой более надёжный способ.
Он основан на использовании объекта «ДвоичныеДанные» и подразумевает загрузку файла в этот объект вместо временного хранилища.
&НаКлиенте
Процедура ДобавитьКартинку(Команда)
ПолноеИмяФайла = "";
Если ПоместитьФайл( , , ПолноеИмяФайла, Истина) = Истина Тогда
Данные = Новый ДвоичныеДанные(ПолноеИмяФайла);
ЗаписатьФайл(ПолучитьИмяФайла(ПолноеИмяФайла), Данные);
КонецЕсли;
КонецПроцедуры
Вместо адреса во временном хранилище, из которого ещё требуется извлечь необходимые данные, в этом способе на серверной стороне обрабатывается сразу непосредственное содержимое файла.
&НаСервере
Процедура ЗаписатьФайл(ИмяФайла, Данные)
НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
НовыйФайл.Файл=Новый ХранилищеЗначения(Данные, Новый СжатиеДанных());
НовыйФайл.Наименование=ИмяФайла;
НовыйФайл.ИмяФайла=ИмяФайла;
НовыйФайл.Владелец=Объект.Ссылка;
НовыйФайл.Записать();
КонецПроцедуры
В результате получаем надёжное средство загрузки файлов информационную базу, которое работает корректно практически всегда.
Выгрузка файлов
Для выгрузки файлов из информационной базы на жёсткий диск создадим простейшую форму элемента справочника «Файлы».
Эта форма не содержит ничего, кроме команды «Выгрузить файл».
Выгрузка файлов также состоит из двух этапов:
- На клиенте – выбор папки, в которую следует сохранить выгружаемый файл;
- На сервере – собственно выгрузка файла.
На клиентской стороне с помощью объекта «ДиалогВыбораФайла» выбираем папку для сохранения и передаём её имя на сервер.
&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите папку для сохранения";
Диалог.МножественныйВыбор = Ложь;
Если Диалог.Выбрать() Тогда
ПолучитьДанные(Диалог.Каталог);
КонецЕсли;
КонецПроцедуры
В свою очередь на сервере формируем полное имя файла и, получив двоичные данные файла из справочника, сохраняем файл.
К сожалению 1С Предприятие не всегда добавляет символ «\» в конец имени папки. Поэтому при формировании полного имени файла добавлена проверка.
&НаСервере
Процедура ПолучитьДанные(Каталог)
Если Прав(Каталог,1)="\" Тогда
ИмяФайла=Каталог+Объект.ИмяФайла;
Иначе
ИмяФайла=Каталог+"\"+Объект.ИмяФайла;
КонецЕсли;
Знч=Объект.Ссылка.Файл.Получить();
Знч.Записать(ИмяФайла);
КонецПроцедуры
С помощью приведённой процедуры файл, хранящийся в информационной базе 1С можно выгрузить в любую выбранную папку.