Мы часто сталкиваемся с задачей, когда необходимо привязать файл к конкретному объекту в нашей информационной базе 1С:Предприятие, будь то документ, справочник или другой объект конфигурации. При этом возникают вопросы о способах хранения, проверке заполнения и общих рекомендациях. Давайте вместе разберем эту ситуацию и найдем оптимальное решение. Представим, что нам требуется прикрепить файл к некому объекту, например, к заявке на МПЗ, и этот файл должен храниться непосредственно в базе данных, а также быть доступным для проверки заполнения. Мы рассмотрим несколько подходов, выясним их особенности, преимущества и недостатки.
Один из очевидных способов – это добавить новый реквизит непосредственно к объекту конфигурации и хранить в нем двоичные данные файла.
Для этой цели в 1С:Предприятии существует специальный тип данных – ХранилищеЗначения. Он позволяет сохранять в базе данных файлы любого формата: изображения, текстовые документы, таблицы и так далее. Данные будут храниться внутри файла информационной базы (в случае файлового варианта) или в таблицах на SQL-сервере (в случае клиент-серверного варианта), и, соответственно, включаться в резервные копии базы.
Давайте посмотрим, как можно работать с реквизитом типа ХранилищеЗначения.
Чтобы сохранить файл в реквизит, нам сначала потребуется получить двоичные данные файла, например, из временного хранилища или напрямую с диска, и затем поместить их в новый объект ХранилищеЗначения:
// Предположим, ДвоичныеДанныеФайла - это уже полученные двоичные данные файла
ОбъектДокумента.НовыйРеквизитФайл = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, СжатиеДанных.Сжимать);
Обратите внимание на параметр СжатиеДанных.Сжимать, который позволяет уменьшить объем хранимых данных.
Для получения файла из реквизита:
// Получаем двоичные данные из хранилища
ДвоичныеДанныеФайла = ОбъектДокумента.НовыйРеквизитФайл.Получить();
// Если нужно сохранить на диск или обработать
Если ДвоичныеДанныеФайла <> Неопределено Тогда
ИмяФайлаНаДиске = "C:\Temp\МойФайл.txt"; // Укажите желаемый путь и имя файла
ДвоичныеДанныеФайла.Записать(ИмяФайлаНаДиске);
КонецЕсли;
Однако, несмотря на кажущуюся простоту, этот подход имеет серьезные недостатки и риски, которые мы обязательно должны учитывать:
ХранилищеЗначения не может быть напрямую отображен на управляемой форме. Передача больших объемов данных при каждом клиент-серверном взаимодействии неэффективна. Для отображения, например, картинок, хранящихся таким образом, приходится использовать обходные пути, такие как временное хранилище.ХранилищаЗначения напрямую нет. Для отслеживания наличия данных, чтобы избежать затрат времени на извлечение данных при каждой проверке, может потребоваться создание дополнительного флага (например, булевого реквизита "ФайлПрикреплен").Исходя из этих соображений, мы видим, что прямое хранение файла как реквизита объекта, хоть и возможно, но не является рекомендуемым решением для большинства типовых задач.
Наиболее надежным и рекомендуемым подходом для работы с файлами в 1С:Предприятии является использование типового механизма присоединенных файлов. Этот механизм широко применяется в конфигурациях на основе Библиотеки стандартных подсистем (БСП).
Давайте разберем, как это работает и почему это лучше.
Как это работает:
Типовой механизм присоединенных файлов предоставляет возможность хранить файлы произвольного формата, непосредственно связанные с объектами программы, но отдельно от них. Файлы хранятся в специализированных справочниках (например, Справочник.Файлы или ИмяОбъектаПрисоединенныеФайлы), а в основном документе или справочнике создается не сам файл, а лишь ссылка на эти присоединенные файлы. Это позволяет избежать обязательного считывания больших объемов информации при считывании самого объекта, что существенно экономит ресурсы.
Для реализации этого подхода в вашем объекте (например, документе) обычно добавляется реквизит типа СправочникСсылка.Файлы (или ссылка на специализированный справочник присоединенных файлов вашего объекта). Этот реквизит может быть использован для проверки заполнения и быстрого доступа к файлам.
Преимущества данного подхода:
Реализация: Для подключения функционала присоединенных файлов к новому объекту в типовой конфигурации, основанной на БСП, нам потребуется выполнить следующие шаги:
ДокументЗаявкаНаМПЗПрисоединенныеФайлы.ВладелецФайла, указав в качестве его типа ссылку на ваш объект (например, ДокументСсылка.ЗаявкаНаМПЗ).Использование этого механизма позволяет нам соблюсти все требования: хранить файл в базе (или в томах), иметь к нему доступ из документа и проверять его заполнение, при этом избегая проблем с производительностью и целостностью данных.
Рассмотрим также вариант, который иногда приходит в голову – хранение в реквизите объекта не самого файла, а только пути к нему на диске. Это был один из вариантов, который вы могли рассматривать изначально. Однако, мы категорически не рекомендуем использовать этот подход из-за его существенных недостатков:
Проанализировав все возможные варианты, мы можем сделать однозначный вывод: если вам необходимо прикрепить файл к объекту конфигурации в 1С:Предприятие, обеспечить его хранение в базе данных (или в управляемых томах), доступность и возможность проверки заполнения, то наиболее правильным и рекомендуемым решением является использование типового механизма присоединенных файлов. Этот подход обеспечивает гибкость, масштабируемость, поддерживает целостность данных и значительно упрощает сопровождение системы. Избегайте прямого хранения двоичных данных в реквизитах и тем более хранения только путей к файлам.
← К списку