Скрипт ограничения значения атрибутов типа "Дата" и "Дата/время"

Описание скрипта

Скрипт предназначен для ограничения значения атрибутов типа "Дата" и "Дата/время":

  • При вводе даты с помощью Календаря для выбора доступны только даты, определенные как допустимые в скрипте. Недоступные для выбора даты подсвечиваются серым.
  • При вводе даты вручную, если введенная дата не удовлетворяет заданному в скрипте условию, то выводится сообщение об ошибке, определенное в скрипте.

Место настройки скрипта

Форма добавления атрибута типа "Дата" или "Дата/время" (параметр "Дополнительное ограничение на ввод даты" = ограничение скриптом).

Когда выполняется скрипт

Результат выполнения скрипта

Скрипт возвращает карту предикатов и сообщений для поля:

[
(somePredicate1) : 'somMessage1',
(somePredicate2) : 'somMessage2'
]

Переменные и их значения

Переменные контекста:

  • subject — текущий изменяемый на форме объект (значения полей формы, на которой присутствует атрибут; значения атрибутов текущего объекта, которые были на момент открытия формы).
  • attrCode — код атрибута, в котором определен скрипт.
  • changedAttributes — список кодов атрибутов, значения которых изменились при редактировании объекта (в данном случае всегда один).
  • origin — тип месторасположения.

    Переменная не поддерживается в мобильном приложении.

    Возможные значения:

    • readForm (форма для чтения) — скрипт вычисляется на карточке объекта, на сложной форме добавления и редактирования связей (расширенная форма редактирования), в списке по ссылке на отдельной странице, в списке на странице результатов поиска, при нажатии на кнопку вызова действий в строке списка;
    • addForm — скрипт вычисляется на форме добавления, на быстрой форме добавления;
    • editForm — скрипт вычисляется на форме редактирования объекта, на форме редактирования атрибутов, вызванной из контента "Параметры объекта", на форме редактирования в ячейке списка, на форме быстрого редактирования, на форме массового редактирования, на форме смены типа; на форме смены ответственного, на форме смены привязки (переклассификации), на форме работы с массовостью (управление массовостью запроса), на форме смены статуса, на форме перемещения (смены родителя);
    • addFormComment/editFormComment — скрипт вычисляется на форме добавления/редактирования комментария;
    • addFormFile/editFormFile — скрипт вычисляется на форме добавления/редактирования файла.

Список доступных методов

  • after(Date date, boolean useTime) — проверяет, что дата/время больше указанной;
  • before(Date date, boolean useTime) — проверяет, что дата/время меньше указанной;
  • between(Date from, Date to, boolean useTime) — проверяет, что дата/время находится в диапазоне между указанными;
  • dayOfWeek(dayOfWeek) — проверяет соответствие дня недели (1 - воскресенье... 7 - суббота);
  • equals(Date date, boolean useTime) — проверяет, что дата/время соответствует указанной;
  • in(List<Date> dates, boolean useTime) — проверяет, что дата соответствует одной из указанных;
  • inTime(Long from, Long to) — проверяет, что дата/время соответствует временному периоду, например, с 9:00 по 17:00

Для атрибутов типа "Дата" необходимо учитывать, что в языке программирования java дата часто представлена в виде ДД.ММ.ГГГГ 00:00:00. Для удобства в api предусмотрен дополнительный параметр useTime, позволяющий сформировать предикат без учета времени. Если параметр не указан, то формируется предикат не учитывающий время.

Значение параметра useTime:

  • false (по умолчанию) — сформировать предикат не учитывающий время;
  • true — сформировать предикат учитывающий время.

Все методы работы с датами описаны в разделе api.date Работа с датами.

Примеры скрипта

1. Скрипт для ограничения значения пользовательского атрибута типа "Дата" только значениями в будущем:

// БЛОК ИНИЦИАЛИЗАЦИИ --------------------------------------
if (!subject)
{
return [];
}
//ОСНОВНОЙ БЛОК----------------------------------
def filter = api.date.filter();
return [(filter.after(new Date())) : 'Значением может быть только дата в будущем'];

2. Скрипты для возможности настроить ограничение в двух атрибутах типа "Дата" так, чтобы один атрибут был меньше или равен другому. В примере используются пользовательские атрибуты типа "Дата": "Дата начала" (beginDate) и "Дата окончания" (endDate).

Скрипт в настройках атрибута "Дата начала" (beginDate):

//ПАРАМЕТРЫ--------------------------------------
//Код атрибута "Дата окончания”
def END_DATE = 'endDate'
// БЛОК ИНИЦИАЛИЗАЦИИ --------------------------------------
if (!subject)
{
return [END_DATE];
}
//ОСНОВНОЙ БЛОК----------------------------------
def filter = api.date.filter();
return [(filter.before(subject.endDate)) : "Значение не может быть больше значения атрибута Дата окончания."];

Скрипт в настройках атрибута "Дата окончания" (endDate):

//ПАРАМЕТРЫ--------------------------------------
//Код атрибута типа "Дата начала”
def BEGIN_DATE = 'beginDate'
// БЛОК ИНИЦИАЛИЗАЦИИ --------------------------------------
if (!subject)
{
return [BEGIN_DATE];
}
//ОСНОВНОЙ БЛОК----------------------------------
def filter = api.date.filter();
return [(filter.after(subject.beginDate)) : "Значение не может быть меньше значения атрибута Дата начала."]

3. Ограничение пользовательского атрибута типа “Дата и время” выбором значения только в будущем и по определенным дням недели (пн, ср, пт).

// БЛОК ИНИЦИАЛИЗАЦИИ --------------------------------------
if (!subject) {
return [];
}
//ОСНОВНОЙ БЛОК----------------------------------
def filter = api.date.filter();
def predicate = filter.with {
and(or(dayOfWeek(2), // понедельник
dayOfWeek(4), // вторник
dayOfWeek(6) // среда
), and(after(new Date())))
}
return [(predicate): 'Допустимо выбирать только в пн, ср, пт.']

4. Пример работы параметра useTime на примере метода after.

def filter = api.date.filter();
def myDate = new Date();// Текущая дата
return [(filter.after(myDate, true)) : 'Значение должно быть позднее текущей даты (и времени, если useTime: true)']

Метод after позволяет при выборе даты указать только ту дату, которая будет позднее даты, переданной в параметр (в данном случае текущей).

Параметр useTime определяет, будет ли при фильтрации учитываться время (true — при фильтрации будет учитывать время, false — при фильтрации время не учитывается).

Например: текущие дата и время — 21.04 12:00,

  • filter.after(myDate, true) — useTime: true

    При фильтрации можно выбрать время 21.04 12:01 и позже.

    Время 21.04 11:00 не доступно для выбора, так как время тоже учитывается при фильтрации.

  • filter.after(myDate) — useTime: false

    При фильтрации можно выбрать любое время позднее 21.04 00:00 независимо от текущего, поскольку время не учитывается при фильтрации.