Функция для настройки доступности реквизитов на форме

14 3

Одна из распространенных задач при разработке новых справочников и карточек документов - гибкая настройка доступности реквизитов в зависимости от некоторых условий. Условия могут быть самые разные - от комбинации значений реквизитов самой записи справочника или документа, до вхождения текущего пользователя в определенные группы или роли.

Для решения этой задачи, предлагаю следующую функцию:

BRDFormControlAccess(ControlObject: Object; ReqEnabled: Array; ReqDisabled: Array; DisableRequisites: Boolean)

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

Если один из параметров ReqEnabled или ReqDisabled равен "ALL", то отработка его будет выполняться раньше отработки параметра со списком реквизитов. При равнозначных параметрах включение контролы отрабатывает раньше выключения, т.е. выключение доминирует. Если данные параметры равны NULL, то такой параметр не учитывается, например, ReqEnabled = NULL означает, что функция не будет включать никаких реквизитов.

Параметр DisableRequisites определяет действие, которое нужно сделать с реквизитами - управлять свойством ReadOnly (при значении DisableRequisites = FALSE) или Enabled (при значении DisableRequisites = TRUE). При этом, ReadOnly позволяет пользователю зайти в поле реквизита курсором и скопировать значение. Свойство Enabled способно отключить реквизит так, что он будет виден на форме, но зайти в него будет нельзя.

Например, включить все реквизиты, кроме "Дополнение" и "Состояние" - их выключить:

BRDFormControlAccess(ControlObject; "ALL"; ArrayOf("Дополнение"; "Состояние"); FALSE)

или - включить реквизит "Состояние" при этом не изменять доступность других реквизитов:

BRDFormControlAccess(ControlObject; ArrayOf("Состояние"); NULL; FALSE)

В пакет разработки входит так же служебная функция BRDGetControlsByRequisite, которую использует BRDFormControlAccess.

Разработка для DIRECTUM 4.6: ДоступностьКонтроловФормы.zip (4,89 Кб)

14
Авторизуйтесь, чтобы оценить материал.
1
Alexey Okishev

Есть несколько замечаний:

1. Ф. BRDFormControlAccess блокирует все реквизиты табличных частей, даже если в массиве переданных реквизитов была только часть реквизитов табличной части.

2. Ф. BRDFormControlAccess не учитывает реквизиты, которые были установлены на чтение в разработке справочника или типа карточки. Т.е. использование константы ALL для включения доступности будет некорректным. Нужно хотя бы в справке отразить данный нюанс.

Денис Баранов

1. Спасибо, исправил. Теперь в табличных частях тоже работает корректно.

2. Ну да, реквизиты включаются и выключаются независимо от того, read only он в разработке формы или нет. Иначе и не сделать, вроде бы. Т.к. если парсить для получения этих данных саму форму, то работать функция будет значительно медленнее. Отметил этот момент в справке. По-моему, это вполне логичное поведение - если ты хочешь включить или выключить реквизиты, то тогда не имеет значение, что ты в редакторе форм настроил, тут уже кодом будет управляться доступность. Если учитывать еще и то, что настроено в редакторе - это только путаницы и головной боли разработчику добавит.

Андрей Рязанцев

Хм... а я то все отдельными строчками оформлял... в итоге доступность/недоступность дюжины реквизитов определяется 30 строчками кода... брррр.... и хде ты был раньше?!

Авторизуйтесь, чтобы написать комментарий