При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11.3, ERP или Комплексная автоматизация, пользователи и разработчики часто сталкиваются с тем, что присоединенные файлы (сканы договоров, изображения товаров, PDF-счета) кажутся «рассыпанными» по всей базе. В этой статье мы разберем архитектурные особенности хранения файлов, выясним, почему разработчики 1С приняли такие решения, и научимся собирать все данные в единый реестр для управления и выгрузки.
Проанализируем структуру метаданных. В типовых конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), для каждого объекта, к которому можно прикрепить файлы, создается отдельный вспомогательный справочник. Например, для документов «Заказ клиента» создается справочник ЗаказКлиентаПрисоединенныеФайлы, а для справочника «Номенклатура» — НоменклатураПрисоединенныеФайлы.
Рассмотрим причины такого подхода:
Однако такая структура усложняет задачу получения «общего списка». Чтобы увидеть все файлы, нам придется собрать данные из множества источников.
Разберем, как программно найти все справочники, содержащие файлы. Основной признак таких справочников — наличие в их имени суффикса ПрисоединенныеФайлы. Также не стоит забывать про системный справочник Файлы, который используется для хранения независимых файлов в папках.
Посмотрим на пример кода, который позволяет обойти все такие справочники и собрать информацию о владельцах файлов:
Запрос = Новый Запрос;
ТекстЗапроса = "";
Для Каждого Метаданное Из Метаданные.Справочники Цикл
Если СтрНайти(Метаданное.Имя, "ПрисоединенныеФайлы") > 0 Или Метаданное.Имя = "Файлы" Тогда
Если ТекстЗапроса <> "" Тогда
ТекстЗапроса = ТекстЗапроса + " ОБЪЕДИНИТЬ ВСЕ ";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ
| """ + Метаданное.Имя + """ КАК ТипСправочника,
| Т.Ссылка КАК СсылкаНаФайл,
| Т.ВладелецФайла КАК ОбъектВладелец,
| Т.Наименование КАК ИмяФайла
|ИЗ
| Справочник." + Метаданное.Имя + " КАК Т";
КонецЕсли;
КонецЦикла;
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить().Выгрузить();
Этот подход позволяет сформировать полную картину всех загруженных документов в системе. Важно: при выполнении таких запросов в больших базах следует учитывать нагрузку на сервер, так как объединение десятков таблиц может быть ресурсоемким.
Выясним, существуют ли в системе готовые механизмы агрегации. В БСП предусмотрены специальные регистры, которые «знают» о наличии файлов, чтобы быстро отображать иконку скрепки в списках документов:
СведенияОФайлах: содержит информацию о размере, расширении, авторе и дате создания файла. Это отличная точка входа для построения отчета без необходимости перебора всех справочников.НаличиеФайлов: используется для оптимизации интерфейса, связывает объект-владелец с фактом наличия присоединенных данных.Проанализируем ситуацию с хранилищем. Чтобы узнать, какие файлы занимают больше всего места, лучше использовать стандартный отчет «Хранилище файлов» (находится в разделе Администрирование — Обслуживание — Отчеты администратора). Он агрегирует данные по всем типам объектов и показывает объем данных в разрезе типов документов.
Если задача стоит не просто «увидеть», а «выгрузить на диск» или «массово изменить», следует использовать методы общего модуля РаботаСФайлами. Это гарантирует, что вы корректно обработаете файлы, независимо от того, где они лежат: в самой базе данных (в виде байтов) или во внешних томах на сетевом диске.
Рассмотрим полезные методы:
РаботаСФайлами.ВыгрузитьФайлыНаДиск() — позволяет массово сохранить файлы в указанный каталог.РаботаСФайлами.ПолучитьДанныеФайла() — возвращает двоичные данные файла, учитывая настройки хранения.РаботаСФайлами.СоздатьФайлНаОснованииДанных() — программное добавление нового вложения к объекту.Пример получения данных конкретного файла для последующей обработки:
ПараметрыФайла = РаботаСФайлами.ПолучитьДанныеФайла(СсылкаНаПрисоединенныйФайл);
Если ПараметрыФайла.ФайлВыгружен Тогда
ДвоичныеДанные = ПараметрыФайла.Данные;
// Далее можно сохранить на диск или отправить по почте
КонецЕсли;
Проанализируем, где физически находятся ваши данные. Это критически важно для управления ими. В настройках системы (Администрирование — Настройки работы с файлами) можно включить «Хранение файлов в томах на диске».
Хранение в базе: файлы записываются в таблицы SQL. Плюс — простота бекапа (все в одном файле). Минус — стремительный рост размера базы и снижение производительности при обращении к таблицам с Binary Data.
Хранение в томах: в базе остаются только карточки-ссылки, а сами файлы лежат в папках на сервере. Это позволяет выгружать файлы обычным копированием папок и значительно ускоряет работу самой 1С.
При управлении файлами важно учитывать справочник ВерсииФайлов. В 1С один логический файл может иметь несколько версий. Если пользователь отредактировал документ и сохранил его снова, система создаст новую запись в этом справочнике.
Для поддержания порядка в системе предусмотрено регламентное задание «Очистка ненужных файлов». Мы рекомендуем настроить правила автоматической очистки:
Таким образом, для получения общего списка файлов в 1С:УТ 11.3 и управления ими, наиболее эффективным путем будет написание небольшой обработки, которая использует запрос к регистру СведенияОФайлах или программный обход метаданных с использованием функций общего модуля РаботаСФайлами.