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