Как получить общий список всех присоединенных файлов в 1С и управлять ими

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

При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11.3, ERP или Комплексная автоматизация, пользователи и разработчики часто сталкиваются с тем, что присоединенные файлы (сканы договоров, изображения товаров, PDF-счета) кажутся «рассыпанными» по всей базе. В этой статье мы разберем архитектурные особенности хранения файлов, выясним, почему разработчики 1С приняли такие решения, и научимся собирать все данные в единый реестр для управления и выгрузки.

Особенности архитектуры: почему справочников так много?

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

Рассмотрим причины такого подхода:

  1. Оптимизация производительности: Если бы все файлы всех документов в огромной базе хранились в одной таблице, это привело бы к колоссальным очередям на запись и блокировкам при одновременной работе сотен пользователей.
  2. Изоляция данных: Разделение таблиц позволяет базе данных эффективнее управлять индексами и физическим размещением данных на диске.
  3. Простота удаления: При удалении конкретного объекта или очистке истории по определенному типу документов системе проще работать с отдельной небольшой таблицей.

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

Способ 1. Программный сбор данных через метаданные

Разберем, как программно найти все справочники, содержащие файлы. Основной признак таких справочников — наличие в их имени суффикса ПрисоединенныеФайлы. Также не стоит забывать про системный справочник Файлы, который используется для хранения независимых файлов в папках.

Посмотрим на пример кода, который позволяет обойти все такие справочники и собрать информацию о владельцах файлов:


Запрос = Новый Запрос;
ТекстЗапроса = "";

Для Каждого Метаданное Из Метаданные.Справочники Цикл
    Если СтрНайти(Метаданное.Имя, "ПрисоединенныеФайлы") > 0 Или Метаданное.Имя = "Файлы" Тогда
        Если ТекстЗапроса <> "" Тогда
            ТекстЗапроса = ТекстЗапроса + " ОБЪЕДИНИТЬ ВСЕ ";
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + 
        "ВЫБРАТЬ
        |   """ + Метаданное.Имя + """ КАК ТипСправочника,
        |   Т.Ссылка КАК СсылкаНаФайл,
        |   Т.ВладелецФайла КАК ОбъектВладелец,
        |   Т.Наименование КАК ИмяФайла
        |ИЗ
        |   Справочник." + Метаданное.Имя + " КАК Т";
    КонецЕсли;
КонецЦикла;

Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить().Выгрузить();

Этот подход позволяет сформировать полную картину всех загруженных документов в системе. Важно: при выполнении таких запросов в больших базах следует учитывать нагрузку на сервер, так как объединение десятков таблиц может быть ресурсоемким.

Способ 2. Использование Регистров Сведений

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

Проанализируем ситуацию с хранилищем. Чтобы узнать, какие файлы занимают больше всего места, лучше использовать стандартный отчет «Хранилище файлов» (находится в разделе Администрирование — Обслуживание — Отчеты администратора). Он агрегирует данные по всем типам объектов и показывает объем данных в разрезе типов документов.

Способ 3. Работа через API БСП (Модуль РаботаСФайлами)

Если задача стоит не просто «увидеть», а «выгрузить на диск» или «массово изменить», следует использовать методы общего модуля РаботаСФайлами. Это гарантирует, что вы корректно обработаете файлы, независимо от того, где они лежат: в самой базе данных (в виде байтов) или во внешних томах на сетевом диске.

Рассмотрим полезные методы:

  1. РаботаСФайлами.ВыгрузитьФайлыНаДиск() — позволяет массово сохранить файлы в указанный каталог.
  2. РаботаСФайлами.ПолучитьДанныеФайла() — возвращает двоичные данные файла, учитывая настройки хранения.
  3. РаботаСФайлами.СоздатьФайлНаОснованииДанных() — программное добавление нового вложения к объекту.

Пример получения данных конкретного файла для последующей обработки:


ПараметрыФайла = РаботаСФайлами.ПолучитьДанныеФайла(СсылкаНаПрисоединенныйФайл);
Если ПараметрыФайла.ФайлВыгружен Тогда
    ДвоичныеДанные = ПараметрыФайла.Данные;
    // Далее можно сохранить на диск или отправить по почте
КонецЕсли;

Место хранения: База vs Тома

Проанализируем, где физически находятся ваши данные. Это критически важно для управления ими. В настройках системы (Администрирование — Настройки работы с файлами) можно включить «Хранение файлов в томах на диске».

Хранение в базе: файлы записываются в таблицы SQL. Плюс — простота бекапа (все в одном файле). Минус — стремительный рост размера базы и снижение производительности при обращении к таблицам с Binary Data.

Хранение в томах: в базе остаются только карточки-ссылки, а сами файлы лежат в папках на сервере. Это позволяет выгружать файлы обычным копированием папок и значительно ускоряет работу самой 1С.

Версионирование и очистка

При управлении файлами важно учитывать справочник ВерсииФайлов. В 1С один логический файл может иметь несколько версий. Если пользователь отредактировал документ и сохранил его снова, система создаст новую запись в этом справочнике.

Для поддержания порядка в системе предусмотрено регламентное задание «Очистка ненужных файлов». Мы рекомендуем настроить правила автоматической очистки:

Таким образом, для получения общего списка файлов в 1С:УТ 11.3 и управления ими, наиболее эффективным путем будет написание небольшой обработки, которая использует запрос к регистру СведенияОФайлах или программный обход метаданных с использованием функций общего модуля РаботаСФайлами.

← На главную