Файлы внутри информационной базы: загрузка, хранение и выгрузка обратно
Содержание
Сохранить файл
в базу 1С можно двумя путями. В типовой конфигурации (БП 3.0, ЗУП 3.1, УТ 11) откройте документ или карточку и нажмите кнопку со скрепкой — «Присоединенные файлы»: файл ляжет в базу или в том на диске, в зависимости от настроек. В своей разработке файл кладут в реквизит типа ХранилищеЗначения: на клиенте помещают его во временное хранилище, а на сервере записывают в объект.
Где в 1С живут файлы: ХранилищеЗначения, тома и справочники вложений
Платформа 1С:Предприятие 8.3 не имеет отдельного типа «файл». Файл в базе — это двоичные данные, упакованные в значение одного из типов:
- 📦
ХранилищеЗначения— единственный тип реквизита, который можно записать в базу вместе с содержимым файла. Внутри лежит любое сериализуемое значение, чаще всегоДвоичныеДанные. Поддерживает сжатие. - 🧩
ДвоичныеДанные— содержимое файла в памяти. В реквизит объекта напрямую не записывается, это рабочий тип для кода. - 🔗 Строка с путём — в базе хранится только путь к файлу на сетевом диске. Сам файл живёт снаружи.
Типовые конфигурации построены на Библиотеке стандартных подсистем (БСП). В ней есть подсистема «Работа с файлами». Для каждого владельца, у которого есть вложения, заведён свой справочник: например, у документа реализации это справочник с именем вида РеализацияТоваровУслугПрисоединенныеФайлы. Каждый элемент — один файл с именем, расширением, автором, размером и историей версий.
| Способ | Где лежит содержимое | Когда подходит |
|---|---|---|
Реквизит ХранилищеЗначения | В таблице базы | Свои справочники, мелкие файлы, нужна целостность с объектом |
| Присоединённые файлы БСП в базе | В таблице базы | Типовые конфигурации, небольшой объём вложений |
| Присоединённые файлы БСП в томах | Каталог на диске, в базе — ссылка | Сканы, договоры, тысячи файлов |
| Строка с путём | Сетевая папка | Файлы уже лежат в общем архиве и меняются вне 1С |
Как сохранить файл в базу 1С через типовой интерфейс
Этот способ не требует конфигуратора. Работает в БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП.
- Откройте документ, справочник или контрагента, к которому нужно приложить файл. Документ должен быть записан хотя бы один раз: у нового объекта ещё нет ссылки, и файл не к чему привязать.
- В командной панели формы найдите кнопку со скрепкой. Если её не видно, откройте меню
Ещё— команда «Присоединенные файлы» будет там. - В открывшемся списке нажмите «Добавить» и выберите вариант: файл с диска, скан со сканера или новый файл по шаблону.
- Выберите файл в диалоге. После загрузки он появится в списке, а на кнопке со скрепкой — счётчик вложений.
- Чтобы открыть файл, дважды щёлкните по нему. Чтобы сохранить копию на диск, используйте команду сохранения в списке файлов.
Файл можно просто перетащить мышью из проводника в список присоединённых файлов. В тонком клиенте под Windows это быстрее диалога выбора.
Где включаются тома хранения
По умолчанию файлы кладутся внутрь информационной базы. Перенести их на диск может администратор: в разделе Администрирование → Общие настройки есть блок работы с файлами. Там включается флажок хранения файлов в томах на диске, задаются сами тома (каталоги) и максимальный размер загружаемого файла.
Перед переносом файлов в тома сделайте резервную копию базы . Перенос уже загруженных файлов выполняется отдельной командой и на большой базе идёт долго.
Каталог тома должен быть доступен на запись той учётной записи, от имени которой работает сервер 1С (в клиент-серверном варианте) или пользователь (в файловом). Иначе загрузка закончится ошибкой доступа.
Как загрузить файл в базу 1С программно
Задача: у справочника Документы есть реквизиты Файл (тип ХранилищеЗначения), ИмяФайла (строка) и РазмерФайла (число). Нужна кнопка «Загрузить» на форме элемента.
Главный приём, о котором спотыкаются новички: реквизит типа ХранилищеЗначения не передаётся в данные формы. В Объект.Файл на клиенте ничего не записать. Файл передают через временное хранилище, а в реквизит пишут в ПередЗаписьюНаСервере, где доступен настоящий объект.
На форме создайте реквизит формы АдресФайла (строка) и команду ЗагрузитьФайл. Модуль формы:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат; // пользователь закрыл диалог
КонецЕсли;
АдресФайла = Адрес;
Объект.ИмяФайла = Новый Файл(ВыбранноеИмяФайла).Имя;
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЗначениеЗаполнено(АдресФайла) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
ТекущийОбъект.Файл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТекущийОбъект.РазмерФайла = ДвоичныеДанные.Размер();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
Если ЗначениеЗаполнено(АдресФайла) Тогда
УдалитьИзВременногоХранилища(АдресФайла);
АдресФайла = "";
КонецЕсли;
КонецПроцедуры
Что здесь важно:
- 🔑
УникальныйИдентификаторформы привязывает временное хранилище к форме. Данные живут, пока форма открыта, и не пропадут до записи. - 🗜
Новый СжатиеДанных(9)— максимальное сжатие. Для.docx,.pdf,.jpg,.zipвыигрыша почти нет: эти форматы уже сжаты. Для.txt,.xml,.csvразмер падает в разы. - 🧹 Адрес очищается только после успешной записи. Если запись сорвётся, файл не потеряется и пользователь сможет записать ещё раз.
Загрузка без диалога: обработка или регламентное задание
Когда файлы забирают из папки автоматически, диалог не нужен. Код выполняется на сервере:
&НаСервереБезКонтекста
Процедура ЗагрузитьИзКаталога(ПутьККаталогу)
НайденныеФайлы = НайтиФайлы(ПутьККаталогу, "*.pdf");
Для Каждого НайденныйФайл Из НайденныеФайлы Цикл
Элемент = Справочники.Документы.СоздатьЭлемент();
Элемент.Наименование = НайденныйФайл.ИмяБезРасширения;
Элемент.ИмяФайла = НайденныйФайл.Имя;
ДвоичныеДанные = Новый ДвоичныеДанные(НайденныйФайл.ПолноеИмя);
Элемент.Файл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Элемент.РазмерФайла = ДвоичныеДанные.Размер();
Элемент.Записать();
КонецЦикла;
КонецПроцедуры
Новый ДвоичныеДанные(Путь) на сервере читает диск сервера 1С, а не компьютера пользователя. Путь C:\Users\buh\Desktop\scan.pdf с рабочего места пользователя сервер не увидит. Для общих папок используйте UNC-путь вида \\fileserver\scan\ и дайте права службе сервера 1С.
Загрузка в присоединённые файлы типовой конфигурации
В конфигурациях на БСП не пишите в справочник ...ПрисоединенныеФайлы напрямую — так теряются версии, размер и признак тома. Используйте программный интерфейс подсистемы:
ДвоичныеДанные = Новый ДвоичныеДанные("\\fileserver\scan\Договор_15.pdf");
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = ДоговорСсылка;
ПараметрыФайла.ИмяБезРасширения = "Договор_15";
ПараметрыФайла.РасширениеБезТочки = "pdf";
ПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайла);
Этот вызов сам решит, класть файл в базу или в том. Состав полей ПараметрыДобавленияФайла сверяйте с описанием общего модуля РаботаСФайлами в вашей версии БСП.
Несколько вложений к одному объекту: табличная часть или отдельный справочник
Один реквизит — один файл. Если к заявке надо приложить три скана, есть два варианта.
Вариант 1. Табличная часть. Создайте у документа табличную часть Вложения с колонками Файл (ХранилищеЗначения), ИмяФайла, РазмерФайла. Загрузка та же, только в ПередЗаписьюНаСервере добавляйте строки в ТекущийОбъект.Вложения.
Вариант 2. Подчинённый справочник. Справочник ФайлыЗаявок с владельцем — документом или реквизитом-ссылкой на него. Каждый файл — отдельный элемент.
| Критерий | Табличная часть | Подчинённый справочник |
|---|---|---|
| Сложность | Минимальная | Нужен отдельный объект и форма |
| Открытие документа | Читаются все файлы сразу | Документ лёгкий, файлы — по требованию |
| Права доступа | Как у документа | Можно настроить отдельно |
| Подходит для | 1–3 небольших файла | Много файлов или крупные сканы |
Главный аргумент в пользу справочника — скорость. Когда платформа читает объект, она читает его целиком, включая табличные части с хранилищами. Документ с пятью сканами по 5 МБ при каждом открытии тянет с сервера 25 МБ. Подчинённый справочник этого избегает: форма документа показывает только список имён.
Тот же эффект бывает при обращении через точку: ДокументСсылка.Вложения в коде загружает весь объект. Нужное поле лучше получать запросом.
Как достать сохранённый файл из базы и показать пользователю
Выгрузка — зеркало загрузки: сервер извлекает двоичные данные и кладёт их во временное хранилище, клиент получает файл по адресу.
&НаСервере
Функция АдресФайлаДляВыгрузки()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Т.Файл КАК Файл
|ИЗ
| Справочник.Документы КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Возврат "";
КонецЕсли;
ДвоичныеДанные = Выборка.Файл.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Возврат "";
КонецЕсли;
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура СохранитьНаДиск(Команда)
Адрес = АдресФайлаДляВыгрузки();
Если ПустаяСтрока(Адрес) Тогда
ПоказатьПредупреждение(, "В элементе нет сохранённого файла.");
Возврат;
КонецЕсли;
ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, Объект.ИмяФайла);
КонецПроцедуры
ФайловаяСистемаКлиент — модуль БСП. В конфигурации без библиотеки используйте платформенный метод НачатьПолучениеФайлов с массивом объектов ОписаниеПередаваемогоФайла.
Показ картинки прямо на форме
Если в хранилище лежит изображение, его не обязательно выгружать. Добавьте на форму реквизит-строку АдресКартинки и поле картинки, связанное с ним. При открытии формы на сервере:
АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файл");
Платформа сама отдаст содержимое реквизита полю картинки. Работает для записанного объекта; у нового элемента ссылки ещё нет.
Размер базы и ограничения: когда файлы лучше вынести
Каждый мегабайт вложений — это мегабайт в базе, в каждой выгрузке .dt и в каждой резервной копии. Скан договора на 2 МБ × 30 договоров в день × 250 рабочих дней = около 15 ГБ в год. База бухгалтерии без вложений часто весит меньше.
Когда пора переходить на тома или внешнее хранение:
- 📈 вложения занимают заметную долю размера базы, и резервное копирование стало долгим;
- 🐢 выгрузка в
.dtи загрузка копии для тестов занимают больше часа; - ☁️ база работает в облаке или по тарифу с ограничением объёма;
- 🖨 файлы — сканы и фото в высоком разрешении, а не мелкие документы.
Ограничения, которые стоит знать заранее:
- Память.
Получить()поднимает весь файл в память рабочего процесса. Видеофайл на 1 ГБ в хранилище — плохая идея: сервер будет держать гигабайт на каждый одновременный запрос. - Файловая база. Все файлы оказываются внутри
1Cv8.1CD. Большой файл базы дольше копируется и чаще страдает при сбое питания. Тома снимают эту проблему. - Запросы. По полю
ХранилищеЗначениянельзя отбирать, сортировать и группировать. Всё, по чему нужен поиск — имя, размер, дату, — храните в отдельных реквизитах. - Тома и резервные копии. Если файлы в томах, бэкап базы их не содержит. Каталоги томов копируйте отдельно и в то же время, что и базу, иначе после восстановления часть ссылок будет вести в пустоту.
Частые ошибки при сохранении файлов в базу
- ❌ Пишут в
Объект.Файлна клиенте. Реквизита-хранилища в данных формы нет, запись либо падает с ошибкой, либо молча ничего не сохраняет. Решение — временное хранилище иПередЗаписьюНаСервере. - ❌ Кладут в хранилище путь вместо содержимого.
Новый ХранилищеЗначения("C:\scan.pdf")сохранит строку с путём, а не файл. СначалаНовый ДвоичныеДанные(Путь), затем хранилище. - ❌ Помещают во временное хранилище без идентификатора формы. Без
УникальныйИдентификаторданные могут быть удалены раньше, чем пользователь нажмёт «Записать». - ❌ Не сохраняют имя и расширение. Хранилище хранит только байты. Без
ИмяФайлапри выгрузке непонятно, это.pdfили.xlsx, и ОС не откроет файл нужной программой. - ❌ Обновляют типовую конфигурацию после правки справочника вложений. Добавленные в типовой справочник реквизиты конфликтуют при обновлении. Свои реквизиты и формы делайте в расширении конфигурации.