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