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

В этом примере запись разрешается редактировать тем, кто ее создал (или ответственный и пр.). Если редактирование запрещено, то и удаление запрещено.

Условие удаления

С помощью этого условия можно запретить удаление некоторых записей. Если условие истинно, то удаление разрешено.