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