Как программно ограничить видимость элементов формы 1С по роли доступа, если документ не открывается?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке функционала в 1С часто возникает задача, когда необходимо программно управлять видимостью элементов формы в зависимости от прав доступа пользователя. Например, показывать определенные кнопки или поля только тем, у кого есть «Полные права». Однако, иногда мы сталкиваемся с ситуацией, когда пользователи без таких расширенных прав вообще не могут открыть документ, получая ошибку «недостаточно прав для просмотра». Рассмотрим, как грамотно решить эту комплексную проблему, обеспечив и базовый доступ к документу, и гибкое управление видимостью его элементов.

Проблема 1: Отсутствие базовых прав на просмотр документа

Прежде чем мы начнем скрывать или показывать элементы формы, критически важно убедиться, что пользователь вообще имеет право открывать и просматривать сам документ. Если у пользователя нет базовых прав на чтение объекта конфигурации «Документ», то никакие настройки видимости элементов его формы не будут иметь смысла – форма просто не откроется, и система выдаст ошибку о недостатке прав. Это первый и самый важный шаг в решении нашей задачи.

Давайте разберем по шагам, как обеспечить пользователю возможность просмотра документа, не давая ему при этом «Полных прав»:

  1. Создайте или модифицируйте роль доступа. Мы должны определить роль, которая будет давать право на просмотр данного документа. Это может быть как существующая роль, например, «ПользовательСистемы», так и новая, специально созданная для этой цели, например, «ПросмотрДокументовX».
  2. Предоставьте права на объект «Документ». В конфигураторе, откройте свойства вашей роли. В ветке «Документы» найдите нужный вам документ. Установите для него флаг «Чтение». При необходимости, если предполагается также возможность редактирования некоторых полей, но не всех, можно установить флаг «Просмотр» или «Изменение» для самого объекта, но это уже относится к другой части задачи, сейчас нас интересует именно возможность открытия. Убедитесь, что права на чтение также установлены для реквизитов, табличных частей и подчиненных объектов, если они используются в документе.
  3. Назначьте роль пользователю. После того как роль будет сконфигурирована и сохранена, необходимо назначить ее соответствующим пользователям или группам пользователей в режиме 1С:Предприятие. Для этого зайдите в раздел «Администрирование» (или аналогичный, в зависимости от конфигурации), найдите настройки пользователей и групп доступа, и добавьте созданную/измененную роль в профиль группы доступа, к которой принадлежит ваш пользователь, или непосредственно пользователю.

Таким образом, мы гарантируем, что пользователь сможет открыть документ. После этого уже можно переходить к управлению видимостью отдельных элементов внутри формы.

Помимо базовых прав на объект, в более сложных случаях может применяться Ограничение доступа на уровне записей (RLS). Этот механизм позволяет дополнительно регулировать, к каким именно записям (конкретным документам, элементам справочников) внутри объекта пользователь имеет доступ, например, только к документам своего подразделения. Однако, RLS является более продвинутой настройкой и не решает проблему отсутствия прав на сам объект конфигурации.

Проблема 2: Программное ограничение видимости элементов формы

После того как мы убедились, что пользователи имеют базовые права на открытие документа, мы можем приступить к программному управлению видимостью элементов формы. Этот подход позволяет гибко настраивать интерфейс в зависимости от различных условий, включая роли пользователя.

Метод 1: Программное управление свойством «Видимость»

Наиболее распространенный и гибкий способ — это программное изменение свойства Видимость у элементов формы. Для этого мы будем использовать функцию РольДоступна(), которая позволяет определить, назначена ли текущему пользователю указанная роль.

Рассмотрим пример кода, предложенный автором, и проанализируем его:


&НаСервере Процедура ПриОткрытииНаСервере
    Если РольДоступна("ПолныеПрава") Тогда
        ИзменитьДоступКЭлементамФормы;
    КонецЕсли;
КонецПроцедуры

&НаСервере Процедура ИзменитьДоступКЭлементамФормы
    Если РольДоступна("ПолныеПрава") Тогда
        Элементы.ПроверитьСпецификацию.Видимость = Истина;
        Элементы.ФормаСброситьОтбор.Видимость = Истина;
        Элементы.ФормаСформироватьОтчет.Видимость = Истина;
    Иначе
        Элементы.ПроверитьСпецификацию.Видимость = Ложь;
        Элементы.ФормаСброситьОтбор.Видимость = Ложь;
        Элементы.ФормаСформироватьОтчет.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры

В этом коде автор использует процедуру ИзменитьДоступКЭлементамФормы, которая вызывается из обработчика события ПриОткрытииНаСервере. Логика в целом верна: если у пользователя есть роль «ПолныеПрава», элементы становятся видимыми; в противном случае — невидимыми. Однако, мы можем значительно упростить эту конструкцию.

Упрощение программного кода

Вместо использования нескольких условий Если...Тогда...Иначе и отдельной процедуры, мы можем напрямую присваивать булево значение, возвращаемое функцией РольДоступна(), свойству Видимость элементов формы. Это делает код более лаконичным и читаемым:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Определяем, доступна ли роль "ПолныеПрава" текущему пользователю
    Перем ДоступныПолныеПрава;
    ДоступныПолныеПрава = РольДоступна("ПолныеПрава");

    // Присваиваем видимость элементам формы
    Элементы.ПроверитьСпецификацию.Видимость = ДоступныПолныеПрава;
    Элементы.ФормаСброситьОтбор.Видимость = ДоступныПолныеПрамы;
    Элементы.ФормаСформироватьОтчет.Видимость = ДоступныПолныеПрава;
КонецПроцедуры

Здесь мы видим, как переменная ДоступныПолныеПрава получает значение Истина или Ложь в зависимости от наличия роли, а затем это значение напрямую используется для установки свойства Видимость у каждого элемента. Такой подход сокращает количество строк кода и упрощает его поддержку.

Функция РольДоступна("ИмяРоли") является ключевой в этом методе. Она возвращает Истина, если текущему пользователю назначена роль с указанным именем (или хотя бы одна из ролей, входящих в профиль пользователя, имеет это имя), и Ложь в противном случае. Эта функция работает на сервере, поэтому вызывать ее следует в серверных процедурах или функциях.

Размещение кода для управления видимостью

Важным аспектом является выбор правильного места для размещения кода, управляющего видимостью элементов:

  1. ПриСозданииНаСервере: Этот обработчик события формы является оптимальным выбором, если видимость элементов должна быть установлена один раз при создании формы и не будет изменяться в процессе ее работы. Код выполняется на сервере до того, как форма будет полностью сформирована и передана на клиент. Это позволяет минимизировать лишние обращения к серверу.
  2. ПриОткрытии или другие клиентские процедуры: Если видимость элементов формы может изменяться динамически в зависимости от действий пользователя (например, при изменении значения какого-либо поля на форме) или других условий, которые могут меняться во время работы с формой, тогда целесообразно вынести код в отдельную клиентскую процедуру. Эту процедуру можно вызывать из обработчика ПриОткрытии (для первоначальной установки видимости) и затем из других клиентских обработчиков событий (например, ПриИзменении для поля), которые влияют на видимость. В этом случае, если для определения видимости требуются серверные данные (как, например, проверка РольДоступна()), клиентская процедура должна будет вызывать серверную функцию для получения этих данных.

В большинстве случаев, когда видимость элементов определяется один раз при открытии формы на основе ролей пользователя, размещение кода в ПриСозданииНаСервере будет наиболее эффективным.

Метод 2: Настройка «Пользовательской видимости» в конфигураторе

Помимо программного подхода, существует возможность управлять видимостью элементов формы непосредственно в конфигураторе, используя свойство «Пользовательская видимость». Этот метод удобен для статических настроек, которые редко меняются.

Давайте рассмотрим, как настроить пользовательскую видимость:

  1. Откройте форму в конфигураторе. Перейдите к нужному документу (или другому объекту), откройте его форму.
  2. Выберите элемент формы. В дереве элементов формы выберите тот элемент, видимость которого вы хотите ограничить (например, кнопку ПроверитьСпецификацию).
  3. Перейдите к свойству «Пользовательская видимость». В окне свойств выбранного элемента найдите свойство Пользовательская видимость. Откройте его двойным щелчком или кнопкой с тремя точками.
  4. Снимите или установите флаги для ролей. Появится таблица, в которой перечислены все роли конфигурации. Для каждой роли вы можете установить или снять флаг, определяющий, будет ли этот элемент виден пользователям с данной ролью. В нашем случае, если мы хотим, чтобы элемент был виден только при «Полных правах», мы снимаем флаги со всех ролей, кроме «ПолныеПрава».

Преимущества этого метода заключаются в его простоте и отсутствии необходимости писать код. Однако, есть и недостатки. Если вы работаете с типовой конфигурацией, изменение свойства Пользовательская видимость в конфигураторе является изменением, которое может усложнить процесс обновления. При программном подходе (Метод 1) мы можем размещать код в расширениях или в нетиповых обработчиках, что делает процесс обновления более легким.

Комбинация настроек и результирующая видимость

Важно понимать, что результирующая видимость элемента формы определяется комбинацией нескольких настроек. В общем случае, видимость элемента является результатом логического «И» следующих условий:

Это означает, что если элемент изначально не доступен через «Пользовательскую видимость» (флаг снят), то программное присваивание Элементы.Элемент.Видимость = Истина; не сделает его видимым. Элемент должен быть видимым по всем правилам, чтобы отобразиться на форме.

Также следует учитывать, что пользователи могут самостоятельно настраивать видимость элементов формы через механизм «Изменить форму» в режиме 1С:Предприятие. Эти пользовательские настройки имеют высокий приоритет и могут переопределять как программные установки, так и настройки «Пользовательской видимости», если элемент изначально доступен для пользовательской настройки.

Альтернативные и продвинутые подходы

Помимо рассмотренных базовых методов, существуют и более продвинутые подходы к управлению интерфейсом:

  1. Условное оформление: Этот механизм позволяет изменять внешний вид (цвет, шрифт, доступность, видимость) элементов формы без написания кода, используя графический интерфейс. Вы можете задать условия, при которых элементы будут становиться видимыми/невидимыми, доступными/недоступными. Это особенно удобно для динамических изменений, основанных на данных формы, но также может быть настроено на основе ролей или других параметров сеанса.
  2. Использование элемента «Панель» с несколькими страницами: Если у вас есть большие блоки элементов, которые должны быть видны только при определенных условиях, вы можете разместить их на разных страницах элемента формы Панель. Затем программно или через условное оформление вы можете управлять активной страницей панели, показывая только нужный набор элементов.
  3. Механизмы настройки доступности элементов форм (в типовых конфигурациях): В некоторых крупных типовых конфигурациях, таких как 1С:ERP или БИТ.ФИНАНС, существуют встроенные подсистемы для управления видимостью, доступностью и обязательностью заполнения элементов формы. Эти механизмы обычно хранят настройки в регистрах сведений и позволяют администраторам или продвинутым пользователям гибко настраивать интерфейс для разных групп пользователей или даже по произвольным условиям без изменений в конфигураторе. Если ваша конфигурация содержит такой функционал, изучите его возможности, возможно, это наиболее подходящее решение для вашей задачи.

Важные нюансы и рекомендации

Таким образом, решение задачи по ограничению видимости элементов формы 1С состоит из двух ключевых частей: сначала необходимо обеспечить базовые права доступа к самому документу, а затем использовать один из описанных методов (программное управление свойством Видимость, настройка Пользовательской видимости в конфигураторе, или более продвинутые подходы) для тонкой настройки интерфейса в зависимости от ролей пользователя.

← На главную