При разработке отчетов в системе компоновки данных (СКД) часто возникает задача ограничить видимость чувствительных данных, таких как себестоимость, маржа или валовая прибыль. Если отчет предназначен для широкого круга лиц, менеджеры не должны видеть финансовый результат компании, в то время как бухгалтеры и руководство должны иметь полный доступ к информации. Рассмотрим подробнее, как реализовать такую логику, используя стандартные средства платформы 1С:Предприятие 8.3 и дополнительные инструменты для ограничения полных прав в отчетах СКД.
Проанализируем ситуацию, когда нам нужно не просто скрыть поле, а обнулить его значения для пользователей без определенных прав. Один из самых гибких способов — это создание вычисляемого поля, которое будет выступать в роли «фильтра» или «коэффициента».
Разберем по шагам реализацию этого метода:
УправлениеОтчетами) экспортную функцию, которая проверяет роль пользователя. Модуль должен иметь флаг Вызов сервера.
Функция ПолучитьКоэффициентДоступаКФинансам() Экспорт
Если РольДоступна("Бухгалтер") Или РольДоступна("ПолныеПрава") Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
КоэффициентРоли. В выражении укажем вызов нашей функции: УправлениеОтчетами.ПолучитьКоэффициентДоступаКФинансам().Себестоимость изменим выражение расчета. Вместо стандартного Сумма(Себестоимость) пропишем формулу, учитывающую наш коэффициент.Посмотрим на пример выражения ресурса:
Сумма(СебестоимостьОборот * КоэффициентРоли)
В этом случае, если у пользователя есть роль Бухгалтер, коэффициент будет равен 1, и данные отобразятся корректно. Если роли нет — коэффициент станет равным 0, и во всех строках отчета вместо цифр пользователь увидит нули. Чтобы избежать потенциальных проблем при вызове процедур, полезно провести предварительный анализ конфигурации на наличие ошибок, связанных с экспортными функциями общих модулей.
Выясним причину, по которой отчет может перестать работать после добавления вызова функции из общего модуля. Начиная с последних версий платформы 8.3, усилена безопасность. Для корректной работы внешних функций необходимо явно разрешить их использование при инициализации процессора компоновки.
Если вы используете программный вывод отчета, обратите внимание на четвертый параметр метода Инициализировать объекта ПроцессорКомпоновкиДанных. Проанализируем пример кода в модуле объекта отчета:
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
// Четвертый параметр - ВозможностьИспользованияВнешнихФункций - устанавливаем в Истина
ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);
Если же отчет типовой и работает в рамках БСП (Библиотеки стандартных подсистем), то эти настройки обычно применяются автоматически, но важно следить за тем, чтобы общий модуль был доступен для вызова из СКД. В сложных архитектурных решениях иногда приходится задействовать две разных схемы в одном отчете СКД, чтобы разграничить логику формирования данных.
Рассмотрим более надежный метод с точки зрения интерфейса. Метод с коэффициентами оставляет поле видимым (хоть и с нулями). Чтобы поле полностью исчезло из доступных, если у пользователя нет прав, воспользуемся программной модификацией схемы. Подобное динамическое добавление полей и ресурсов в отчет позволяет гибко адаптировать структуру документа под текущие полномочия.
В модуле объекта отчета найдем предопределенную процедуру ПриКомпоновкеРезультата. Выполним следующие действия:
Посмотрим на программную реализацию:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Берем управление на себя
Если Не РольДоступна("Бухгалтер") Тогда
// Удаляем поле из пользовательских настроек (выбранные поля)
ПолеСебестоимость = Новый ПолеКомпоновкиДанных("Себестоимость");
СписокДляУдаления = Новый Массив;
Для Каждого Элемент Из КомпоновщикНастроек.Настройки.ВыбранныеПоля.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ВыбранноеПолеКомпоновкиДанных")
И Элемент.Поле = ПолеСебестоимость Тогда
СписокДляУдаления.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из СписокДляУдаления Цикл
КомпоновщикНастроек.Настройки.ВыбранныеПоля.Элементы.Удалить(Элемент);
КонецЦикла;
КонецЕсли;
// Далее стандартный вывод
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Проанализируем ситуацию, когда мы хотим избежать вызовов общих модулей прямо из текста запроса или вычисляемых полей. Мы можем передать право доступа как обычный параметр Булево. Для реализации сложных пользовательских сценариев может также пригодиться специализированная пользовательская СКД, расширяющая возможности настройки на стороне клиента.
Разберем этот алгоритм:
&ДоступнаСебестоимость (тип Булево). Снимем галочку Включать в доступные поля, чтобы пользователь не мог изменить его вручную.ВЫБОР КОГДА.Пример выражения в ресурсах:
Сумма(ВЫБОР КОГДА &ДоступнаСебестоимость ТОГДА Себестоимость ИНАЧЕ 0 КОНЕЦ)
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"ДоступнаСебестоимость",
РольДоступна("Бухгалтер")
);
С точки зрения архитектуры 1С, наиболее правильным методом является использование Функциональных опций (ФО). Это позволяет скрыть поля не только в одном отчете, но и во всей системе сразу.
Как это работает:
ДоступКФинансам).Результат: Если функциональная опция выключена (значение параметра сеанса Ложь), поле Себестоимость полностью исчезает из СКД — здесь поможет детальный анализ прав пользователей и RLS.
Выясним, как работает ограничение прав на уровне полей — в этом поможет обработка анализа прав доступа и RLS. В конфигураторе, при настройке роли, можно снять галочку Просмотр для конкретных полей. СКД обладает встроенным механизмом обработки таких ограничений. В некоторых ситуациях разработчики намеренно используют привилегированный режим в СКД, чтобы обойти стандартные проверки прав доступа для определенных алгоритмов.
Этот метод хорош тем, что он работает «из коробки» и не требует написания кода в каждом отдельном отчете. Если у пользователя нет прав на поле Себестоимость, то система просто проигнорирует это поле или выведет пустые значения.
Мы рассмотрели пять различных подходов к ограничению видимости полей в СКД. Выбор метода зависит от ваших задач:
Помните, что визуальное скрытие поля не является защитой данных, так как опытный пользователь может найти эти значения в расшифровке или через сохранение результата в XML.