Вопрос организации хранения файлов в системе 1С является фундаментальным при разработке любой прикладной конфигурации. Независимо от того, создаете ли вы систему электронного документооборота или просто хотите прикреплять сканы счетов к документам поступления, перед вами встает выбор: использовать готовые механизмы или изобрести собственный велосипед. Разберем детально оба пути, проанализируем их плюсы и минусы, а также изучим технические тонкости реализации.
Для большинства современных конфигураций использование Библиотеки стандартных подсистем (БСП) является золотым стандартом. Как отмечают опытные специалисты, "лучше использовать БСП, а не колхозить". Подсистема «Работа с файлами» в БСП уже содержит в себе все необходимые функции: хранение версий, возможность хранения на диске или в базе, очистку ненужных файлов и механизмы защиты.
Разберем по шагам, как интегрировать этот механизм в свою конфигурацию, если она построена на базе БСП:
ПриходнаяНакладная) в состав определяемых типов. Найдите в конфигураторе ОпределяемыйТип.ВладелецПрисоединенныхФайлов и добавьте туда ссылку на ваш документ.ПриходнаяНакладнаяПрисоединенныеФайлы). Это позволяет избежать раздувания одной таблицы и ускоряет работу системы.ПрисоединенныеФайлы. Это позволит вывести стандартную кнопку «Файлы» на форму документа без написания кода.Проанализируем ситуацию, если база полностью самописная. В этом случае БСП можно внедрять частично. Рассмотрим подробнее, что это дает: вы получаете отработанный код, который прошел проверку на тысячах внедрений. Однако, как справедливо замечено в обсуждении, для новичка БСП может показаться слишком сложной из-за большого количества связей и процедур.
Если вы решили реализовать механизм с нуля, нам потребуется продумать архитектуру хранения. Рассмотрим наиболее эффективную схему, которая не будет замедлять работу системы при простом просмотре списков документов.
Посмотрим на пример структуры:
Файлы, то при каждом обращении к элементу справочника (например, при выводе списка имен файлов) платформа будет пытаться прочитать весь объем данных из базы. Это приведет к колоссальным задержкам.Выясним причину, почему регистр сведений предпочтительнее. При использовании регистра мы можем обращаться к данным файла только в тот момент, когда пользователь нажал кнопку «Открыть». В остальное время система работает только с легкими ссылками.
Пример кода для помещения файла в хранилище (используем ХранилищеЗначения):
// Выбираем файл на диске
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда
ВыбранныйФайл = Новый Файл(Диалог.ПолноеИмяФайла);
ДвоичныеДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
// Создаем запись в справочнике метаданных
НовыйФайл = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
НовыйФайл.Наименование = ВыбранныйФайл.Имя;
НовыйФайл.ВладелецФайла = Объект.Ссылка;
НовыйФайл.Записать();
// Записываем сами данные в регистр сведений
МенеджерЗаписи = РегистрыСведений.ДанныеФайлов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Файл = НовыйФайл.Ссылка;
// Используем сжатие для экономии места
МенеджерЗаписи.Данные = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
МенеджерЗаписи.Записать();
КонецЕсли;
Рано или поздно база данных 1С начнет стремительно расти из-за вложений. Чтобы избежать проблем с производительностью СУБД и упростить бэкапы, разберем способ хранения файлов вне базы — на сетевом диске.
Проанализируем технические нюансы этого метода:
\\ServerName\FilesStorage\.\2023\10\файл.pdf. Это связано с ограничениями файловых систем по количеству объектов в одной директории.Для реализации этого метода в справочнике файлов вместо хранения данных в ХранилищеЗначения мы будем записывать только строковый путь к файлу на сервере.
Рассмотрим дополнительные возможности, которые сделают вашу систему профессиональной:
.exe, .bat, .vbs), чтобы предотвратить распространение вирусов через базу 1С.НачатьПомещениеФайлаНаСервер. Рассмотрим пример вызова:
&НаКлиенте
Процедура ПрикрепитьФайл(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла", ЭтотОбъект);
НачатьПомещениеФайлаНаСервер(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузкиФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// Передаем временный адрес файла на сервер для сохранения в базу
СохранитьФайлНаСервере(Адрес, ВыбранноеИмяФайла);
КонецЕсли;
КонецПроцедуры
Выясним, какой путь выбрать именно вам. Если вы планируете развивать конфигурацию долгосрочно и она будет расти — однозначно используйте БСП. Несмотря на порог вхождения, она избавит вас от множества ошибок, связанных с правами доступа и производительностью.
Если же задача разовая, а конфигурация предельно простая — реализуйте схему «Справочник для имен + Регистр для данных». Это позволит вам быстро получить рабочий результат и сохранить высокую скорость работы интерфейсов. Главное — не забывайте про сжатие данных и ограничение типов загружаемых файлов, чтобы ваша база оставалась компактной и безопасной.