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