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