Как реализовать хранение и отображение списков присоединенных файлов разных типов в 1С?

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

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

Архитектурные варианты хранения: анализ плюсов и рисков

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

  1. Табличная часть справочника-владельца со ссылками на файлы:

    Кажется наиболее простым решением, так как элементы управления на форме привязываются напрямую к данным объекта. Однако этот подход несет в себе скрытые проблемы:

    Конфликты блокировок: любое добавление, удаление или изменение статуса файла в табличной части требует полной перезаписи объекта-владельца. Если с карточкой параллельно работает другой пользователь или фоновое задание, произойдет ошибка блокировки или сработает оптимистическая блокировка с сообщением о том, что данные были изменены другим пользователем.

    Непроизводительное чтение: при любом программном вызове метода ПолучитьОбъект() платформа считывает все табличные части целиком в оперативную память. Чем больше файлов прикреплено, тем сильнее возрастает паразитная нагрузка на сеть и сервер СУБД.

    Риск появления «висячих» файлов: простое удаление строки из табличной части не приводит к автоматическому удалению элемента в подчиненном справочнике файлов или удалению данных с тома хранения. Без дополнительного программного контроля ссылочная целостность быстро нарушается.

  2. Независимый регистр сведений:

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

  3. Штатный механизм БСП (подчиненный справочник присоединенных файлов):

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

Реализация через динамические списки и подсистему БСП

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

  1. В метаданных открываем подчиненный справочник (например, НоменклатураПрисоединенныеФайлы) и добавляем реквизит ВидФайла. Важно: для реквизита необходимо установить свойство Индексировать (или «Индексировать с доп. упорядочиванием»). Без индекса отбор по владельцу и виду файла на больших объемах данных приведет к полному сканированию таблицы СУБД (Table Scan) и деградации производительности.
  2. В форму объекта-владельца добавляем реквизиты формы с типом ДинамическийСписок для каждого типа файла. В свойствах каждого списка обязательно указываем:

    — Основная таблица: Справочник.НоменклатураПрисоединенныеФайлы;

    — Динамическое считывание данных: Да.

  3. В свойствах каждого динамического списка настраиваем фиксированные отборы: поле ВладелецФайла равно ссылке текущего объекта, поле ВидФайла равно требуемому значению перечисления.
  4. Перетаскиваем созданные списки в командный интерфейс формы на соответствующие вкладки.

Перехват добавления и открытия файлов через API БСП

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


&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    Отказ = Истина;
    
    // Определяем вид файла в зависимости от активированной таблицы формы
    ВидФайла = ПредопределенноеЗначение("Перечисление.ВидыПрисоединенныхФайлов.ПустаяСсылка");
    
    Если Элемент.Имя = "СписокФайловДоговоры" Тогда
        ВидФайла = ПредопределенноеЗначение("Перечисление.ВидыПрисоединенныхФайлов.Договор");
    ИначеЕсли Элемент.Имя = "СписокФайловАкты" Тогда
        ВидФайла = ПредопределенноеЗначение("Перечисление.ВидыПрисоединенныхФайлов.Акт");
    ИначеЕсли Элемент.Имя = "СписокФайловТехДокументация" Тогда
        ВидФайла = ПредопределенноеЗначение("Перечисление.ВидыПрисоединенныхФайлов.ТехническаяДокументация");
    КонецЕсли;
    
    // Заполняем структуру параметров добавления для штатного вызова БСП
    ПараметрыФайла = Новый Структура;
    ПараметрыФайла.Вставить("ВладелецФайла", Объект.Ссылка);
    ПараметрыФайла.Вставить("ВидФайла", ВидФайла);
    
    // Вызываем стандартный диалог добавления файла из библиотеки БСП
    ПрисоединенныеФайлыКлиент.ДобавитьФайлы(ПараметрыФайла);
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Открываем карточку файла или сразу файл на просмотр средствами БСП
    Если ЗначениеЗаполнено(ВыбраннаяСтрока) Тогда
        ПрисоединенныеФайлыКлиент.ОткрытьФормуПрисоединенногоФайла(ВыбраннаяСтрока);
    КонецЕсли;
КонецПроцедуры

Рассмотрим подробнее работу данного механизма: при установке Отказ = Истина в событии ПередНачаломДобавления платформа отменяет типовое интерактивное создание строки и передает управление в метод подсистемы ПрисоединенныеФайлыКлиент.ДобавитьФайлы. Это позволяет сохранить функционал работы с томами на диске, блокировками редактирования и электронными подписями.

Особенности поддержки Drag-and-Drop

При использовании динамических списков на форме объекта типовой механизм перетаскивания файлов мышью (Drag-and-Drop) из проводника операционной системы перестает работать по умолчанию. Чтобы вернуть это удобство пользователям, необходимо:

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

Итоги выбора решения

Использование табличных частей оправдано только в небольших локальных конфигурациях при условии, что с объектом одновременно работает строго один пользователь, а количество файлов минимально. Во всех остальных случаях правильным архитектурным решением является разделение файлов по реквизиту ВидФайла в подчиненном справочнике БСП и отображение их через динамические списки с обязательным индексированием полей отбора.

← На главную