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