Как в отчете СКД скрыть или изменить отображение полей в зависимости от роли пользователя?

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

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

Метод 1. Использование вычисляемых полей и коэффициентов доступа

Проанализируем ситуацию, когда нам нужно не просто скрыть поле, а обнулить его значения для пользователей без определенных прав. Один из самых гибких способов — это создание вычисляемого поля, которое будет выступать в роли «фильтра» или «коэффициента».

Разберем по шагам реализацию этого метода:

  1. Создадим в общем модуле (например, УправлениеОтчетами) экспортную функцию, которая проверяет роль пользователя. Модуль должен иметь флаг Вызов сервера.

Функция ПолучитьКоэффициентДоступаКФинансам() Экспорт
    Если РольДоступна("Бухгалтер") Или РольДоступна("ПолныеПрава") Тогда
        Возврат 1;
    Иначе
        Возврат 0;
    КонецЕсли;
КонецФункции
  1. В схеме компоновки данных перейдем на закладку Вычисляемые поля. Добавим новое поле КоэффициентРоли. В выражении укажем вызов нашей функции: УправлениеОтчетами.ПолучитьКоэффициентДоступаКФинансам().
  2. Теперь самое важное — настройка ресурсов. На закладке Ресурсы для поля Себестоимость изменим выражение расчета. Вместо стандартного Сумма(Себестоимость) пропишем формулу, учитывающую наш коэффициент.

Посмотрим на пример выражения ресурса:


Сумма(СебестоимостьОборот * КоэффициентРоли)

В этом случае, если у пользователя есть роль Бухгалтер, коэффициент будет равен 1, и данные отобразятся корректно. Если роли нет — коэффициент станет равным 0, и во всех строках отчета вместо цифр пользователь увидит нули. Чтобы избежать потенциальных проблем при вызове процедур, полезно провести предварительный анализ конфигурации на наличие ошибок, связанных с экспортными функциями общих модулей.

Нюансы использования внешних функций в СКД (Платформа 8.3.23+)

Выясним причину, по которой отчет может перестать работать после добавления вызова функции из общего модуля. Начиная с последних версий платформы 8.3, усилена безопасность. Для корректной работы внешних функций необходимо явно разрешить их использование при инициализации процессора компоновки.

Если вы используете программный вывод отчета, обратите внимание на четвертый параметр метода Инициализировать объекта ПроцессорКомпоновкиДанных. Проанализируем пример кода в модуле объекта отчета:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
// Четвертый параметр - ВозможностьИспользованияВнешнихФункций - устанавливаем в Истина
ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);

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

Метод 2. Программное управление выбранными полями в событии ПриКомпоновкеРезультата

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

В модуле объекта отчета найдем предопределенную процедуру ПриКомпоновкеРезультата. Выполним следующие действия:

  1. Проверим наличие роли.
  2. Если роли нет, найдем поле в доступных полях выбора и удалим его, либо отключим его использование в настройках.

Посмотрим на программную реализацию:


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

    // Далее стандартный вывод
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Метод 3. Использование параметров СКД для условий в запросе

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

Разберем этот алгоритм:

  1. В СКД на закладке Параметры добавим параметр &ДоступнаСебестоимость (тип Булево). Снимем галочку Включать в доступные поля, чтобы пользователь не мог изменить его вручную.
  2. В тексте запроса или в выражении ресурса используем конструкцию ВЫБОР КОГДА.

Пример выражения в ресурсах:


Сумма(ВЫБОР КОГДА &ДоступнаСебестоимость ТОГДА Себестоимость ИНАЧЕ 0 КОНЕЦ)
  1. В модуле отчета перед формированием установим значение этого параметра:

КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
    "ДоступнаСебестоимость", 
    РольДоступна("Бухгалтер")
);

Метод 4. Функциональные опции (Best Practice)

С точки зрения архитектуры 1С, наиболее правильным методом является использование Функциональных опций (ФО). Это позволяет скрыть поля не только в одном отчете, но и во всей системе сразу.

Как это работает:

Результат: Если функциональная опция выключена (значение параметра сеанса Ложь), поле Себестоимость полностью исчезает из СКД — здесь поможет детальный анализ прав пользователей и RLS.

Метод 5. Ограничение на уровне прав доступа (RLS)

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

Этот метод хорош тем, что он работает «из коробки» и не требует написания кода в каждом отдельном отчете. Если у пользователя нет прав на поле Себестоимость, то система просто проигнорирует это поле или выведет пустые значения.

Подведение итогов

Мы рассмотрели пять различных подходов к ограничению видимости полей в СКД. Выбор метода зависит от ваших задач:

Помните, что визуальное скрытие поля не является защитой данных, так как опытный пользователь может найти эти значения в расшифровке или через сохранение результата в XML.

← На главную