Где держать вложения 1С:Предприятия, чтобы база не разрасталась
Содержание
Хранить файлы в 1С можно тремя способами: внутри информационной базы в реквизите типа ХранилищеЗначения, на диске в томах хранения файлов (база держит только ссылку и метаданные) или в виде пути к внешнему файлу без контроля со стороны 1С. Для небольших объёмов удобнее база, для сканов и вложений в десятки гигабайт — тома на диске.
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) выбор уже реализован: по умолчанию файлы лежат в базе, а администратор может переключить хранение на тома. Если вы пишете свою конфигурацию или доработку, решение придётся принять самому. От него зависят размер базы, скорость резервного копирования и то, кто сможет прочитать вложение в обход прав 1С.
Три способа хранения файлов и чем они отличаются по сути
Разница между способами — в том, где физически лежат байты файла и кто отвечает за их целостность.
- 📦 Внутри базы. Двоичные данные упакованы в
ХранилищеЗначенияи лежат в таблице СУБД или в файле1Cv8.1CD. Одна резервная копия содержит всё, права проверяет 1С. - 🗂️ Тома на диске. Файл записан в каталог на сервере, в базе — запись с именем, размером, хешем и относительным путём. За файлы отвечает 1С, но физически их можно потерять отдельно от базы.
- 🔗 Путь к внешнему файлу. В реквизите строки хранится
\\srv\docs\договор.pdf. 1С не знает, существует ли файл, не контролирует версии и права.
Третий вариант годится только для ссылок на документы, которые живут своей жизнью в другой системе (общая папка отдела, документооборот). Для вложений, которые пользователь прикрепляет к документу в 1С, его не используйте: через год половина путей будет вести в никуда.
Хранение файлов в самой базе через ХранилищеЗначения
ХранилищеЗначения — тип, который сериализует значение (в том числе ДвоичныеДанные) и может его сжать. Реквизит этого типа нельзя использовать в условиях запроса, сортировке и отборах: это просто контейнер с байтами.
Где разместить реквизит
Главная ошибка — добавить реквизит
Файл типа ХранилищеЗначения прямо в документ или справочник. При каждом ПолучитьОбъект() платформа читает все реквизиты объекта, включая хранилище. Документ с вложенным сканом на 5 МБ будет открываться и проводиться заметно медленнее, а обработка, перебирающая тысячу таких документов, прочитает гигабайты лишних данных.
Правильная схема — вынести двоичные данные в отдельную таблицу:
- Справочник или регистр сведений с описанием файла: владелец, имя, расширение, размер, дата, автор.
- Отдельный регистр сведений (или отдельный справочник), где измерение — ссылка на файл, а ресурс —
ХранилищеЗначенияс данными. - Данные читаются только тогда, когда пользователь действительно открывает или скачивает файл.
Так устроена подсистема «Работа с файлами» в БСП: карточки присоединённых файлов отдельно, двоичные данные отдельно.
Пример: загрузка файла с клиента в базу
Файл с компьютера пользователя попадает на сервер через временное хранилище. Ниже — рабочий пример для управляемой формы с асинхронным выбором файла. Регистр ФайлыОбъектов условный: измерения Владелец и ИмяФайла, ресурс Данные типа ХранилищеЗначения.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
СохранитьФайлНаСервере(Адрес, ВыбранноеИмяФайла);
КонецПроцедуры
&НаСервере
Процедура СохранитьФайлНаСервере(Адрес, ПолноеИмяФайла)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
МенеджерЗаписи = РегистрыСведений.ФайлыОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Владелец = Объект.Ссылка;
МенеджерЗаписи.ИмяФайла = Новый Файл(ПолноеИмяФайла).Имя;
МенеджерЗаписи.Данные = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
МенеджерЗаписи.Записать();
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Объект-владелец к этому моменту должен быть записан. У нового документа Объект.Ссылка пустая, и файл «повиснет» без владельца. Проверьте Объект.Ссылка.Пустая() до загрузки.
Обратная операция: на сервере МенеджерЗаписи.Данные.Получить() возвращает ДвоичныеДанные, их кладут во временное хранилище через ПоместитьВоВременноеХранилище() и передают адрес на клиент для сохранения файла.
Тома на диске: как хранить файлы в 1С вне базы
Том хранения — каталог на диске или сетевом ресурсе, куда 1С складывает файлы под служебными именами. В базе остаётся карточка файла и относительный путь внутри тома.
Настройка в типовых конфигурациях
В конфигурациях на БСП настройка находится в разделе Администрирование, в группе настроек работы с файлами (в Бухгалтерии 3.0 — среди общих настроек, название группы зависит от релиза). Порядок такой:
- Создайте каталог на файловом сервере, например
\\fs01\1c_files\buh. - Дайте права на запись учётной записи, от которой работает сервер 1С (по умолчанию служба запускается от
USR1CV8, но у вас может быть доменная учётная запись). - В справочнике томов создайте том: путь для Windows-сервера, при необходимости путь для Linux-сервера, максимальный размер и порядок заполнения.
- Переключите хранение файлов на тома.
Переключение влияет только на новые файлы. То, что уже лежит в базе, остаётся там. Для переноса старых вложений в БСП есть отдельная обработка; запускайте её в нерабочее время, она пишет много данных.
Указывайте путь в формате UNC (\\сервер\ресурс), а не букву сетевого диска. Служба сервера 1С не видит диски, подключённые в сеансе пользователя.
Свой механизм томов в доработке
Если пишете хранение на диске сами, держите в базе только описание, а файл называйте уникальным идентификатором, а не исходным именем:
ИмяНаДиске = Строка(Новый УникальныйИдентификатор) + ".bin";
ПолныйПуть = КаталогТома + ПолучитьРазделительПути() + ИмяНаДиске;
ДвоичныеДанные.Записать(ПолныйПуть);
Уникальное имя решает три проблемы: не бывает конфликтов «договор.pdf» от разных контрагентов, нет кириллицы и запрещённых символов в путях, файл не опознать по имени при случайном доступе к каталогу. Распределяйте файлы по подкаталогам (например, по году и месяцу): каталог со стами тысяч файлов медленно открывается и тяжело копируется.
В карточке храните хеш содержимого — его считают через ХешированиеДанных с ХешФункция.SHA256. По хешу потом проверяют, что файл на диске не подменили и не повредили.
Сравнение способов хранения файлов
| Критерий | В базе (ХранилищеЗначения) | Тома на диске | Путь к внешнему файлу |
|---|---|---|---|
| Резервная копия | одна копия базы содержит всё | копия базы + копия томов, синхронно | 1С не отвечает |
| Рост базы | растёт вместе с файлами | почти не растёт | не растёт |
| Права доступа | только через роли 1С | роли 1С + права на каталог | права файловой системы |
Перенос базы, выгрузка .dt | файлы внутри | каталог тома переносят отдельно | ссылки ломаются |
| Скорость работы с базой | падает при больших объёмах | не страдает | не страдает |
| Риск рассинхронизации | нет | есть, если копировать по отдельности | высокий |
Ориентир из практики: пока вложений немного (единицы гигабайт), хранение в базе проще. Когда вложения начинают составлять заметную долю базы, бэкап и выгрузка .dt тянутся часами из-за файлов, которые никто не меняет, — пора переходить на тома.
Большие двоичные данные: файлы на сотни мегабайт
Объект ДвоичныеДанные целиком помещается в оперативную память процесса. Файл на 500 МБ — это 500 МБ в памяти рабочего процесса сервера, плюс копия во временном хранилище, плюс сериализация при записи в ХранилищеЗначения. Несколько одновременных загрузок способны съесть память рабочего процесса.
Что делать с большими файлами:
- 📏 Ограничьте размер. Проверяйте
ДвоичныеДанные.Размер()и отказывайте в загрузке сверх порога, например 100 МБ. В БСП такой лимит задаётся в настройках работы с файлами. - 🧩 Работайте потоками.
ДвоичныеДанные.ОткрытьПотокДляЧтения()иФайловыйПотокпозволяют читать и писать частями, не держа всё в памяти. Для записи на диск это лучший вариант. - ✂️ Делите при передаче. Глобальные методы
РазделитьФайл()иОбъединитьФайлы()режут файл на части заданного размера и собирают обратно. Так большие архивы передают через нестабильный канал. - 🗄️ Не кладите огромные файлы в базу. Резервные копии, видео, образы дисков — только в тома или во внешнее хранилище.
Временное хранилище живёт в памяти сервера. После загрузки всегда вызывайте УдалитьИзВременногоХранилища(), иначе данные провисят до закрытия формы или окончания сеанса.
В веб-клиенте ограничения на передачу файлов могут задавать ещё и веб-сервер и публикация. Если загрузка крупного файла обрывается только через браузер, проверьте лимиты размера запроса в настройках IIS или Apache.
Сжатие файлов и экономия места
Новый СжатиеДанных(9) при создании ХранилищеЗначения включает сжатие алгоритмом Deflate с максимальным уровнем (шкала от 0 до 9). Насколько оно поможет, зависит от формата файла:
| Тип файла | Эффект сжатия |
|---|---|
| TXT, XML, CSV, выгрузки | сильный, размер падает в разы |
| BMP, несжатый TIFF | заметный |
| DOCX, XLSX, ODT | слабый — это уже ZIP-архивы |
| PDF, JPG, PNG, ZIP, 7z | почти нулевой, только тратит процессор |
Практичное правило: сжимайте по расширению. Для текстовых и XML-форматов уровень 9, для изображений и архивов — без сжатия (Новый СжатиеДанных(0) или без второго параметра). Если нужно сложить несколько файлов в один, используйте ЗаписьZipФайла — получится обычный архив, который откроется и вне 1С.
Ещё два способа сократить объём:
- Сканы — в разумном разрешении. Скан первички в цвете на 600 dpi весит в несколько раз больше, чем ч/б на 200–300 dpi, а прочитать его не легче. Настройте сканер у пользователей.
- Дубликаты — по хешу. Если одинаковый файл (например, устав или доверенность) прикрепляют к сотне документов, храните его один раз и ссылайтесь из карточек.
Чтобы понять, сколько места занимают файлы, в клиент-серверной базе посмотрите размеры таблиц в СУБД, а соответствие таблиц объектам конфигурации покажет метод ПолучитьСтруктуруХраненияБазыДанных().
Права доступа и защита вложений
При хранении в базе файл защищён теми же правами, что и данные учёта: роли и ограничения на уровне записей. Пользователь без права на документ не увидит и его вложения, если доступ к регистру с файлами ограничен по владельцу.
С томами появляется вторая линия, которую часто забывают:
- 🔐 Клиент-серверный вариант. Файлы с тома читает и пишет сервер 1С. Пользователям доступ к сетевой папке не нужен вообще — дайте права только учётной записи службы сервера и администраторам.
- 🖥️ Файловый вариант. Файлы читает клиентское приложение под учётной записью пользователя, поэтому каждому нужен доступ к каталогу тома. Любой из них может открыть папку проводником, скопировать или удалить файлы. Учитывайте это при выборе способа.
- 🧾 Журнал регистрации. Фиксирует действия в 1С, но не обращения к папке тома в обход программы. Аудит каталога настраивают средствами Windows.
- 🔏 Шифрование. Для конфиденциальных вложений (кадровые документы, медицинские справки) в БСП есть шифрование файлов сертификатом. Зашифрованный файл безопасно лежит и в базе, и в томе.
Резервные копии томов содержат те же персональные данные, что и база. Храните их с теми же ограничениями доступа, а не в общей папке «Бэкапы».
Копируйте тома и базу в одно окно времени. Если восстановить базу на вчера, а тома взять сегодняшние (или наоборот), часть карточек будет ссылаться на файлы, которых нет. В БСП есть проверка целостности томов — запускайте её после любого восстановления.
Частые вопросы
Можно ли хранить файлы в макете конфигурации?
Почему после перехода на тома база не уменьшилась?
Попадают ли файлы из томов в выгрузку .dt?
.dt попадают только карточки файлов с путями. При переносе базы на другой сервер копируйте каталог томов отдельно и поправьте пути в справочнике томов.Можно ли найти файл запросом по содержимому?
ХранилищеЗначения в запросе не используется для отбора. Ищут по реквизитам карточки: имени, расширению, хешу. Поиск по тексту внутри файлов — через полнотекстовый поиск, если конфигурация извлекает из файлов текст.