Как добавить папки и иерархию в присоединенные файлы БСП?

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

Типовая подсистема присоединенных файлов в Библиотеке стандартных подсистем (БСП) по умолчанию хранит файлы плоским списком. Когда у одного документа или справочника накапливается множество файлов разных типов (сканы, договоры, акты, спецификации), пользователям становится сложно ориентироваться в сплошном перечне. Разберем практические способы добавления иерархии, настройки группировок в динамическом списке и решения сопутствующих проблем с отображением стандартных пиктограмм папок.

Способ 1. Программная группировка динамического списка по реквизиту

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

Для реализации этого подхода откроем форму списка или форму присоединенных файлов и в обработчике ПриСозданииНаСервере переопределим структуру компоновщика настроек списка:


Группировки = Список.КомпоновщикНастроек.Настройки.Структура;
Группировки.Очистить();

ГруппировкаРольФайла = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеРольФайла = ГруппировкаРольФайла.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеРольФайла.Поле = Новый ПолеКомпоновкиДанных("РольФайла");
ПолеРольФайла.Использование = Истина;

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

Настройка пиктограмм для строк группировок

Выясним причину некорректного поведения: в событии ПриПолученииДанныхНаСервере коллекция ОформляемыеСтроки содержит только детальные записи (непосредственно файлы). Строки группировок формируются платформой «на лету» и в этот обработчик не попадают. Механизм УсловноеОформление для динамических списков также не позволяет управлять свойством картинки строки.

Если в таблице формы заданы свойства КартинкаСтрок и ПутьКДаннымКартинкиСтроки, платформа берет числовой индекс картинки из выбранного поля. Для строк группировки это поле оказывается пустым, и пиктограмма пропадает. Разберем два пути решения этой задачи:

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

Способ 2. Включение иерархии в справочнике присоединенных файлов и скрытые риски

Рассмотрим вариант глубокой доработки типового справочника вида <ИмяОбъекта>ПрисоединенныеФайлы. Для создания полноценной файловой структуры некоторые разработчики делают справочник иерархическим (по группам и элементам или иерархии элементов), добавляют признак папки и адаптируют форму для работы в режиме иерархического дерева.

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

  1. Фоновые задания и тома хранения: Регламентные процедуры переноса файлов в тома на диске, фоновой очистки устаревших данных и проверки целостности томов обращаются ко всем записям справочника как к реальным бинарным файлам. При попытке прочитать пути на сервере или двоичные данные для записи, являющейся обычной логической «папкой», типовые модули БСП вызовут фатальные исключения.
  2. Версионирование и электронные подписи: Подсистемы версионирования объектов и ЭЦП отслеживают изменения записей справочника файлов. Создание или переименование служебной папки может порождать некорректные служебные записи в регистрах версий.
  3. Счетчики и индикаторы документов: В журналах документов типовой значок скрепки и подсчет количества файлов рассчитываются агрегатными запросами по владельцу. Без изменения этих процедур папки будут ошибочно увеличивать общее число прикрепленных файлов в интерфейсе.

Если все же выбран путь доработки метаданных, потребуется полностью переопределить типовые фильтры общих модулей подсистемы РаботаСФайлами, исключив элементы-папки из проверок целостности и выгрузки в тома.

Способ 3. Виртуальная иерархия через путь в описании файла

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

  1. При сохранении файла к его описанию программно добавляется префикс пути со спецсимволами-разделителями (например, [Договоры/Спецификации] ИмяФайла.pdf).
  2. На форме просмотра файлов динамический список заменяется на обычную таблицу, связанную с реквизитом формы типа ДеревоЗначений.
  3. При открытии формы серверный код запрашивает файлы текущего объекта, разбирает текстовые пути из реквизита Описание и динамически строит дерево с папками и вложенными файлами.

Поскольку у одного документа количество присоединенных файлов обычно исчисляется десятками, отказ от динамического списка в пользу ДеревоЗначений не приводит к просадке производительности, но позволяет полностью контролировать структуру узлов, drag-and-drop и назначение любых пиктограмм строкам дерева.

← На главную