Как сделать кнопки на форме 1С неактивными или скрыть их программно?

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

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

Разберем основы: Обычные vs Управляемые формы

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

  1. Обычные формы (толстый клиент): Для обращения к элементам используется объект ЭлементыФормы. Например: ЭлементыФормы.ДействияФормы.Кнопки.ИмяКнопки.
  2. Управляемые формы (тонкий/веб-клиент): Здесь всё упрощено, и мы обращаемся к коллекции Элементы. Например: Элементы.ИмяКнопки.

Если в вашем коде фигурирует ЭлементыФормы, а вы работаете на платформе 8.3 в интерфейсе "Такси", это может стать источником проблем. Выясним причину, почему после точки не всплывают подсказки Доступность или Видимость. Это происходит из-за того, что коллекция кнопок является динамической, и конфигуратор на этапе написания кода "не знает", какой именно объект будет находиться в этой коллекции в момент исполнения. В таких случаях нужно писать имя свойства вручную, соблюдая регистр.

Способ 1: Управление доступностью кнопок

Рассмотрим самый популярный вариант, когда кнопка должна остаться на форме, но стать "серой" (неактивной). Это лучший вариант с точки зрения UX, так как пользователь видит наличие функционала, но понимает, что сейчас он ему недоступен.

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


Если РольДоступна("ОператорТорговогоОбъединения") Тогда
    // Для обычных форм
    ЭлементыФормы.ДействияФормы.Кнопки.БУ.Доступность = Ложь;
    ЭлементыФормы.ДействияФормы.Кнопки.ОФУ.Доступность = Ложь;
КонецЕсли;

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

Способ 2: Полное скрытие элементов через Видимость

Если бизнес-логика требует, чтобы пользователь вообще не знал о существовании кнопки (например, кнопка удаления или перехода в настройки), мы используем свойство Видимость. Разберем по шагам, как это работает на управляемых формах:


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

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

Способ 3: Метод "Прибить ИмяКоманды"

Рассмотрим более экзотический, но эффективный способ, упомянутый опытными разработчиками — очистку имени команды. Каждая кнопка на управляемой форме связана с какой-то командой. Если мы программно разорвем эту связь, кнопка автоматически станет недоступной.

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


Кнопка = Элементы.Найти("БУ");
Если Кнопка <> Неопределено Тогда
    Кнопка.ИмяКоманды = ""; // "Прибиваем" команду
КонецЕсли;

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

Способ 4: Удаление кнопок из коллекции

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

Нужно обязательно проверять, существует ли кнопка перед её удалением. Проанализируем правильную структуру:


кнБУ = ЭлементыФормы.ДействияФормы.Кнопки.Найти("БУ");
Если кнБУ <> Неопределено Тогда
   ЭлементыФормы.ДействияФормы.Кнопки.Удалить(кнБУ);
КонецЕсли;

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

Рекомендации по оптимизации: Функциональные опции

Писать проверку ролей в коде каждой формы — это трудоемкий процесс, который сложно поддерживать (так называемый hardcode). Рассмотрим альтернативу: Функциональные опции.

  1. Создайте в конфигураторе Константу или ПараметрСеанса (например, "ИспользоватьБухгалтерскиеКнопки").
  2. Создайте объект Функциональная опция и привяжите её к этой константе.
  3. В составе функциональной опции укажите нужные вам кнопки на конкретных формах.

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

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

← На главную