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