Программирование, и жизнь

Хранение файлов в базе 1С. Примитивное файловое хранилище на Base64


Добрый день, это гайд из нескольких частей о том как можно удобно хранить файлы в самописной базе, а  также их открывать.
  • Примитивное файловое хранилище
Для того чтобы хранить файлы в базе данных, необходимо:
1. Создать справочник, с реквизитом файл, тип строка, длина - неограниченная, длина наименования 125
2. Описать процедуру загрузки файла

Файлы необходимо хранить в виде строки, алгоритм прост:
1. Запускаем диалоговое окно для выбора файла
2. Конвертируем выбранный файл в двоичные данные
3. Конвертируем в Base64, и сохраняем в справочнике


Соответственно чтобы открыть файлы, алгоритм будет обратный:
1. Base64 конвертируем в двоичные данные
2. Записываем на диск (будем использовать временную папку системы)
3. Открываем через ЗапуститьПриложение()

Начнем:

Загрузка файлов

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

 Открытие файлов

  •  Проверим заполнено ли значение файла
  • Для записи файла на диск из Base64 нам необходим новый полный путь к файлу, строим его относительно папки Temp, для этого вызываем функцию КаталогВременныхФайлов(), и крепим к нему наименование элемента справочника (в предыдущем разделе мы специальной сохраняли имя файла с расширением)
  • В переменную БинарныйФайл пишем двоичные данные из Base64, т.е. расшифровываем нашу строку с помощью Base64Значение()
  • Производим запись, и запуск файла с помощью ЗапуститьПриложение()
&НаКлиенте
Процедура ОткрытьФайл(Команда)
    Если ЗначениеЗаполнено(Объект.Файл) Тогда
        ПутьКФайлу = КаталогВременныхФайлов()+Объект.Наименование;
        БинарныйФайл = Base64Значение(Объект.Файл);
        БинарныйФайл.Записать(ПутьКФайлу);
        ЗапуститьПриложение(ПутьКФайлу);
    Иначе
        Сообщить("Файл не загружен");
    КонецЕсли;
КонецПроцедуры  
Так-же не забудьте навести красоту на форме.
Недостатки на данном этапе:
  • Можно загружать один и тот же файл сколько угодно раз
  • Временные файлы не удаляются
  • Файлы хранятся не в архиве, и занимают больше места
Скачать конфигурацию
Email: cHJvdHNlbmtvQHBtLm1l