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

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

Когда вы разрабатываете собственную конфигурацию, рано или поздно перед вами встает задача прикрепления различных файлов к объектам системы. Будь то сканы договоров, фотографии товаров или техническая документация, важно выбрать правильный путь реализации, чтобы не столкнуться с деградацией производительности в будущем. Давайте разберем, как грамотно подойти к этому вопросу.

Создание структуры данных: подчиненный справочник

Первым и самым надежным шагом при проектировании системы хранения является создание подчиненного справочника. Назовем его, например, ПрисоединенныеФайлы. Владельцем этого справочника должен выступать тот объект, к которому будут прикрепляться файлы (например, СправочникСсылка.Контрагенты или СправочникСсылка.Договоры).

Внутри этого справочника рекомендуется хранить метаданные файла:

  1. Наименование файла (имя с расширением).
  2. Дата создания.
  3. Автор (пользователь).
  4. Ссылка на владельца (стандартный реквизит Владелец в 1С).
  5. Дата модификации.

Методы хранения содержимого файла

После того как мы определили структуру метаданных, возникает главный вопрос: где хранить само содержимое (бинарные данные)? Рассмотрим основные подходы, которые обсуждались в сообществе:

1. Хранение внутри информационной базы

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

Преимущества:

Недостатки:

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

2. Внешнее хранение (тома или файловые системы)

Для крупных проектов профессионалы рекомендуют выносить файлы за пределы базы. Вы можете хранить их на выделенном сетевом ресурсе или в SQL-таблицах другой базы данных. В таком случае в Справочнике вы храните только ссылку или путь к файлу.

Ранее такой подход реализовывали через ADODB (ActiveX Data Objects), передавая GUID ссылки-владельца для идентификации нужного файла. Это позволяет «облегчить» основную конфигурацию до минимума.

Почему важно избегать «костылей» при реализации

Мы проанализировали ситуацию и хотим предостеречь вас от нескольких распространенных ошибок:

  1. Не используйте строковые реквизиты для хранения путей к файлам на локальных дисках пользователей. Это путь к ошибкам «файл не найден», так как у другого пользователя путь к той же папке может выглядеть иначе.
  2. Избегайте чтения больших файлов при открытии основной формы объекта. Если вы используете ХранилищеЗначения, считывайте содержимое только по явному запросу пользователя (например, при нажатии на кнопку «Открыть» или «Скачать»). В противном случае, открытие карточки контрагента с десятком вложений превратится в ожидание загрузки сотен мегабайт данных.
  3. Думайте о версионности. Если планируется работа с документами (например, Word), предусматривайте создание записей не напрямую в справочнике, а через механизм версионности.

Технический совет: что использовать?

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

Если же вы решили писать все с нуля, придерживайтесь следующей логики работы:


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

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

Заключение

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

← На главную