Почему кнопка "Выполнить" не видна или недоступна, и как управлять её отображением в 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием
← К списку

Приветствуем вас! Сегодня мы вместе разберем одну из частых задач при работе с формами в 1С:Предприятие – управление видимостью или доступностью элементов, в частности, кнопок, таких как "Выполнить". Мы выясним, почему кнопка может не отображаться или быть неактивной, и как настроить её поведение в зависимости от прав пользователя, например, для администратора.

Эта проблема часто возникает из-за тонкостей работы с управляемыми формами и различий между свойствами Видимость и Доступность. Давайте погрузимся в детали и найдем оптимальное решение.

Выясняем причину: Видимость или Доступность? Управляемые и Обычные формы

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

  1. Обычные формы: В них для элементов формы существовало свойство Видимость (Visibility), которое позволяло полностью скрывать или отображать элемент.

  2. Управляемые формы: Здесь ситуация иная. Хотя свойство Видимость для элементов формы тоже существует, для интерактивных элементов, таких как кнопки на командной панели, рекомендуется и чаще используется свойство Доступность (Availability). Если кнопка недоступна, она обычно отображается в приглушенном цвете и не реагирует на действия пользователя, но при этом остается на форме. Это обеспечивает лучшее пользовательское восприятие и соответствие стандартам управляемого интерфейса.

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

Управление доступностью кнопки в управляемых формах

Теперь, когда мы понимаем разницу, давайте рассмотрим, как программно управлять доступностью кнопки в управляемой форме. Весь код, который изменяет свойства элементов формы на основе серверной логики (например, прав пользователя), должен выполняться на сервере.

Для этого мы используем серверные обработчики событий формы, такие как:

Рассмотрим пример установки доступности кнопки:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    // Предположим, что имя нашей кнопки в конфигураторе - "КнопкаВыполнить"
    // Мы можем найти её в коллекции Элементы формы
    Если Элементы.Найти("КнопкаВыполнить") Тогда
        // Устанавливаем доступность кнопки в зависимости от некоторого условия
        Элементы.КнопкаВыполнить.Доступность = Истина; // Кнопка будет доступна
        // Или
        // Элементы.КнопкаВыполнить.Доступность = Ложь; // Кнопка будет недоступна
    КонецЕсли;
КонецПроцедуры

Мы используем директиву &НаСервере, чтобы явно указать, что процедура будет выполняться на сервере. Внутри процедуры мы обращаемся к коллекции Элементы формы, чтобы найти нашу кнопку по её имени (например, КнопкаВыполнить) и установить её свойство Доступность в Истина (доступна) или Ложь (недоступна).

Проверка прав пользователя: Как определить, кто перед нами?

Чтобы сделать кнопку доступной только для определенных пользователей (например, администраторов), нам необходимо проверить их права. В 1С есть несколько способов это сделать, и мы разберем наиболее полезные.

Метод 1: Проверка наличия роли с помощью РольДоступна()

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

Важно: В типовых конфигурациях 1С для административного доступа могут использоваться разные роли. Часто встречаются: Администратор, АдминистраторСистемы, ПолныеПрава. Всегда проверяйте актуальные названия ролей в вашей конфигурации через конфигуратор.

Посмотрим на пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    ИмяКнопки = "КнопкаВыполнить"; // Замените на фактическое имя вашей кнопки

    // Проверяем, является ли текущий пользователь администратором
    // Используем несколько возможных ролей для надежности
    ДоступенДляАдминистратора = РольДоступна("Администратор")
                            Или РольДоступна("АдминистраторСистемы")
                            Или РольДоступна("ПолныеПрава");

    // Устанавливаем доступность кнопки
    Если Элементы.Найти(ИмяКнопки) Тогда
        Элементы[ИмяКнопки].Доступность = ДоступенДляАдминистратора;
    КонецЕсли;
КонецПроцедуры

В этом примере мы сначала определяем переменную ДоступенДляАдминистратора, которая будет Истина, если пользователю доступна хотя бы одна из перечисленных административных ролей. Затем мы присваиваем это значение свойству Доступность нашей кнопки.

Метод 2: Проверка конкретного права доступа с помощью ПравоДоступа()

Для более гибкой и надежной проверки прав доступа, особенно если вы хотите контролировать доступ не по роли в целом, а по конкретному действию над объектом метаданных, мы можем использовать метод ПравоДоступа("Действие", Метаданные.Объекты.ИмяОбъекта).

Этот метод позволяет проверять конкретные права (например, "Чтение", "Изменение", "Добавление") на определенные объекты метаданных (справочники, документы, регистры и т.д.). Такой подход делает ваш код менее чувствительным к изменениям названий ролей и позволяет более точно настраивать функциональность.

Пример проверки права на изменение справочника "Номенклатура":


&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    ИмяКнопки = "КнопкаИзменитьНоменклатуру"; // Кнопка для изменения номенклатуры

    // Проверяем, есть ли у пользователя право "Изменение" на справочник "Номенклатура"
    ИмеетПравоИзменятьНоменклатуру = ПравоДоступа("Изменение", Метаданные.Справочники.Номенклатура);

    // Устанавливаем доступность кнопки
    Если Элементы.Найти(ИмяКнопки) Тогда
        Элементы[ИмяКнопки].Доступность = ИмеетПравоИзменятьНоменклатуру;
    КонецЕсли;
КонецПроцедуры

В этом случае, кнопка КнопкаИзменитьНоменклатуру будет доступна только тем пользователям, у кого есть право на изменение элементов справочника Номенклатура, независимо от того, какая именно роль дает им это право.

Метод 3: Использование функций БСП (Библиотека стандартных подсистем)

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

Комплексное решение: Объединяем знания

Теперь давайте скомбинируем все наши знания для решения исходной задачи – сделать кнопку "Выполнить" доступной только для администраторов в управляемой форме.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    // 1. Определяем имя кнопки, которую хотим сделать доступной/недоступной.
    // Это имя вы можете посмотреть в свойствах элемента формы в конфигураторе.
    ИмяКнопкиВыполнить = "КнопкаВыполнить"; // Замените на фактическое имя вашей кнопки

    // 2. Проверяем, является ли текущий пользователь администратором.
    // Мы используем несколько возможных ролей для надежности,
    // так как в разных конфигурациях могут быть разные названия административных ролей.
    ДоступенДляАдминистратора = РольДоступна("Администратор")
                                Или РольДоступна("АдминистраторСистемы")
                                Или РольДоступна("ПолныеПрава");

    // 3. Устанавливаем доступность кнопки на основе проверки прав.
    // Важно сначала убедиться, что элемент с таким именем существует на форме.
    Если Элементы.Найти(ИмяКнопкиВыполнить) Тогда
        Элементы[ИмяКнопкиВыполнить].Доступность = ДоступенДляАдминистратора;
    КонецЕсли;

    // Дополнительный пример: Если бы мы хотели проверить конкретное право,
    // например, право на выполнение регламентных заданий,
    // вместо проверки ролей можно было бы сделать так:
    // Если ПравоДоступа("Выполнение", Метаданные.РегламентныеЗадания) Тогда
    //     Элементы.КнопкаВыполнитьРегламент.Доступность = Истина;
    // Иначе
    //     Элементы.КнопкаВыполнитьРегламент.Доступность = Ложь;
    // КонецЕсли;
КонецПроцедуры

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

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

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

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

  3. Производительность: Размещение сложной логики проверки прав в ПриСозданииНаСервере может незначительно повлиять на скорость открытия формы. Для очень сложных случаев, когда внешний вид и функциональность формы сильно зависят от прав пользователя, иногда рекомендуется разрабатывать отдельные формы, специализированные под конкретные наборы прав, вместо того чтобы динамически изменять одну форму.

  4. Использование Видимость: Хотя мы сосредоточились на Доступность, свойство Видимость также существует. Если вы хотите полностью скрыть кнопку, чтобы она не занимала место на форме, вы можете использовать Видимость = Ложь. Однако для интерактивных элементов чаще предпочтительнее Доступность, так как она дает пользователю понять, что такая функция существует, но в данный момент недоступна.

Надеемся, что это подробное руководство поможет вам уверенно управлять видимостью и доступностью элементов в ваших 1С-решениях! Успехов в разработке!

← К списку