Содержание
11.2. Настройка роли
Настройка прав доступа к формам влияет на их видимость в программе, а также на операции добавления, редактирования и удаления. Доступны следующие права доступа:
- Полный доступ - доступны все операции: добавление, редактирование, удаление.
- Только редактирование - можно только просматривать и редактировать существующие записи.
- Только просмотр - можно только просматривать записи.
- Нет доступа - форма невидима в интерфейсе программы.
Настройка доступа к форме влияет на дочерние формы. Если форму нельзя редактировать, то дочерние формы также нельзя редактировать.
Доступ к форме может быть ограничен на уровне компонентов. В окне «Роль» дважды щелкните по ячейке последнего столбца, чтобы открыть окно настройки.
К компоненту может быть полный доступ (выбрано «редактирование»), только просмотр, нет доступа. В последнем случае на месте компонента рисуется прямоугольник.
Можно более тонко настроить доступ к записям с помощью условий отбора, редактирования и удаления.
Условие отбора
Условие отбора позволяет ограничить доступный пользователю набор данных.
Все нижеописанное про фильтр относится к запросам, отчетам, объектам, спискам, заметкам, условию отбора.
Фильтр записывается в виде простого текста, напоминающего логическое выражение. Например:
[!Статус]='Выдано' | [!Статус]='Готово'
Помните, что несмотря на сходство с выражениями, фильтр составляется по следующим правилам. Слева пишется поле формы-источника, затем операция сравнения (=, <>, < и т. д.), затем выражение. Условия могут соединятся логическими операциями & - И, | - ИЛИ. Если в самом выражении есть символы & и |, то выражение должно браться в круглые скобки.
В фильтре запроса и отчета в качестве поля источника может быть поле родительской или подчиненной формы. Поля родительской формы обозначаются восклицательным знаком перед именем поля, поля подчиненной формы записываются без восклицательного знака. В условии отбора и фильтре списков возможно обращение только к основной форме. при этом наличие восклицательного знака перед именем поля значения не имеет. Если поле источника является объектом, то можно обратиться к полю объекта. Глубина вложений объектов не ограничена. Например:
[!счет|закрыт]=0
Операции сравнения применяются те же, что и в выражениях, плюс добавляется еще несколько операций, которые можно использовать только в фильтрах (==, #, in, notin - о них чуть ниже).
Операции =, <>, >, >=, <, <= допустимо применять к числовым полям, дате, времени, флажкам. К тексту допустимо применять все операции сравнения. К объектам применяются операции =, <>. Операции in и notin можно применять к полям любых типов. Ниже в таблице наглядно показано какие операции допустимо применять к полям разных типов.
Тип поля | = | <> | > | >= | < | <= | == | # | in | notin |
---|---|---|---|---|---|---|---|---|---|---|
Число | * | * | * | * | * | * | * | * | ||
Дата | * | * | * | * | * | * | * | * | ||
Время | * | * | * | * | * | * | * | * | ||
Счетчик | * | * | * | * | * | * | * | * | ||
Флажок | * | * | * | * | * | * | * | * | ||
Объект | * | * | * | * | ||||||
Текст | * | * | * | * | * | * | * | * | * | * |
Заметка | * | * | * | * | * | * | * | * | * | * |
Список | * | * | * | * | * | * | * | * | * | * |
Изображение | * | * | * | * | * | * | * | * | * | * |
Файл | * | * | * | * | * | * | * | * | * | * |
Глядя на таблицу, можно заметить, что для файлов и изображений применимы те же операции, что и для текстовых полей. Это связано с тем, что файлы и изображения в фильтре рассматриваются как текстовые поля. Но на самом деле программа ищет не в самих файлах, а в дополнительных полях, которые связаны с файлами и изображениями. Так для файлов, это поле на форме, куда вставляется имя файла, когда вы выбираете файл. Для изображений - это поле, которое хранит исходное расположение файла изображения.
Думаю, нет смысла останавливаться на стандартных операциях сравнения, они достаточно очевидны. Давайте рассмотрим дополнительные операции, которые доступны только в фильтрах.
Операция ==
Операция ==
применяется для поиска записей, в которых встречается указанный фрагмент текста. Указанный фрагмент может быть в начале, в конце, в середине текста, причем регистр не имеет значения. Например, ищем записи, в которых поле «комментарий» содержит текст «позвонить»:
[!Комментарий]=='позвонить'
Это вполне может быть поле объекта:
[Товар|Наименование]=='samsung'
Операция #
Операция #
противоположна операции ==
. Этот знак говорит программе найти все записи с текстом, в котором не содержится указанный фрагмент.
Операция in
Операция in
позволяет искать все записи, содержащие значения из списка. Список задается в виде текста, значения разделяются точкой с запятой. Например:
[!статус] in 'Новый;в работе;готов'
Будут найдены все записи, в которых поле «статус» равен или «Новый», или «В работе», или «Готово». Данный фильтр аналогичен следующему фильтру:
[!статус]="Новый" | [!статус]="В работе" | [!статус]="Готов"
Но есть и существенное отличие - операция in
не чувствительна к регистру символов. Кроме того, операция in
позволяет сравнивать с произвольным набором значений. Например, список значений может быть задан в каком-нибудь поле:
[Товар|Группа] in [выбранные группы]
Операцию in
можно использовать не только для текстовых полей, но и для объектов, чисел, дат и любых других типов полей. Значения также задаются в виде текста и отделяются точкой с запятой. Например:
[!объект] in "4;6;12;553;73;;99" [!дата] in "01.02.2021;01.03.2021;01.04.2021" [!время] in "10:00;12:00;14:00;16:00"
Среди значений могут присутствовать пустые значения (как в первой строчке примера) - они интерпретируются как Null. Если весь список состоит из пустых значений или не содержит значений вообще, то значением будет считаться Null.
Практическое применение операции in
В простых формах для фильтрации по произвольному набору значений можно использовать связку: таблица - поле - MERGE (MERGEX) - in. Т. е. добавляете таблицу. В таблицу добавляете поле того же типа, что и поле, по которому фильтруются данные (хотя тип необязательно должен совпадать). Например, пусть это будет объект «Группа». В родительскую форму вставляете текстовое поле «Выбранные группы» и пишите выражение:
MERGEX('таблица', '[группа]', ';')
В фильтре пишите:
[Товар|Группа] in [выбранные группы]
Еще можно использовать заметку с настроенным источником. Здесь еще проще. Вставляете заметку, указываете форму-источник, меняете разделитель на ;
(без пробелов), указываете заметку в фильтре:
[Товар|Группа|Наименование] in [Заметка]
Но заметка не позволяет фильтровать по объектам, также запрос будет реагировать на изменения в заметке, только после выхода из нее.
Операция NotIn
Операция notin
противоположна операции in
- будут найдены все записи, за исключением записей с перечисленными значениями.
Фильтрация значений Null
Значение Null может быть задано в фильтре в явном виде или являться результатом вычисления выражений. Любая операция сравнения с Null будет аналогична операции =
, кроме операций #
и notin
- они будут аналогичны операции <>
. Например, если задан такой фильтр:
[число]>=Null
то будут отобраны все записи со значением Null. Еще пример:
[статус] in [заметка]
Если поле «заметка» пустое (т. е. равно Null), то будут отобраны все записи с пустым полем «статус».
Необязательные поля в фильтре
В фильтрах можно использовать необязательные поля. Если значение такого поля равно Null, то оно исключается из фильтра. Для этого перед именем поля ставится ?
(вопросительный знак). Например:
[?!клиент]=getvar('заказчик') & [!статус]='Готово'
Если переменная «заказчик» равна Null, то условие исключается из выражения.
Изменение приоритета условий фильтра
Условия фильтра можно брать в фигурные скобки, чтобы изменить их приоритет. Например:
{[!устройство]='Принтер' | [!устройство]=null} & {[!марка]='Canon' | [!марка]=null}
Логическая операция |
имеет более низкий приоритет, чем операция &
, поэтому условия надо взять в фигурные скобки.
Ошибки фильтра
В процессе анализа фильтра могут быть найдены следующие ошибки:
Ошибка | Описание |
Поле источника не найдено | Программа не может найти указанное поле в форме-источнике. Проверьте правильность ввода имени поля. |
Ожидается поле источника | Ошибка возникает, когда не соблюдаются правила написания фильтра. Часто начинающие разработчики путают фильтр с обычным выражением и пишут слева от операции сравнения выражение (например, функцию), а должно быть поле формы-источника. |
Неверная операция сравнения | Допустимы следующие операции сравнения: = <> < <= > >= == #. |
Ожидается операция сравнения | Не соблюден синтаксис написания фильтра. После поля источника программа ожидает операцию сравнения. |
Выражение не распознано | Выражение (справа от операции сравнения) содержит недопустимые символы. |
Ошибка в выражении | Выражение содержит какую-то ошибку (программа сообщает какую именно). |
Тип поля формы-источника не совместим с типом результата вычисления выражения | Убедитесь, что тип поля формы-источника совпадает с типом результата вычисления выражения. Например, ошибка возникнет, если попытаться сравнить поле «объект» с текстом. |
Ожидается логическая операция | Пропущена логическая операция между двумя условиями фильтра. |
Ожидается символ { | Пропущена одна или более фигурных скобок {. Ошибка возникает, когда число закрывающих фигурных скобок } больше чем открывающих. |
Ожидается символ } | Пропущена одна или более фигурных скобок }. Ошибка возникает, когда число открывающих фигурных скобок { больше чем закрывающих. |
Недопустимое поле источника | В качестве поля-источника нельзя использовать изображение, файл и поле объекта (компонент). |
Применение условия отбора к объектам
Условие отбора не влияет на содержимое выпадающего списка объектов. Чтобы содержимое выпадающего списка объектов соответствовало условию отбора формы, на которую они ссылаются, поставьте флажок напротив соответствующей формы в окне «Роль» в предпоследнем столбце (называется «применить условие отбора к объектам»). Число элементов списка может быть меньше, чем задано условием отбора, если в объекте используется еще и фильтр списка.
Условие редактирования
С помощью условия на редактирование можно запретить изменение некоторых записей. Если условие истинно, то запись редактировать разрешено. Если редактирование записи главной формы запрещено, то также запрещено добавлять и редактировать данные в таблицах. Пример:
[Сотрудник|Имя]=user
В этом примере запись разрешается редактировать тем, кто ее создал (или ответственный и пр.). Если редактирование запрещено, то и удаление запрещено.
Условие удаления
С помощью этого условия можно запретить удаление некоторых записей. Если условие истинно, то удаление разрешено.