Где держать вложения 1С:Предприятия, чтобы база не разрасталась

· 10 мин

Содержание

Хранить файлы в 1С можно тремя способами: внутри информационной базы в реквизите типа ХранилищеЗначения, на диске в томах хранения файлов (база держит только ссылку и метаданные) или в виде пути к внешнему файлу без контроля со стороны 1С. Для небольших объёмов удобнее база, для сканов и вложений в десятки гигабайт — тома на диске.

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) выбор уже реализован: по умолчанию файлы лежат в базе, а администратор может переключить хранение на тома. Если вы пишете свою конфигурацию или доработку, решение придётся принять самому. От него зависят размер базы, скорость резервного копирования и то, кто сможет прочитать вложение в обход прав 1С.

Три способа хранения файлов и чем они отличаются по сути

Разница между способами — в том, где физически лежат байты файла и кто отвечает за их целостность.

  • 📦 Внутри базы. Двоичные данные упакованы в ХранилищеЗначения и лежат в таблице СУБД или в файле 1Cv8.1CD. Одна резервная копия содержит всё, права проверяет 1С.
  • 🗂️ Тома на диске. Файл записан в каталог на сервере, в базе — запись с именем, размером, хешем и относительным путём. За файлы отвечает 1С, но физически их можно потерять отдельно от базы.
  • 🔗 Путь к внешнему файлу. В реквизите строки хранится \\srv\docs\договор.pdf. 1С не знает, существует ли файл, не контролирует версии и права.

Третий вариант годится только для ссылок на документы, которые живут своей жизнью в другой системе (общая папка отдела, документооборот). Для вложений, которые пользователь прикрепляет к документу в 1С, его не используйте: через год половина путей будет вести в никуда.

Хранение файлов в самой базе через ХранилищеЗначения

ХранилищеЗначения — тип, который сериализует значение (в том числе ДвоичныеДанные) и может его сжать. Реквизит этого типа нельзя использовать в условиях запроса, сортировке и отборах: это просто контейнер с байтами.

Где разместить реквизит

Главная ошибка — добавить реквизит Файл типа ХранилищеЗначения прямо в документ или справочник. При каждом ПолучитьОбъект() платформа читает все реквизиты объекта, включая хранилище. Документ с вложенным сканом на 5 МБ будет открываться и проводиться заметно медленнее, а обработка, перебирающая тысячу таких документов, прочитает гигабайты лишних данных.

Правильная схема — вынести двоичные данные в отдельную таблицу:

  1. Справочник или регистр сведений с описанием файла: владелец, имя, расширение, размер, дата, автор.
  2. Отдельный регистр сведений (или отдельный справочник), где измерение — ссылка на файл, а ресурс — ХранилищеЗначения с данными.
  3. Данные читаются только тогда, когда пользователь действительно открывает или скачивает файл.

Так устроена подсистема «Работа с файлами» в БСП: карточки присоединённых файлов отдельно, двоичные данные отдельно.

Пример: загрузка файла с клиента в базу

Файл с компьютера пользователя попадает на сервер через временное хранилище. Ниже — рабочий пример для управляемой формы с асинхронным выбором файла. Регистр ФайлыОбъектов условный: измерения Владелец и ИмяФайла, ресурс Данные типа ХранилищеЗначения.

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    СохранитьФайлНаСервере(Адрес, ВыбранноеИмяФайла);
КонецПроцедуры

&НаСервере
Процедура СохранитьФайлНаСервере(Адрес, ПолноеИмяФайла)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    МенеджерЗаписи = РегистрыСведений.ФайлыОбъектов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Владелец = Объект.Ссылка;
    МенеджерЗаписи.ИмяФайла = Новый Файл(ПолноеИмяФайла).Имя;
    МенеджерЗаписи.Данные = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
    МенеджерЗаписи.Записать();
    УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры

Объект-владелец к этому моменту должен быть записан. У нового документа Объект.Ссылка пустая, и файл «повиснет» без владельца. Проверьте Объект.Ссылка.Пустая() до загрузки.

Обратная операция: на сервере МенеджерЗаписи.Данные.Получить() возвращает ДвоичныеДанные, их кладут во временное хранилище через ПоместитьВоВременноеХранилище() и передают адрес на клиент для сохранения файла.

Тома на диске: как хранить файлы в 1С вне базы

Том хранения — каталог на диске или сетевом ресурсе, куда 1С складывает файлы под служебными именами. В базе остаётся карточка файла и относительный путь внутри тома.

Настройка в типовых конфигурациях

В конфигурациях на БСП настройка находится в разделе Администрирование, в группе настроек работы с файлами (в Бухгалтерии 3.0 — среди общих настроек, название группы зависит от релиза). Порядок такой:

  1. Создайте каталог на файловом сервере, например \\fs01\1c_files\buh.
  2. Дайте права на запись учётной записи, от которой работает сервер 1С (по умолчанию служба запускается от USR1CV8, но у вас может быть доменная учётная запись).
  3. В справочнике томов создайте том: путь для Windows-сервера, при необходимости путь для Linux-сервера, максимальный размер и порядок заполнения.
  4. Переключите хранение файлов на тома.

Переключение влияет только на новые файлы. То, что уже лежит в базе, остаётся там. Для переноса старых вложений в БСП есть отдельная обработка; запускайте её в нерабочее время, она пишет много данных.

Указывайте путь в формате 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С.

Ещё два способа сократить объём:

  1. Сканы — в разумном разрешении. Скан первички в цвете на 600 dpi весит в несколько раз больше, чем ч/б на 200–300 dpi, а прочитать его не легче. Настройте сканер у пользователей.
  2. Дубликаты — по хешу. Если одинаковый файл (например, устав или доверенность) прикрепляют к сотне документов, храните его один раз и ссылайтесь из карточек.

Чтобы понять, сколько места занимают файлы, в клиент-серверной базе посмотрите размеры таблиц в СУБД, а соответствие таблиц объектам конфигурации покажет метод ПолучитьСтруктуруХраненияБазыДанных().

Права доступа и защита вложений

При хранении в базе файл защищён теми же правами, что и данные учёта: роли и ограничения на уровне записей. Пользователь без права на документ не увидит и его вложения, если доступ к регистру с файлами ограничен по владельцу.

С томами появляется вторая линия, которую часто забывают:

  • 🔐 Клиент-серверный вариант. Файлы с тома читает и пишет сервер 1С. Пользователям доступ к сетевой папке не нужен вообще — дайте права только учётной записи службы сервера и администраторам.
  • 🖥️ Файловый вариант. Файлы читает клиентское приложение под учётной записью пользователя, поэтому каждому нужен доступ к каталогу тома. Любой из них может открыть папку проводником, скопировать или удалить файлы. Учитывайте это при выборе способа.
  • 🧾 Журнал регистрации. Фиксирует действия в 1С, но не обращения к папке тома в обход программы. Аудит каталога настраивают средствами Windows.
  • 🔏 Шифрование. Для конфиденциальных вложений (кадровые документы, медицинские справки) в БСП есть шифрование файлов сертификатом. Зашифрованный файл безопасно лежит и в базе, и в томе.

Резервные копии томов содержат те же персональные данные, что и база. Храните их с теми же ограничениями доступа, а не в общей папке «Бэкапы».

Копируйте тома и базу в одно окно времени. Если восстановить базу на вчера, а тома взять сегодняшние (или наоборот), часть карточек будет ссылаться на файлы, которых нет. В БСП есть проверка целостности томов — запускайте её после любого восстановления.

Частые вопросы

Можно ли хранить файлы в макете конфигурации?
Да, если файл неизменный и нужен всем: шаблон договора, логотип, внешняя компонента. Для этого есть макет типа «Двоичные данные». Пользовательские вложения так хранить нельзя — макет меняется только в Конфигураторе.
Почему после перехода на тома база не уменьшилась?
Переключение касается только новых файлов. Перенесите старые обработкой переноса, затем в клиент-серверном варианте сожмите базу средствами СУБД, в файловом — тестированием и исправлением со сжатием таблиц.
Попадают ли файлы из томов в выгрузку .dt?
Нет. В .dt попадают только карточки файлов с путями. При переносе базы на другой сервер копируйте каталог томов отдельно и поправьте пути в справочнике томов.
Можно ли найти файл запросом по содержимому?
Нет, поле ХранилищеЗначения в запросе не используется для отбора. Ищут по реквизитам карточки: имени, расширению, хешу. Поиск по тексту внутри файлов — через полнотекстовый поиск, если конфигурация извлекает из файлов текст.
Что будет, если удалить файл из тома вручную?
Карточка в 1С останется, а при открытии появится ошибка, что файл не найден. Восстановить его можно только из резервной копии тома.