Как правильно добавить файл к объекту конфигурации 1С:Предприятие и где его хранить?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← К списку

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

Подход 1: Хранение файла как реквизита объекта (двоичные данные в базе)

Один из очевидных способов – это добавить новый реквизит непосредственно к объекту конфигурации и хранить в нем двоичные данные файла. Для этой цели в 1С:Предприятии существует специальный тип данных – ХранилищеЗначения. Он позволяет сохранять в базе данных файлы любого формата: изображения, текстовые документы, таблицы и так далее. Данные будут храниться внутри файла информационной базы (в случае файлового варианта) или в таблицах на SQL-сервере (в случае клиент-серверного варианта), и, соответственно, включаться в резервные копии базы. Давайте посмотрим, как можно работать с реквизитом типа ХранилищеЗначения. Чтобы сохранить файл в реквизит, нам сначала потребуется получить двоичные данные файла, например, из временного хранилища или напрямую с диска, и затем поместить их в новый объект ХранилищеЗначения:


// Предположим, ДвоичныеДанныеФайла - это уже полученные двоичные данные файла
ОбъектДокумента.НовыйРеквизитФайл = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, СжатиеДанных.Сжимать);

Обратите внимание на параметр СжатиеДанных.Сжимать, который позволяет уменьшить объем хранимых данных. Для получения файла из реквизита:


// Получаем двоичные данные из хранилища
ДвоичныеДанныеФайла = ОбъектДокумента.НовыйРеквизитФайл.Получить();

// Если нужно сохранить на диск или обработать
Если ДвоичныеДанныеФайла <> Неопределено Тогда
    ИмяФайлаНаДиске = "C:\Temp\МойФайл.txt"; // Укажите желаемый путь и имя файла
    ДвоичныеДанныеФайла.Записать(ИмяФайлаНаДиске);
КонецЕсли;

Однако, несмотря на кажущуюся простоту, этот подход имеет серьезные недостатки и риски, которые мы обязательно должны учитывать:

  1. Производительность и объем базы: Хранение больших файлов напрямую в реквизитах объектов может значительно увеличить объем информационной базы. Это негативно сказывается на ее производительности, особенно при работе с управляемыми формами и удаленным подключением. При любых операциях с объектом (чтение, запись, модификация) происходит обращение ко всей информации объекта, включая большие двоичные данные, что замедляет работу.
  2. Ограничения на форме: Реквизит типа ХранилищеЗначения не может быть напрямую отображен на управляемой форме. Передача больших объемов данных при каждом клиент-серверном взаимодействии неэффективна. Для отображения, например, картинок, хранящихся таким образом, приходится использовать обходные пути, такие как временное хранилище.
  3. Целостность данных при изменении структуры: Если мы изменяем структуру справочников или документов (добавляем реквизиты, табличные части) без аккуратной миграции старых записей, существует риск неконсистентности или даже потери данных. Также при удалении расширения, которое добавляло такой реквизит, система может не удалить все свои объекты, или, наоборот, удалить данные, которые теперь "никуда не привязаны".
  4. Проверка заполнения: Встроенных методов для проверки заполненности ХранилищаЗначения напрямую нет. Для отслеживания наличия данных, чтобы избежать затрат времени на извлечение данных при каждой проверке, может потребоваться создание дополнительного флага (например, булевого реквизита "ФайлПрикреплен").
  5. Масштабируемость: Хранение файлов непосредственно в информационной базе имеет ограничения по размеру файла (зависящие от используемой СУБД) и отсутствие гибкой масштабируемости, что приводит к ускоренному росту размеров информационной базы.

Исходя из этих соображений, мы видим, что прямое хранение файла как реквизита объекта, хоть и возможно, но не является рекомендуемым решением для большинства типовых задач.

Подход 2: Использование стандартного механизма присоединенных файлов (рекомендуемый подход)

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

  1. Оптимизация производительности и размера базы: Файлы хранятся отдельно, что значительно снижает нагрузку на основную информационную базу и улучшает производительность при работе с объектами. Мы не передаем весь файл при каждом открытии или записи объекта.
  2. Масштабируемость: Для организаций со средним и большим объемом документов рекомендуется хранение файлов в томах на диске (внешнее хранилище). Это обеспечивает гибкую масштабируемость, возможность распределения файлов по томам и дополнительно снижает нагрузку на информационную базу.
  3. Управление версиями: Типовой механизм присоединенных файлов часто поддерживает версионирование, позволяя сохранять историю изменений файла. Это критически важно для отслеживания изменений и возврата к предыдущим версиям.
  4. Дополнительный функционал: Механизм включает готовые возможности для редактирования файлов, подписания электронной подписью, шифрования и настройки очистки неактуальных файлов и устаревших версий.
  5. Удобство работы: Предоставляются готовые формы и команды для работы с файлами ("скрепки"), что значительно упрощает пользовательский интерфейс и повышает удобство для конечного пользователя.
  6. Резервное копирование: При выгрузке информационной базы в файл (например, в .dt), файлы, хранящиеся непосредственно в базе данных (если не используются тома), также выгружаются. При использовании томов на диске необходимо настраивать архивирование файлового хранилища отдельно, что дает большую гибкость.

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

  1. Создание справочника для файлов: Создайте новый справочник для хранения присоединенных файлов, например, ДокументЗаявкаНаМПЗПрисоединенныеФайлы.
  2. Изменение типа реквизита "ВладелецФайла": В этом новом справочнике необходимо изменить тип реквизита ВладелецФайла, указав в качестве его типа ссылку на ваш объект (например, ДокументСсылка.ЗаявкаНаМПЗ).
  3. Расширение подписок на события: Возможно, потребуется расширить существующие подписки на события или создать новые, чтобы обеспечить корректную работу механизма присоединенных файлов с вашим объектом (например, для обработки удаления владельца).
  4. Добавление общих команд: Включите общие команды для работы с присоединенными файлами в командный интерфейс вашего объекта.

Использование этого механизма позволяет нам соблюсти все требования: хранить файл в базе (или в томах), иметь к нему доступ из документа и проверять его заполнение, при этом избегая проблем с производительностью и целостностью данных.

Подход 3: Хранение только пути к файлу (крайне не рекомендуется)

Рассмотрим также вариант, который иногда приходит в голову – хранение в реквизите объекта не самого файла, а только пути к нему на диске. Это был один из вариантов, который вы могли рассматривать изначально. Однако, мы категорически не рекомендуем использовать этот подход из-за его существенных недостатков:

  1. Нарушение целостности данных: Хранение только пути к файлу без самого файла в базе данных крайне ненадежно. Файл может быть перемещен, переименован или удален с диска в любой момент, что приведет к нерабочим ссылкам в базе данных.
  2. Доступность: Доступ к файлу зависит от сетевой доступности и прав доступа к файловой системе для каждого пользователя. Это может вызывать серьезные проблемы у удаленных пользователей или при изменении сетевых настроек.
  3. Резервное копирование: Файлы, хранящиеся по пути на диске, не будут включены в стандартные резервные копии базы данных 1С. Это требует отдельной организации их архивирования, что усложняет процесс восстановления данных.

Заключение

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

← К списку