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