Как реализовать возможность прикрепления файлов в конфигурации 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Вопрос организации хранения файлов в системе 1С является фундаментальным при разработке любой прикладной конфигурации. Независимо от того, создаете ли вы систему электронного документооборота или просто хотите прикреплять сканы счетов к документам поступления, перед вами встает выбор: использовать готовые механизмы или изобрести собственный велосипед. Разберем детально оба пути, проанализируем их плюсы и минусы, а также изучим технические тонкости реализации.

Вариант 1: Использование Библиотеки стандартных подсистем (БСП)

Для большинства современных конфигураций использование Библиотеки стандартных подсистем (БСП) является золотым стандартом. Как отмечают опытные специалисты, "лучше использовать БСП, а не колхозить". Подсистема «Работа с файлами» в БСП уже содержит в себе все необходимые функции: хранение версий, возможность хранения на диске или в базе, очистку ненужных файлов и механизмы защиты.

Разберем по шагам, как интегрировать этот механизм в свою конфигурацию, если она построена на базе БСП:

  1. Настройка метаданных: Необходимо включить ваш объект (например, документ ПриходнаяНакладная) в состав определяемых типов. Найдите в конфигураторе ОпределяемыйТип.ВладелецПрисоединенныхФайлов и добавьте туда ссылку на ваш документ.
  2. Создание справочника: Для каждого объекта-владельца файлов в БСП принято создавать отдельный справочник (например, ПриходнаяНакладнаяПрисоединенныеФайлы). Это позволяет избежать раздувания одной таблицы и ускоряет работу системы.
  3. Подключение команд: Добавьте ваш тип документа в общую команду ПрисоединенныеФайлы. Это позволит вывести стандартную кнопку «Файлы» на форму документа без написания кода.
  4. Настройка прав: Не забудьте обновить роли, чтобы пользователи имели доступ к новым справочникам с файлами.

Проанализируем ситуацию, если база полностью самописная. В этом случае БСП можно внедрять частично. Рассмотрим подробнее, что это дает: вы получаете отработанный код, который прошел проверку на тысячах внедрений. Однако, как справедливо замечено в обсуждении, для новичка БСП может показаться слишком сложной из-за большого количества связей и процедур.

Вариант 2: Самостоятельная реализация (архитектура «Справочник + Регистр»)

Если вы решили реализовать механизм с нуля, нам потребуется продумать архитектуру хранения. Рассмотрим наиболее эффективную схему, которая не будет замедлять работу системы при простом просмотре списков документов.

Посмотрим на пример структуры:

  1. Справочник Файлы: Здесь мы храним только метаданные — наименование файла, расширение, размер, дату добавления и ссылку на объект-владелец.
  2. Регистр сведений или реквизит для данных: Сами двоичные данные (двоичный код файла) лучше хранить отдельно. Проанализируем причину: если хранить тяжелые данные прямо в реквизите справочника Файлы, то при каждом обращении к элементу справочника (например, при выводе списка имен файлов) платформа будет пытаться прочитать весь объем данных из базы. Это приведет к колоссальным задержкам.

Выясним причину, почему регистр сведений предпочтительнее. При использовании регистра мы можем обращаться к данным файла только в тот момент, когда пользователь нажал кнопку «Открыть». В остальное время система работает только с легкими ссылками.

Пример кода для помещения файла в хранилище (используем ХранилищеЗначения):


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

Вариант 3: Хранение файлов на внешних томах (на диске)

Рано или поздно база данных 1С начнет стремительно расти из-за вложений. Чтобы избежать проблем с производительностью СУБД и упростить бэкапы, разберем способ хранения файлов вне базы — на сетевом диске.

Проанализируем технические нюансы этого метода:

Для реализации этого метода в справочнике файлов вместо хранения данных в ХранилищеЗначения мы будем записывать только строковый путь к файлу на сервере.

Оптимизация и безопасность

Рассмотрим дополнительные возможности, которые сделают вашу систему профессиональной:

  1. Контроль дублей (Хеширование): Перед сохранением файла вычислите его хеш-сумму (например, MD5). Если в системе уже есть файл с таким хешем, не копируйте данные повторно, а просто создайте ссылку на уже существующий объект. Это сэкономит до 30-50% места в архивах.
  2. Запрещенные расширения: Обязательно добавьте проверку расширений. Не позволяйте пользователям загружать исполняемые файлы (.exe, .bat, .vbs), чтобы предотвратить распространение вирусов через базу 1С.
  3. Работа в веб-клиенте: Помните, что в браузере нельзя напрямую работать с файловой системой. Для этого используйте асинхронные методы платформы, такие как НачатьПомещениеФайлаНаСервер. Рассмотрим пример вызова:

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

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

Подведение итогов

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

Если же задача разовая, а конфигурация предельно простая — реализуйте схему «Справочник для имен + Регистр для данных». Это позволит вам быстро получить рабочий результат и сохранить высокую скорость работы интерфейсов. Главное — не забывайте про сжатие данных и ограничение типов загружаемых файлов, чтобы ваша база оставалась компактной и безопасной.

← На главную