При настройке прав и интерфейсов пользователей часто возникает задача ограничить изменение данных в документе. Если установить свойство ЭтаФорма.ТолькоПросмотр = Истина, платформа полностью запретит изменение любых данных на форме. Однако нередко требуется заблокировать 60–70 реквизитов, оставив доступными для редактирования лишь два-три конкретных поля (например, комментарий, статус согласования или дату контроля).
Разберем основные подходы к решению этой задачи: от программного обхода элементов интерфейса до визуальной группировки и создания специализированных форм.
Самый прямой путь, когда на форме расположено множество полей, — это перебор коллекции элементов в цикле при открытии формы с отключением их доступности или установкой режима только для чтения, исключая разрешенные реквизиты.
Рассмотрим пример кода для обычных форм (коллекция ЭлементыФормы), где разрешено редактирование только полей НазваниеЗаказа и Дата:
СписокРазрешенных = Новый Соответствие;
СписокРазрешенных.Вставить("НАЗВАНИЕЗАКАЗА", Истина);
СписокРазрешенных.Вставить("ДАТА", Истина);
Для Каждого Элемент Из ЭтаФорма.ЭлементыФормы Цикл
ИмяЭлемента = ВРег(Элемент.Имя);
// Пропускаем разрешенные реквизиты
Если СписокРазрешенных[ИмяЭлемента] <> Неопределено Тогда
Элемент.Доступность = Истина;
Иначе
// Отключаем доступность остальных полей
Элемент.Доступность = Ложь;
КонецЕсли;
КонецЦикла;
Разберем частую ошибку при написании условий: если используется функция ВРег() для приведения имени элемента к верхнему регистру, строка сравнения также должна быть записана заглавными буквами. Сравнение вида ВРег(Элемент.Имя) = "НазваниеЗаказа" всегда вернет Ложь, так как левая часть приведена к регистру "НАЗВАНИЕЗАКАЗА".
При управлении элементами интерфейса важно учитывать различие между двумя свойствами:
Если требуется оставить возможность копирования информации, предпочтительнее программно устанавливать свойство ТолькоПросмотр = Истина у конкретных элементов формы (полей ввода, таблиц).
Чтобы избежать обхода коллекций в цикле, можно оптимизировать структуру формы в конфигураторе:
Элементы.ГруппаОсновныхРеквизитов.ТолькоПросмотр = Истина;
При отключении доступности или включении режима просмотра для группы свойство автоматически унаследуют все дочерние элементы управления, расположенные внутри нее.
Важное предостережение: если разрешенный элемент находится внутри родительской группы, у которой установлено Доступность = Ложь, он останется недоступным, даже если явно присвоить ему Элемент.Доступность = Истина.
Если документ содержит большое количество реквизитов и сложную логику проведения, открытие основной формы с точечным разрешением полей может привести к случайному перепроведению документа и созданию избыточной нагрузки на базу данных.
В таких случаях эффективнее создать небольшую вспомогательную обработку или отдельную форму:
Если требования к списку разрешенных полей часто меняются или зависят от роли пользователя, жестко прописывать имена реквизитов в коде не рекомендуется. Проанализируем более гибкие варианты:
ТабличныйДокумент со списком имен реквизитов и флагами доступности. При открытии код считывает макет и настраивает видимость. Это позволяет корректировать логику без изменения программного кода.ТипДокумента - ИмяРеквизита - РольПользователя - Разрешено. При открытии документа форма обращается к регистру и динамически применяет ограничения.