Как ограничить видимость полей отчета СКД в зависимости от роли пользователя

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

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

Способ 1. Ограничение на уровне прав метаданных (Роли)

Это самый надежный и системный метод, который мы рекомендуем рассматривать в первую очередь. Если у пользователя в его роли нет права Просмотр на конкретный реквизит объекта (например, поле Цена в справочнике Номенклатура или документе), СКД обработает это автоматически.

Проанализируем преимущества этого подхода:

  1. Автоматизм: Система компоновки данных при генерации запроса проверяет права текущего пользователя. Если прав на поле нет, оно просто исчезнет из списка доступных полей в настройках отчета.
  2. Безопасность: Данные не просто скрываются визуально, они не выбираются из базы данных для этого пользователя.
  3. Отсутствие кода: Настройка выполняется в конфигураторе в редакторе ролей, что упрощает поддержку системы.

Однако, если поле Цена является расчетным (например, вычисляется в самом запросе СКД), ограничение прав на уровне метаданных может не сработать. В таких ситуациях рассмотрим альтернативные варианты.

Способ 2. Использование функциональных опций

Функциональные опции (ФО) позволяют управлять видимостью элементов интерфейса по всей системе. Рассмотрим, как применить их для полей отчета:

Сначала мы создаем Константу или ПараметрСеанса, который будет хранить признак доступности цен для текущего пользователя. Затем создаем объект ФункциональнаяОпция, привязываем её к этому источнику и в списке состава указываем нужные реквизиты. Если ФО выключена, поле автоматически исключается из доступных полей компоновки.

Способ 3. Программное управление доступностью полей

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие роли у текущего пользователя
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("Экономист") Тогда
        
        // Находим поле в списке доступных полей выбора
        ПолеЦена = Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы.Найти("Цена");
        
        Если ПолеЦена <> Неопределено Тогда
            // Устанавливаем доступность в Ложь
            ПолеЦена.Доступность = Ложь;
        КонецЕсли;
        
        // Также рекомендуется удалить поле из выбранных полей, если оно там есть по умолчанию
        Для Каждого ВыбранноеПоле Из Отчет.КомпоновщикНастроек.Настройки.Выбор.Элементы Цикл
            Если ТипЗнч(ВыбранноеПоле) = Тип("ВыбранноеПолеКомпоновкиДанных") 
                И Строка(ВыбранноеПоле.Поле) = "Цена" Тогда
                ВыбранноеПоле.Использование = Ложь;
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Выясним, что дает этот метод: пользователь не только перестает видеть данные в колонке, но и теряет возможность самостоятельно добавить поле Цена через меню "Изменить вариант", так как оно исчезает из списка доступных.

Способ 4. Вызов функций конфигурации в выражениях СКД

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

Допустим, мы создали в общем модуле функцию:


Функция ПолучитьЗначениеЦеныДляОтчета(ЗначениеЦены) Экспорт
    Если РольДоступна("Экономист") Тогда
        Возврат ЗначениеЦены;
    Иначе
        Возврат 0; // Или Неопределено
    КонецЕсли;
КонецФункции

Теперь в схеме компоновки данных (СКД) для поля Цена в колонке "Выражение" мы укажем: ОбщийМодульИмя.ПолучитьЗначениеЦеныДляОтчета(Цена). В результате инженер увидит в колонке нули, а экономист — реальные цифры. Этот способ хорош тем, что структура отчета остается неизменной, меняются только выводимые данные.

Способ 5. Использование различных вариантов отчета

Если логика отчетов для разных ролей сильно отличается, проще всего создать несколько предопределенных вариантов отчета в конфигураторе:

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

Способ 6. Условное оформление (визуальное скрытие)

Проанализируем ситуацию, когда поле должно участвовать в расчетах (например, для вычисления итогов), но не должно отображаться пользователю. В СКД можно использовать Условное оформление.

Разберем шаги настройки:

  1. Добавим в СКД параметр СкрыватьЦену, который будем заполнять при старте отчета в зависимости от роли.
  2. На закладке "Настройки" перейдем в "Условное оформление".
  3. Создадим новый элемент оформления: установим свойство Текст равным "---" или просто пустой строке.
  4. В условии укажем: ПараметрыДанных.СкрыватьЦену Равно Истина.
  5. В области использования выберем только поле Цена.

Этот метод является скорее косметическим, так как при определенной сноровке пользователь может увидеть данные (например, выгрузив отчет в XML или воспользовавшись консолью отчетов), но для повседневных задач он вполне применим.

Резюме

Мы рассмотрели различные подходы к ограничению видимости данных. Для обеспечения максимальной безопасности лучше использовать ограничение прав на уровне метаданных. Если же требуется гибкость настройки в рамках одного отчета без изменения прав доступа к объектам, оптимальным выбором будет программное управление доступными полями в КомпоновщикеНастроек. Комбинируя эти методы, мы сможем создать удобный и безопасный инструмент для работы всех категорий пользователей.

← На главную