Ограничения
Ограничения в платформе определяют, какие значения могут иметь первичные свойства, а какие нет. В общем случае, ограничение задается как свойство, значение которого всегда должно быть NULL
.
Фактически, ограничение это простое событие, в котором условием является ограничиваемое свойство, а обработкой - показ всех его не NULL
значений (в режиме асинхронного сообщения) и отмена сделанных изменений. Так же как и для простого события необходимо задать базовое событие, которое определяет, когда будет проверяться заданное ограничение.
По сравнению с реализацией через простые события у ограничений есть ряд дополнительных преимуществ:
- Для ограничений существует процедура глобальной проверки на уже работающей БД (по аналогии с техникой "перерасчета" в простых событиях, которая однако здесь не применима, так как в обработке содержится оператор отмены изменений)
- Ограничение понятнее и читабельнее, так как подчеркивает статичный / декларативный характер такого правила (то есть независимость от момента во времени) в отличие от простого события.
- Существует возможность использовать созданное ограничение при вызове диалогов изменения свойств, которые используются в этом ограничении. В этом случае в диалоге будет устанавливаться дополнительный фильтр, таким образом, чтобы при изменении значения свойства на выбранное значение не нарушить созданное ограничение.
Отметим, что в некоторых случаях вместо выдачи сообщения пользователю и отмены транзакции, необходимо, например, автоматически устранить нарушенное ограничение. В этом случае рекомендуется использовать простые ограничения, или, в случае когда это невозможно сделать, все те же простые события.
Показ сообщения
Для вывода всех не NULL
значений платформа использует автоматически создаваемую форму, состоящую из:
- одной группы объектов, объекты которой соответствуют параметрам ограничиваемого свойства.
- свойств, подходящих по классам и либо принадлежащих группе свойств
System.id
, либо явно указанных при создании ограничения. - фильтра равного ограничиваемому свойству.
- глобального сообщения, задаваемого разработчиком при создании ограничения.
Язык
Для создания ограничений используется инструкция CONSTRAINT
.
Примеры
// остаток не меньше 0
CONSTRAINT balance(Sku s, Stock st) < 0 MESSAGE 'Остаток не может быть отрицательным для ' +
(GROUP CONCAT 'Товар: ' + name(Sku ss) + ' Склад: ' + name(Stock sst), '\n' IF SET(balance(ss, sst) < 0) ORDER sst);
barcode = DATA STRING[15] (Sku);
// "эмуляция" политики безопасности
CONSTRAINT DROPCHANGED(barcode(Sku s)) AND name(currentUser()) != 'admin'
MESSAGE 'Изменять штрих-код для уже созданного товара разрешено только администратору';
sku = DATA Sku (OrderDetail);
in = DATA BOOLEAN (Sku, Customer);
CONSTRAINT sku(OrderDetail d) AND NOT in(sku(d), customer(order(d)))
CHECKED BY sku[OrderDetail] // будет применяться фильтр по доступным sku при выборе товара для строки заказа
MESSAGE 'В заказе выбран недоступный пользователю товар для выбранного покупателя';