Когда вы разрабатываете собственную конфигурацию, рано или поздно перед вами встает задача прикрепления различных файлов к объектам системы. Будь то сканы договоров, фотографии товаров или техническая документация, важно выбрать правильный путь реализации, чтобы не столкнуться с деградацией производительности в будущем. Давайте разберем, как грамотно подойти к этому вопросу.
Первым и самым надежным шагом при проектировании системы хранения является создание подчиненного справочника. Назовем его, например, ПрисоединенныеФайлы. Владельцем этого справочника должен выступать тот объект, к которому будут прикрепляться файлы (например, СправочникСсылка.Контрагенты или СправочникСсылка.Договоры).
Внутри этого справочника рекомендуется хранить метаданные файла:
Владелец в 1С).После того как мы определили структуру метаданных, возникает главный вопрос: где хранить само содержимое (бинарные данные)? Рассмотрим основные подходы, которые обсуждались в сообществе:
Для этих целей в 1С используется тип данных ХранилищеЗначения. Вы можете добавить реквизит этого типа прямо в подчиненный справочник ПрисоединенныеФайлы.
Преимущества:
1CD или SQL базы, его невозможно потерять при перемещении папок.Недостатки:
Если вы выбираете этот путь, будьте готовы к тому, что размер базы станет критическим фактором через некоторое время. Обязательно учитывайте это при планировании серверных мощностей.
Для крупных проектов профессионалы рекомендуют выносить файлы за пределы базы. Вы можете хранить их на выделенном сетевом ресурсе или в SQL-таблицах другой базы данных. В таком случае в Справочнике вы храните только ссылку или путь к файлу.
Ранее такой подход реализовывали через ADODB (ActiveX Data Objects), передавая GUID ссылки-владельца для идентификации нужного файла. Это позволяет «облегчить» основную конфигурацию до минимума.
Мы проанализировали ситуацию и хотим предостеречь вас от нескольких распространенных ошибок:
ХранилищеЗначения, считывайте содержимое только по явному запросу пользователя (например, при нажатии на кнопку «Открыть» или «Скачать»). В противном случае, открытие карточки контрагента с десятком вложений превратится в ожидание загрузки сотен мегабайт данных.Если вы находитесь на этапе выбора, помните: существует БСП (Библиотека Стандартных Подсистем). Даже если ваша конфигурация самописная, изучите архитектуру подсистемы ПрисоединенныеФайлы в БСП. Она содержит готовые механизмы для работы с томами хранения файлов, версионностью, шифрованием и электронными подписями.
Если же вы решили писать все с нуля, придерживайтесь следующей логики работы:
// Пример логики сохранения файла в хранилище (упрощенно)
Процедура СохранитьФайл(СсылкаНаВладельца, ИмяФайла)
НовыйФайл = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
НовыйФайл.Владелец = СсылкаНаВладельца;
НовыйФайл.Наименование = ИмяФайла;
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
НовыйФайл.Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
НовыйФайл.Записать();
КонецПроцедуры
Мы рекомендуем всегда использовать сжатие данных при помещении файла в ХранилищеЗначения, используя конструктор Новый СжатиеДанных(9). Это поможет немного замедлить рост базы, хотя и создаст дополнительную нагрузку на процессор при записи.
Подводя итог, можно сказать, что идеальное решение зависит от ожидаемого объема файлов. Для небольших объемов — ХранилищеЗначения внутри справочника сжато. Для крупных — вынос файлов на внешние тома с хранением метаданных (GUID, путь, расширение) внутри 1С. Анализируйте нагрузку и планируйте архитектуру заранее!