Как восстановить видимость элемента формы, если пользователь скрыл его через «Изменить форму» в 1С?

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

В практике разработки на платформе 1С:Предприятие 8.3 нередко возникает ситуация: разработчик выводит на управляемую форму важную команду или кнопку, а пользователи через стандартное меню «Еще — Изменить форму» снимают с нее флажок видимости. Попытка принудительно восстановить кнопку при открытии формы кодом вида Элементы.ИмяКоманды.Видимость = Истина; ни к чему не приводит — элемент так и остается скрытым.

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

Почему не работает программная установка свойства Видимость

В управляемом интерфейсе 1С итоговое отображение любого элемента рассчитывается платформой автоматически путем наложения нескольких независимых слоев по логическому правилу «И»:

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

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

Рассмотрим рабочие варианты, позволяющие решить эту проблему.

Способ 1. Запрет изменения формы для пользователей

Самое надежное превентивное решение — ограничить пользователям возможность скрывать или перемещать элементы интерфейса. Для этого у управляемой формы предусмотрено специальное свойство РазрешитьИзменятьФорму.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Запрещаем пользователям открывать окно «Изменить форму»
    ЭтаФорма.РазрешитьИзменятьФорму = Ложь;
    
КонецПроцедуры

Когда свойство РазрешитьИзменятьФорму установлено в значение Ложь, в системном меню «Еще» пункт «Изменить форму» просто отсутствует. Пользователи физически не смогут отключить видимость нужных кнопок.

Способ 2. Точечное отключение команды «Изменить форму» по условию

Если необходимо запретить редактирование формы не всем пользователям, а только определенной группе (например, менеджерам, оставив такую возможность администраторам), можно скрыть стандартную команду управления формой из командной панели:


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

Способ 3. Очистка сохраненных пользовательских настроек формы

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

Все персональные варианты расположения и видимости элементов сохраняются в системной таблице базы данных. Мы можем удалить сохраненную настройку программно через объект ХранилищеСистемныхНастроек. Разберем пример процедуры для административного сброса настроек формы:


&НаСервере
Процедура СброситьНастройкиФормыПользователя(ИмяПользователя, ПолноеИмяФормы)
    
    // Ключ объекта для формы формируется с постфиксом /НастройкиФормы
    КлючОбъекта = ПолноеИмяФормы + "/НастройкиФормы";
    
    // Удаляем персональные настройки формы конкретного пользователя
    ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", ИмяПользователя);
    
КонецПроцедуры

В типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем) эту операцию можно выполнить без написания кода: перейдем в раздел «Администрирование — Настройки пользователей и прав — Персональные настройки пользователей — Очистка настроек», выберем нужного пользователя и очистим настройки для проблемного объекта.

Способ 4. Динамическое создание элемента с новым именем

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем кнопку с уникальным именем программно
    НоваяКнопка = Элементы.Добавить("КнопкаДобавитьФайл_Фикс", Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель);
    НоваяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
    НоваяКнопка.ИмяКоманды = "ДобавитьФайл";
    НоваяКнопка.Заголовок = "Добавить файл";
    
КонецПроцедуры

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

← На главную