Типовая подсистема присоединенных файлов в Библиотеке стандартных подсистем (БСП) по умолчанию хранит файлы плоским списком. Когда у одного документа или справочника накапливается множество файлов разных типов (сканы, договоры, акты, спецификации), пользователям становится сложно ориентироваться в сплошном перечне. Разберем практические способы добавления иерархии, настройки группировок в динамическом списке и решения сопутствующих проблем с отображением стандартных пиктограмм папок.
Рассмотрим наименее инвазивный вариант, при котором структура метаданных справочника не подвергается рискованным изменениям. Если у файлов уже есть разделяющий признак (например, реквизит РольФайла или добавленный дополнительный реквизит), мы можем настроить компоновщик динамического списка так, чтобы записи группировались в виде дерева с виртуальными папками.
Для реализации этого подхода откроем форму списка или форму присоединенных файлов и в обработчике ПриСозданииНаСервере переопределим структуру компоновщика настроек списка:
Группировки = Список.КомпоновщикНастроек.Настройки.Структура;
Группировки.Очистить();
ГруппировкаРольФайла = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеРольФайла = ГруппировкаРольФайла.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеРольФайла.Поле = Новый ПолеКомпоновкиДанных("РольФайла");
ПолеРольФайла.Использование = Истина;
Такой программный код автоматически сворачивает плоский список в дерево с узлами по значениям указанного поля. Однако при подобной группировке разработчики часто сталкиваются с проблемой отображения пиктограмм: картинка у строк группировки либо исчезает, либо принимает стандартный значок файла вместо папки. Проанализируем, почему это происходит и как настроить корректное поведение.
Выясним причину некорректного поведения: в событии ПриПолученииДанныхНаСервере коллекция ОформляемыеСтроки содержит только детальные записи (непосредственно файлы). Строки группировок формируются платформой «на лету» и в этот обработчик не попадают. Механизм УсловноеОформление для динамических списков также не позволяет управлять свойством картинки строки.
Если в таблице формы заданы свойства КартинкаСтрок и ПутьКДаннымКартинкиСтроки, платформа берет числовой индекс картинки из выбранного поля. Для строк группировки это поле оказывается пустым, и пиктограмма пропадает. Разберем два пути решения этой задачи:
КартинкаСтроки, а в ПутьКДаннымКартинкиСтроки указать Список.СтандартнаяКартинка, платформа 1С автоматически назначит стандартную иконку папки для узлов группировки.2 из стандартной библиотеки картинок). В этом случае компоновщик вернет платформе нужный индекс и для папок, и для конечных файлов.Рассмотрим вариант глубокой доработки типового справочника вида <ИмяОбъекта>ПрисоединенныеФайлы. Для создания полноценной файловой структуры некоторые разработчики делают справочник иерархическим (по группам и элементам или иерархии элементов), добавляют признак папки и адаптируют форму для работы в режиме иерархического дерева.
Прежде чем выбрать этот путь, проанализируем критические системные риски, возникающие в типовых подсистемах БСП:
Если все же выбран путь доработки метаданных, потребуется полностью переопределить типовые фильтры общих модулей подсистемы РаботаСФайлами, исключив элементы-папки из проверок целостности и выгрузки в тома.
Посмотрим на альтернативный способ без снятия справочников с типовой поддержки. Он заключается в хранении относительного пути папки внутри стандартных строковых реквизитов, например, в поле Описание:
[Договоры/Спецификации] ИмяФайла.pdf).ДеревоЗначений.Описание и динамически строит дерево с папками и вложенными файлами.Поскольку у одного документа количество присоединенных файлов обычно исчисляется десятками, отказ от динамического списка в пользу ДеревоЗначений не приводит к просадке производительности, но позволяет полностью контролировать структуру узлов, drag-and-drop и назначение любых пиктограмм строкам дерева.