Как программно скрыть кнопку Изменить форму в управляемых формах 1С 8.3

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

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

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

Метод 1. Использование прав доступа (Штатный механизм платформы)

Прежде чем приступать к написанию кода, проанализируем штатные возможности платформы. Видимость кнопки Изменить форму и сопутствующей ей команды Настройка списка напрямую зависит от наличия у пользователя права Сохранение данных пользователя (SaveUserData).

Рассмотрим, как это работает:

  1. Если в наборе ролей пользователя отсутствует право Сохранение данных пользователя, платформа автоматически скрывает пункты настройки интерфейса.
  2. Это происходит потому, что без этого права система не может записать персональные настройки (хранилище настроек) для данного пользователя.

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

Метод 2. Программное скрытие элемента формы

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

Платформа 1С генерирует имя для стандартной кнопки Изменить форму по определенному шаблону. Если используется стандартная автокомандная панель, имя элемента будет ФормаИзменитьФорму. Проанализируем пример кода, который можно разместить в процедуре ПриСозданииНаСервере:


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

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

Метод 3. Реализация через расширение конфигурации

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

Выполним следующие шаги:

  1. Создадим новое расширение или откроем существующее.
  2. Найдем нужную форму (например, ФормаСписка документа РеализацияТоваровУслуг) и добавим её в расширение.
  3. Для процедуры ПриСозданииНаСервере создадим обработчик с аннотацией &После.

Посмотрим на пример реализации в расширении:


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

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

Метод 4. Обход коллекции элементов (Универсальный способ)

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

Рассмотрим алгоритм универсального поиска:


&НаСервере
Процедура СкрытьКнопкуИзменитьФормуУниверсально(КоманднаяПанель)
    
    Для Каждого Элемент Из КоманднаяПанель.ПодчиненныеЭлементы Цикл
        // Проверяем, является ли элемент кнопкой и привязан ли он к стандартной команде
        Если ТипЗнч(Элемент) = Тип("КнопкаФормы") Тогда
            Если СтрНайти(Элемент.ИмяКоманды, "ИзменитьФорму") > 0 Тогда
                Элемент.Видимость = Ложь;
            КонецЕсли;
        ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
            // Рекурсивно заходим в подменю, если это необходимо
            СкрытьКнопкуИзменитьФормуУниверсально(Элемент);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Этот метод позволяет найти команду ИзменитьФорму, даже если она глубоко вложена в подменю или имеет нестандартное имя элемента, так как свойство ИмяКоманды у стандартных кнопок обычно остается неизменным.

Риски и предостережения

Проанализируем возможные проблемы при использовании программного скрытия:

Заключение

Мы выяснили, что наиболее сбалансированным решением является использование расширения конфигурации с программным поиском элемента ФормаИзменитьФорму в процедуре ПриСозданииНаСервере. Это обеспечивает необходимую гибкость (скрытие по условию или роли) и не нарушает общую логику работы системы 1С:Предприятие.

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

← На главную