1с сохранить файл в базе данных
Технологическая платформа 1С:Предприятие 8 позволяет сохранять в информационной базе произвольные файлы, получать их оттуда и использовать различными способами. Рассмотрим эти операции на примерах.
Перед выполнением загрузки файла в информационную базу 1С нужно получить полный адрес файла на диске. Работа с диалогами выбора файлов описана в отдельной статье.
Для хранения файлов используется реквизит (или ресурс регистра) с типом ХранилищеЗначения.
Загрузка произвольного файла в информационную базу 1С
Любой файл можно представить в виде двоичных данных и загрузить в ХранилищеЗначений.
При преобразовании двоичных данных в объект ХранилищеЗначения используется конструкция новый ХранилищеЗначения(Данные,Сжатие) с двумя параметрами:
- Данные — двоичные данные, которые нужно поместить в хранилище
- Сжатие — степень сжатия алгоритма Deflation. Целое число в диапазоне -1…9. -1 — степень сжатия по умолчанию. 0 — никакого сжатия, 9 — максимальная степень сжатия. Значение по умолчанию: -1. Параметр необязательный, если не указан, то сжатие не используется.
//В переменной Путь находится полный адрес файла на диске
//Преобразуем файл в двоичные данные
Файл = Новый ДвоичныеДанные ( Путь ) ;
//Создаем новый объект ХранилищеЗначения
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
ХранилищеДанных = Новый ХранилищеЗначения ( Файл , Новый СжатиеДанных ( 9 ) ) ;
Сохранение произвольного файла из информационной базы 1С на диск
Для сохранения файла из базы 1С на диск нужно определить путь и имя файла. Для этого существует диалог сохранения файлов, работа с которым описана в отдельной статье.
//Получаем двоичные данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
Данные = ХранилищеДанных . Получить ( ) ;
//Записываем полученные данные на диск
//В переменной Путь находится полный адрес файла на диске
Данные . Записать ( Путь ) ;
Просмотр файла, находящегося в информационной базе 1С
Для просмотра сохраненного в базе файла необходимо, чтобы на компьютере было установлено приложение, открывающее данный файл.
//Получаем имя временного файла с необходимым расширением
//В переменную Расширение нужно поместить расширение файла, например "pdf"
Путь = ПолучитьИмяВременногоФайла ( Расширение ) ;
//Получаем данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
Данные = ХранилищеДанных . Получить ( ) ;
//Записываем данные во временный файл
Данные . Записать ( Путь ) ;
//Пытаемся открыть файл в предназначенном для него приложении
//Если приложение не найдено, появится системный диалог "Открыть с помощью. "
ЗапуститьПриложение ( Путь ) ;
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
С выходом новых релизов платформ 1С изменяются некоторые методы. Некоторые улучшаются, некоторые (не будем уточнять =) ). Тем не менее, изменения есть. В этой публикации я ознакомлю вас с методами загрузки и выгрузки файла (а это НачатьПомещениеФайла и НачатьПолучениеФайлов соответственно).
Разработано на 8.3.6.2041. Минимальная версия 8.3.3.641.
Для понимания механизма достаточно воспользоваться следующими новыми методами: НачатьПомещениеФайла , НачатьПолучениеКаталогаДокументов , НачатьПолучениеФайлов . Вспомогательными будут: ОписаниеОповещения , Файл , ПолучитьИзВременногоХранилища .
В свойствах конфигурации установлено :
Режим использования модальности - Не использовать
Режим использования синхронных вызовов - Не использовать (Свойство доступно начиная с версии 8.3.6.1760)
Режим совместимости - Не использовать.
Настройки БД:
Для реализации примера создал константу "Данные файла" (тип ХранилищеЗначения) общую форму "Сохранение файла". Через общую форму (где все реализовано) выполняется сохранение файла в константу, выгрузка и открытие загруженного ранее файла.
Спросите "Почему данные записываются в константу, а не в справочник или регистр сведений?". Тут все просто. Я посчитал что для упрощения понимания механизма использовать константу самое то :). Главное понять суть механизма, а вариант реализации программист уже выбирает исходя из структуры своей БД.
Почему не прикрепил конфигурацию, а выложил листинг кода?
Я считаю, что публикацию будет читать пользователь, уже имеющий опыт программирования в среде платформы 8.3 (умеет создавать объекты конфигурации, знает, что такое СП и как пользоваться встроенной справкой). Поэтому создать рабочий пример у себя в БД не составит особых проблем. Нужно: создать константу, создать общую форму, в новую форму вставить листинги кода (ниже в публикации), создать команды на форме ( СохранитьФайл, ОткрытьФайл, УдалитьФайл ) и подвязать обработчики.
Краткое описание используемых методов (копипаст СП не делал :) ):
НачатьПомещениеФайла - Вызывается диалог выбора файла. Выбранный файл помещается во временное хранилище.
НачатьПолучениеФайлов - Выполняется получение данных файла с БД и сохранение файла в указанный пользователем каталог.
Файл - Доступ к свойствам файла по полному пути к файлу.
ПолучитьИзВременногоХранилища , ПоместитьВоВременноеХранилище - В данном примере это методы работы с двоичными данными файла.
НачатьПолучениеКаталогаДокументов (КаталогДокументов) - Получение каталога документов пользователя (аналог КаталогДокументов).
ОписаниеПередаваемогоФайла - Определение полного имени файла в ОС по которому будет сохранен файл из ИБ.
ОписаниеОповещения - Описание вызова процедуры которая будет вызвана после какого-то действия пользователя (Пример: После действия пользователя НачатьПолучениеКаталогаДокументов будет вызвана процедура, где в параметре "ИмяКаталогаДокументов" будет строка в полным адресом к каталогу документов пользоватя: "C:\Users\Имя пользователя\Documents").
НачатьЗапускПриложения - Открытие файла ассоциированным приложением.
Примечание: Основные методы используются с 8.3.3.641. А НачатьПолучениеКаталогаДокументов с 8.3.6.1760.
Листинги:
Служебная процедура (в которой выполняется проверка наличия данных константы)
теги: НачатьПомещениеФайла, НачатьПолучениеФайлов, ОписаниеПереданногоФайла
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются "интерфейс ТАКСИ", модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие - многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали - бегом марш! (ссылка)
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
и прочие языческие штучки здесь не прокатят.
Вот листинг кода, который позволяет загрузить файл с клиента
Нас интересует метод "НачатьПомещениеФайлов", который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните - это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную "Адрес").
С тем, что файлы нужно хранить в реквизите или ресурсе с типом "Хранилище значения", спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом "Хранилище значения" можно след.образом:
С одним разобрались, теперь второе - как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом "Хранилище значения", куда у нас помещается файл в виде бинарных данных.
Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
По традиции, листинг кода, который вызывает диалог сохранения файла
Значение переменной "Файл" это ещё одна особенность данного способа. Здесь стоит обратить внимание на "ИмяФайла". Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом "А это вордовский документ или мп3?"
Метод "НачатьПолучениеФайлов" аналогичен методу "НачатьПомещениеФайлов". Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
Лицензия на сервер + 100 рабочих мест. Электронная поставка.
Настройка и доработка 1С:Документооборот для борьбы с ошибками. Гарантия на все результаты работ.
Оперативные консультации по 1С. Не тратьте время - мы поможем решить проблему любой сложности.
Идеально подходит для средних, крупных компаний и холдингов со сложным документооборотом
Типовой функционал, встроенный в прикладные решения 1С
Чтобы массив документов и файлов «не перерос» возможности штатных специалистов, их следует оснастить инструментом работы с данным бизнес-процессом – программой автоматизации документооборота «1С:Документооборот», где помимо официальных документов, можно работать и с прикрепленными файлами. Это могут быть приложения к различным входящим, исходящим, внутренним документам в виде текстовых документов или таблиц, архивов, изображений, аудио или видеофайлов, и т.п.
Файлы в 1С Документооборот
Системой предусмотрены следующие варианты хранения:
1. В самой базе. То есть все загруженные в программу файлы хранятся в таблицах СУБД: если база файловая – в файле *.dt, а в клиент-серверной помещаются в хранилище СУБД.
Преимущества этого варианта:
- Все файлы в одном месте (в ИБ);
- Безопасность данных;
- Резервное копирование осуществляется стандартным способом.
- Все документы и их версии хранятся в ИБ, что приводит к ее быстрому росту;
- Большой объем ИБ приводит к снижению производительности программы.
2. В томах на диске. Здесь сами файлы будут в каталогах файловой системы, а в СУБД будут находится лишь ссылки на них. Каталоги с документами могут находиться на жестком диске, сервере или размещаться на компьютере в локальной сети.
Преимущества такого хранения:
- Объем ИБ значительно уменьшается;
- С ИБ быстрее работать;
- Размер тома ограничивается только объемом жесткого диска;
- Резервная копия ИБ делается отдельно от копии файлового тома.
К недостаткам можно отнести расположение ИБ и файлов в разных местах, что сказывается на контроле доступа и, в конечном итоге, на безопасности данных.
Настройки хранения в ИБ
Определение места хранения производится в разделе «Настройки и администрирование», зайдя в информационную базу с правами администратора. Далее проходим «Настройки программы-Работа с файлами».
Рис.1 Настройки программы-Работа с файлами
Рис.2 Работа с файлами
Если в настройке не установлена галочка «Хранить файлы в томах на диске», то они будут храниться в информационной базе.
Рис.3 Настройка работы с файлами
До тех пор, пока хоть один том не будет указан, система будет хранить файлы непосредственно в ИБ.
Тома хранения файлов в 1С Документооборот
Перейдя по гиперссылке «Тома хранения файлов», производим их настройку.
Рис.5 Тома хранения файлов
Файлы можно сгруппировать в определенную структуру по папкам. Нажав кнопку «Создать группу», задаем структуру папок.
Рис.6 Создание группы
При создании папок тома необходимо создать папку и задать ей права системного пользователя, от имени которого запускается и работает служба сервера 1С:Предприятия. Создадим для примера папку «1C_Tom» и выполним ее настройку, щелкнув правой кнопкой мышки и открыв меню «Свойства» по кнопке «Расширенная настройка».
Рис.7 Расширенная настройка
Устанавливаем галочку «Открыть общий доступ к этой папке» и нажимаем «Разрешения».
Рис.8 Разрешения
Далее указываем имя пользователя, под которым работает сервер 1С, и отмечаем все права – полный доступ, чтение, изменение.
Рис.9 Указание имени пользователя
Сетевое имя папки указывается в настройках тома, куда будут сохраняться наши файлы документов.
Рис.10 Сетевое имя папки
Создадим том хранения файлов – кнопка «Создать».
Рис.11 Создание тома хранения файлов
В настройке тома указывается его наименование, группа, к которой он будет принадлежать, и сетевой путь. Если поле «Максимальный размер» не заполнять, то размер тома будет не ограничен.
Рис.12 Максимальный размер
После сохранения настройки в окне «Тома хранения файлов» будет отображено имя тома и его путь.
Рис.13 Имя тома и его путь
Если создано несколько групп, то настройки томов выполняются для всех их.
Рис.14 Сохранение настроек
При необходимости можно настроить правила размещения для каждого тома по кнопке «Правила размещения файлов». В открывшемся окне (кнопка «Добавить») делаем настройку правил.
Рис.15 Правила размещения файлов
Можно установить галочку «Правило по умолчанию» или задать условие, установить отбор.
Рис.16 Создание правила
Рис.17 Правило в списке
В качестве условия отбора может быть установлено: автор, зашифрован, подписан ЭП и другие условия.
Рис.18 Условия отбора
При указании правил размещения обязательно должно быть прописано правило без условий – правило «По умолчанию». Оно используется, если файлы не удовлетворяют указанным другим условиям. С помощью кнопок «Переместить вверх» и «Переместить вниз» можно менять местами правила или перетащив строки мышкой.
Рис.19 Перемещение правил в списке
Редактирование файлов и работа с ними в 1С:Документооборот
Для просмотра списка всех файлов, созданных в «1С:Документооборот», можно воспользоваться разделом «Файлы». Они прикреплены к карточкам входящих/исходящих/внутренних документов и доступны в разделе «Документы и файлы». Также, при необходимости, пользователь может воспользоваться разделом «Все файлы».
Рис.20 Все файлы
В этих разделах можно увидеть информацию о местоположении файла, его авторе, дате создания, размере.
Рис.21 Информация о файле
Рис.22 Список всех файлов
Открыть карточку для редактирования можно или двойным щелчком мышки, или правой кнопкой, далее нажать «Изменить» или «F2» на клавиатуре.
Рис.23 Открытие карточки для редактирования
Рис.24 Изменение данных файла
Открыв файл для редактирования, нажимаем кнопку «Редактировать», в результате чего будет открыт документ. Дальнейшая работа по редактированию одинакова в обоих журналах.
Рис.25 Редактирование файла
Файл, который редактируется, выделен зеленым цветом. И если сотрудник забыл завершить редактирование, администратору можно его отменить – кнопка «Отменить редактирование».
Рис.26 Отмена редактирования
Поэтому после окончания редактирования сотрудник должен завершить его по одноименной кнопке для сохранения изменений в системе. И только после этого файл будет доступен другим пользователям.
Рис.27 Закончить редактирование
При сохранении изменений можно оставить комментарий, что было изменено.
Рис.28 Сохранение изменений
В меню «Версии» можно посмотреть, какие изменения, кто и когда вносил в файл.
Рис.29 Вкладка версии
Если было несколько изменений, можно посмотреть их отличия (команда «Показать отличия»), а если были найдены ошибки, то можно вернуться к одной из версий, нажав кнопку «Сделать активно» или выбрав команду контекстного меню «Сделать активной».
Рис.30 Сделать активно
Программа «1С:Документооборот» позволяет пользователю работать с различными типами файлов, хранить их, систематизирует их, обеспечивает быстрый поиск и постоянный доступ к ним.
Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).
Объект сериализуется
Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.
Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.
Задачи, для решения которых можно использовать двоичные данные:
Работа с двоичными данными:
Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.
Примеры по работе с двоичными данными
Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).
Заполнение:
Получение (фрагмент кода, выполняемый на сервере):
Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.
Рис.1 Скачивание картинки из интернета
Функция, скачивающая картинку из интернета:
Использование функции:
Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».
Рис.2 Поле картинки
По событию ПриСозданииНаСервере
Готово, на форме у нас картинка.
Двоичные данные и потоки
Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).
Последовательность действий при работе с двоичными данными без использования потоков:
- Получить двоичные данные из базы;
- Записать их во временный файл;
- Разархивировать;
- Удалить временный файл;
- Прочитать разархивированный файл.
Последовательность действий при работе с потоками:
- Получить двоичные данные из базы;
- Открыть поток для чтения;
- Разархивировать;
- Прочитать разархивированный файл.
Пример кода без использования потоков:
Пример кода по работе с потоком:
Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.
Работа с Base64
Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.
строка в Base64
Платформа 1С также позволяет кодировать двоичные данные, не прибегая к сериализации. Для этого есть две функции:
Они преобразуются в Base64 и обратно в двоичные данные.
Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.
Читайте также: