В процессе разработки в среде 1С:Предприятие часто возникает задача логического разделения файлов, привязанных к одному объекту. Например, для справочника ДоговорыКонтрагентов может потребоваться хранить отдельно «Скан-копии оригиналов» и «Техническую документацию». На первый взгляд кажется логичным создать два отдельных справочника: ДоговорыКонтрагентовПрисоединенныеФайлы и ДоговорыКонтрагентовПрисоединенныеФайлы1. Однако такой подход вступает в противоречие с архитектурой Библиотеки стандартных подсистем (БСП) и может создать массу сложностей при поддержке системы.
Рассмотрим подробнее, почему не стоит множить объекты метаданных и какие альтернативные способы решения задачи существуют в типовом функционале.
Стандартная подсистема «Присоединенные файлы» в БСП жестко ориентирована на связь «один владелец — один справочник хранения». При регистрации объекта в подсистеме мы указываем связь в программном коде. Если мы решим создать второй справочник для того же владельца, мы столкнемся со следующими проблемами:
Разберем, как решить задачу разделения файлов более элегантными способами.
Проанализируем ситуацию: пользователям не нужны разные таблицы в базе данных, им нужно визуальное разделение файлов в интерфейсе. Самым правильным решением будет добавление нового реквизита в существующий справочник присоединенных файлов.
Выполним следующие шаги:
ДоговорыКонтрагентовПрисоединенныеФайлы.ВидДокумента с типом ПеречислениеСсылка.ВидыДокументовФизЛиц или создадим для этого специальное перечисление.Теперь мы можем настроить отображение файлов на форме договора. Вместо одной стандартной кнопки «Файлы» мы можем разместить две таблицы (динамических списка), каждый из которых будет фильтровать общий справочник по значению реквизита ВидДокумента. Программная настройка фильтра в ПриСозданииНаСервере может выглядеть так:
// Пример настройки фильтра для динамического списка на форме
ЭлементОтбора = СписокФайловТехнических.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДокумента");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыДокументов.ТехническаяДокументация;
ЭлементОтбора.Использование = Истина;
Этот метод позволяет сохранить целостность структуры БД и использовать все преимущества типовых механизмов БСП.
Если нам запрещено менять конфигурацию, мы можем воспользоваться механизмом «Дополнительные реквизиты и сведения». Выясним, как это сделать:
В списках файлов можно будет настроить группировку по этому реквизиту через «Изменить форму», что обеспечит требуемое визуальное разделение без написания кода.
Иногда требование создать два справочника вызвано необходимостью ограничить доступ: например, бухгалтерия должна видеть финансовые файлы, а юристы — только тексты договоров. В этом случае создание двух справочников — не выход, так как права в БСП обычно наследуются от владельца.
Правильный путь — использование механизма RLS (Record Level Security). Мы можем настроить права так, чтобы чтение записей справочника присоединенных файлов зависело от значения того самого реквизита ВидДокумента, который мы добавили в первом решении. Таким образом, находясь в одной таблице, пользователи разных отделов будут видеть только «свои» файлы.
Проанализируем еще один важный аспект, упомянутый в обсуждении: объем базы данных. Если мы планируем хранить много тяжелых файлов (например, PDF), база начнет стремительно расти. Разделение на два справочника эту проблему не решает, так как данные все равно остаются в SQL-таблицах.
Рекомендуем настроить «Хранение файлов в томах на диске». Посмотрим на алгоритм действий:
Это значительно ускоряет работу с базой, упрощает создание резервных копий и снимает вопрос о том, «раздувают» ли файлы базу данных.
Создание отдельного справочника ПрисоединенныеФайлы1 — это путь к созданию «технического долга». Мы настоятельно рекомендуем:
Такой подход гарантирует стабильную работу подсистем БСП и легкость обновления конфигурации в будущем.