Перейти к содержимому

Скип-логика и автозаполнение

Форма не обязана показывать все поля всем и всегда. Два инструмента делают её «живой»: скип-логика (условия отображения) показывает поле или раздел только тогда, когда это уместно, а автозаполнение (деривации) заполняет вычисляемые поля само — без ручного ввода. И то и другое настраивается в конструкторе CRF и живёт в версии дизайна вместе с формами.

0:000:00
Логика формы в конструкторе: проверки и автозаполнение на одном языке выражений.

У поля или раздела в инспекторе конструктора задаётся Условие отображения — выражение от других полей той же формы. Правило простое: истина — элемент виден, ложь — скрыт, пустое условие — виден всегда.

Классический пример: поле «Если да — уточните» видно только при ответе «Да» в соседнем поле. Координатор видит короткую форму, пока условия не раскроют дополнительные поля.

PREGNANT == 'Y'

Условие можно собрать визуально — строками «поле — оператор — значение»: для полей-дат операторы читаются словами (раньше · не позже · позже · не раньше), а сравнивать поле можно не только с константой, но и с другим полем формы. Сложное условие задаётся формулой в расширенном режиме.

  • Скрытое поле не считается незаполненным: оно не мешает завершить форму, и проверка «поле обязательно» по нему не срабатывает. Скрытый раздел скрывает все свои поля.
  • Условия пересчитываются мгновенно — прямо во время ввода, без сохранения.

Скип-логика никогда не удаляет данные молча. Если значение было введено, а потом ответ в управляющем поле изменился и поле скрылось, значение остаётся в базе, а координатор видит предупреждение: «Скрыто условием, но содержит значение».

Дальше решает человек, а не система: кнопка «Очистить (с причиной)» очищает значение — с обязательной причиной, записью в аудиторский след и обычными последствиями правки данных. Либо координатор возвращает управляющий ответ — и поле снова видно вместе со значением.

Деривация — это правило «поле вычисляется из других полей»: например, ИМТ из роста и веса. Такие правила заводятся в блоке Автозаполнение вкладки Логика конструктора: выбираете целевое поле и пишете выражение. Готовое автозаполнение правится на месте — клик по нему открывает редактор.

round(num(WEIGHT) / (num(HEIGHT) * num(HEIGHT)), 1)

Как это работает при вводе:

  • целевое поле помечено бейджем «автозаполняется» и закрыто для ручного ввода — значение подставляет система;
  • расчёт происходит мгновенно при вводе исходных полей — координатору не нужно ничего нажимать;
  • пока исходные поля пусты, вычисляемое поле остаётся пустым.

Условия отображения, автозаполнение и правила проверки пишутся на одном компактном языке выражений. Поля адресуются по их OID; доступны сравнения (==, !=, <, <=, >, >=), арифметика (+, -, *, /) и связки and / or / not.

Функция Что делает
is_empty(x) истина, если поле пустое
num(x) числовое значение поля
days_between(a, b) число дней между двумя датами
round(x, n) округление до n знаков
ref('ФОРМА', 'ПОЛЕ') значение поля другой формы
ref('ВИЗИТ', 'ФОРМА', 'ПОЛЕ') то же с уточнением визита — для межформенных проверок

Смысл «истины» зависит от того, где выражение используется:

Где используется Истина означает
Правило проверки нарушение — проверка сработала (блокировка или запрос)
Условие отображения элемент виден
Автозаполнение не условие, а формула — её результат записывается в целевое поле

Редактор в конструкторе проверяет выражение на лету: под полем сразу видно «Выражение корректно» или конкретную ошибку, а также список полей, от которых выражение зависит. Битые выражения не пройдут и отправку версии на ревью.