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