Приветствуем вас! Сегодня мы вместе разберем одну из частых задач при работе с формами в 1С:Предприятие – управление видимостью или доступностью элементов, в частности, кнопок, таких как "Выполнить". Мы выясним, почему кнопка может не отображаться или быть неактивной, и как настроить её поведение в зависимости от прав пользователя, например, для администратора.
Эта проблема часто возникает из-за тонкостей работы с управляемыми формами и различий между свойствами Видимость и Доступность. Давайте погрузимся в детали и найдем оптимальное решение.
Прежде всего, давайте проанализируем ситуацию. В 1С:Предприятие существует два основных типа форм: обычные формы (старая технология, преимущественно для толстого клиента) и управляемые формы (современный подход, используемый в большинстве конфигураций на платформах 8.2/8.3 и выше, работающий в любом клиенте – тонком, веб, толстом).
Обычные формы: В них для элементов формы существовало свойство Видимость (Visibility), которое позволяло полностью скрывать или отображать элемент.
Управляемые формы: Здесь ситуация иная. Хотя свойство Видимость для элементов формы тоже существует, для интерактивных элементов, таких как кнопки на командной панели, рекомендуется и чаще используется свойство Доступность (Availability). Если кнопка недоступна, она обычно отображается в приглушенном цвете и не реагирует на действия пользователя, но при этом остается на форме. Это обеспечивает лучшее пользовательское восприятие и соответствие стандартам управляемого интерфейса.
Одна из распространенных ошибок, как показал опыт наших коллег, заключается в том, что разработчик пытается применить логику управляемых форм к обычным, или наоборот, пишет код в модуле обычной формы, когда на самом деле используется управляемая. В управляемых формах мы оперируем коллекцией Элементы, тогда как в обычных формах могли использоваться ЭлементыФормы. Очень важно убедиться, что вы работаете именно с той формой, которая используется в интерфейсе, и применяете к ней правильные методы.
Теперь, когда мы понимаем разницу, давайте рассмотрим, как программно управлять доступностью кнопки в управляемой форме. Весь код, который изменяет свойства элементов формы на основе серверной логики (например, прав пользователя), должен выполняться на сервере.
Для этого мы используем серверные обработчики событий формы, такие как:
ПриСозданииНаСервере (OnCreateAtServer): Вызывается один раз при первоначальном создании формы на сервере. Идеально подходит для установки начальной доступности элементов.ПриОткрытии (OnOpen): Вызывается каждый раз при открытии формы, после её создания.Рассмотрим пример установки доступности кнопки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
// Предположим, что имя нашей кнопки в конфигураторе - "КнопкаВыполнить"
// Мы можем найти её в коллекции Элементы формы
Если Элементы.Найти("КнопкаВыполнить") Тогда
// Устанавливаем доступность кнопки в зависимости от некоторого условия
Элементы.КнопкаВыполнить.Доступность = Истина; // Кнопка будет доступна
// Или
// Элементы.КнопкаВыполнить.Доступность = Ложь; // Кнопка будет недоступна
КонецЕсли;
КонецПроцедуры
Мы используем директиву &НаСервере, чтобы явно указать, что процедура будет выполняться на сервере. Внутри процедуры мы обращаемся к коллекции Элементы формы, чтобы найти нашу кнопку по её имени (например, КнопкаВыполнить) и установить её свойство Доступность в Истина (доступна) или Ложь (недоступна).
Чтобы сделать кнопку доступной только для определенных пользователей (например, администраторов), нам необходимо проверить их права. В 1С есть несколько способов это сделать, и мы разберем наиболее полезные.
РольДоступна()Функция РольДоступна("ИмяРоли") позволяет проверить, назначена ли текущему пользователю указанная роль. Она возвращает Истина, если роль доступна, и Ложь в противном случае. Этот метод прост в использовании, но требует точного знания имени роли.
Важно: В типовых конфигурациях 1С для административного доступа могут использоваться разные роли. Часто встречаются: Администратор, АдминистраторСистемы, ПолныеПрава. Всегда проверяйте актуальные названия ролей в вашей конфигурации через конфигуратор.
Посмотрим на пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
ИмяКнопки = "КнопкаВыполнить"; // Замените на фактическое имя вашей кнопки
// Проверяем, является ли текущий пользователь администратором
// Используем несколько возможных ролей для надежности
ДоступенДляАдминистратора = РольДоступна("Администратор")
Или РольДоступна("АдминистраторСистемы")
Или РольДоступна("ПолныеПрава");
// Устанавливаем доступность кнопки
Если Элементы.Найти(ИмяКнопки) Тогда
Элементы[ИмяКнопки].Доступность = ДоступенДляАдминистратора;
КонецЕсли;
КонецПроцедуры
В этом примере мы сначала определяем переменную ДоступенДляАдминистратора, которая будет Истина, если пользователю доступна хотя бы одна из перечисленных административных ролей. Затем мы присваиваем это значение свойству Доступность нашей кнопки.
ПравоДоступа()Для более гибкой и надежной проверки прав доступа, особенно если вы хотите контролировать доступ не по роли в целом, а по конкретному действию над объектом метаданных, мы можем использовать метод ПравоДоступа("Действие", Метаданные.Объекты.ИмяОбъекта).
Этот метод позволяет проверять конкретные права (например, "Чтение", "Изменение", "Добавление") на определенные объекты метаданных (справочники, документы, регистры и т.д.). Такой подход делает ваш код менее чувствительным к изменениям названий ролей и позволяет более точно настраивать функциональность.
Пример проверки права на изменение справочника "Номенклатура":
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
ИмяКнопки = "КнопкаИзменитьНоменклатуру"; // Кнопка для изменения номенклатуры
// Проверяем, есть ли у пользователя право "Изменение" на справочник "Номенклатура"
ИмеетПравоИзменятьНоменклатуру = ПравоДоступа("Изменение", Метаданные.Справочники.Номенклатура);
// Устанавливаем доступность кнопки
Если Элементы.Найти(ИмяКнопки) Тогда
Элементы[ИмяКнопки].Доступность = ИмеетПравоИзменятьНоменклатуру;
КонецЕсли;
КонецПроцедуры
В этом случае, кнопка КнопкаИзменитьНоменклатуру будет доступна только тем пользователям, у кого есть право на изменение элементов справочника Номенклатура, независимо от того, какая именно роль дает им это право.
В конфигурациях, использующих Библиотеку стандартных подсистем (БСП), часто есть более продвинутые функции для работы с правами, например, Пользователи.РолиДоступны(...). Эти функции могут быть удобны для проверки нескольких ролей или более сложных условий, но их наличие и синтаксис зависят от конкретной версии БСП в вашей конфигурации.
Теперь давайте скомбинируем все наши знания для решения исходной задачи – сделать кнопку "Выполнить" доступной только для администраторов в управляемой форме.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
// 1. Определяем имя кнопки, которую хотим сделать доступной/недоступной.
// Это имя вы можете посмотреть в свойствах элемента формы в конфигураторе.
ИмяКнопкиВыполнить = "КнопкаВыполнить"; // Замените на фактическое имя вашей кнопки
// 2. Проверяем, является ли текущий пользователь администратором.
// Мы используем несколько возможных ролей для надежности,
// так как в разных конфигурациях могут быть разные названия административных ролей.
ДоступенДляАдминистратора = РольДоступна("Администратор")
Или РольДоступна("АдминистраторСистемы")
Или РольДоступна("ПолныеПрава");
// 3. Устанавливаем доступность кнопки на основе проверки прав.
// Важно сначала убедиться, что элемент с таким именем существует на форме.
Если Элементы.Найти(ИмяКнопкиВыполнить) Тогда
Элементы[ИмяКнопкиВыполнить].Доступность = ДоступенДляАдминистратора;
КонецЕсли;
// Дополнительный пример: Если бы мы хотели проверить конкретное право,
// например, право на выполнение регламентных заданий,
// вместо проверки ролей можно было бы сделать так:
// Если ПравоДоступа("Выполнение", Метаданные.РегламентныеЗадания) Тогда
// Элементы.КнопкаВыполнитьРегламент.Доступность = Истина;
// Иначе
// Элементы.КнопкаВыполнитьРегламент.Доступность = Ложь;
// КонецЕсли;
КонецПроцедуры
Этот код, размещенный в модуле управляемой формы в процедуре ПриСозданииНаСервере, обеспечит, что кнопка с именем КнопкаВыполнить будет доступна только пользователям с соответствующими административными ролями.
Проверяйте тип формы: Всегда убеждайтесь, что вы работаете с управляемой формой, если ожидаете поведение управляемого интерфейса. Это была ключевая причина проблемы у автора исходной темы.
Имена элементов и ролей: Всегда перепроверяйте точные имена элементов формы в конфигураторе и точные названия ролей, используемых в вашей конкретной конфигурации. Не полагайтесь на предположения.
Производительность: Размещение сложной логики проверки прав в ПриСозданииНаСервере может незначительно повлиять на скорость открытия формы. Для очень сложных случаев, когда внешний вид и функциональность формы сильно зависят от прав пользователя, иногда рекомендуется разрабатывать отдельные формы, специализированные под конкретные наборы прав, вместо того чтобы динамически изменять одну форму.
Использование Видимость: Хотя мы сосредоточились на Доступность, свойство Видимость также существует. Если вы хотите полностью скрыть кнопку, чтобы она не занимала место на форме, вы можете использовать Видимость = Ложь. Однако для интерактивных элементов чаще предпочтительнее Доступность, так как она дает пользователю понять, что такая функция существует, но в данный момент недоступна.
Надеемся, что это подробное руководство поможет вам уверенно управлять видимостью и доступностью элементов в ваших 1С-решениях! Успехов в разработке!
← К списку