Настроить скип-логику и автозаполнение
Форма не обязана показывать все поля всем и всегда. Скип-логика (условия отображения) показывает поле или раздел только тогда, когда это уместно, а автозаполнение (деривации) заполняет вычисляемые поля само — без ручного ввода. Оба инструмента настраиваются в конструкторе CRF и живут в версии дизайна вместе с формами.
Кому и когда
Заголовок раздела «Кому и когда»Дата-менеджер — дизайнер исследования (Study Builder) или
дата-менеджер с правом «править версию дизайна» (studyversion.update). Логика
вступит в силу после того, как версию утвердит и опубликует другой человек.
Задача возникает при сборке формы: когда часть вопросов нужна только при определённом ответе («Если да — уточните») или значение вычисляется из других (ИМТ из роста и веса).
Перед началом
Заголовок раздела «Перед началом»- Версия дизайна — Черновик.
- Управляющие поля уже есть в той же форме: условие отображения читает только поля своей
формы. Исходные поля автозаполнения могут быть и в другой форме — тогда формула берёт их
ссылкой
ref(…)того же визита. - Целевое поле автозаполнения не отмечено Обязательным и не лежит в журнале (повторяющемся разделе).
Показать поле по условию
Заголовок раздела «Показать поле по условию»-
В конструкторе выберите поле или раздел, который нужно показывать не всегда.
-
В инспекторе Свойства найдите Условие отображения (по умолчанию — «Видно всегда — условия нет») и нажмите + Добавить условие.
-
Соберите условие строками «поле — условие — с чем сравнивать»; для полей-дат условия читаются словами (раньше · не позже · позже · не раньше), сравнивать можно и с другим полем формы. Сложное условие задайте формулой в Расширенном режиме (формула), например:
PREGNANT == 'Y' -
Убедитесь, что под условием написано «Выражение корректно». Истина — элемент виден, ложь — скрыт. Рядом с полем в структуре формы появится признак условие.
Сделать поле вычисляемым
Заголовок раздела «Сделать поле вычисляемым»-
В конструкторе откройте форму и перейдите на вкладку Логика.
-
В блоке Автозаполнение нажмите Добавить автозаполнение.
-
Выберите Целевое поле — оно станет вычисляемым: значение подставляется автоматически, ручной ввод закрывается.
-
Впишите Выражение; поле можно вставить из списка Вставить поле (поле другой формы вставляется ссылкой
ref(…)того же визита). Например, ИМТ:round(num(WEIGHT) / (num(HEIGHT) * num(HEIGHT)), 1) -
Убедитесь, что под выражением написано «Выражение корректно», и нажмите Создать.
Готовое автозаполнение правится на месте — клик по нему открывает редактор. Проверьте условия и формулы в превью: там они работают как при реальном вводе, но данные не сохраняются.
Что произойдёт
Заголовок раздела «Что произойдёт»- Правка сохраняется в черновике и пишется в аудиторский след («Изменено поле», «Создано автозаполнение» в хронике изменений дизайна).
- После публикации версии при вводе:
- условия пересчитываются мгновенно, без сохранения; скрытое поле не считается незаполненным — оно не мешает завершить форму, и проверка «поле обязательно» по нему не срабатывает; скрытый раздел скрывает все свои поля;
- вычисляемое поле помечено автозаполняется, закрыто для ручного ввода и пересчитывается сразу при вводе исходных полей; пока исходные пусты, оно пустое.
- Если поле скрылось, а значение в нём уже было, значение остаётся, а координатор видит предупреждение «Скрыто условием, но содержит значение» и кнопку Очистить (с причиной).
- Пересчёт вычисляемого поля — это изменение данных: верификация SDV по нему сбрасывается, а покрывающие подписи получают статус Инвалидирована и требуют переподписания.
Если не получилось
Заголовок раздела «Если не получилось»- «Условие видимости использует только поля этой формы — ref() здесь недоступен» — условие отображения не читает другие формы; перенесите управляющий вопрос в эту форму.
- «Условие не может ссылаться на само поле» — управляющим должно быть другое поле.
- «Условие не может зависеть от заслеплённого поля» — слепое поле не может управлять видимостью: это раскрыло бы его значение.
- «У поля „…“ уже есть формула» — у целевого поля может быть только одно автозаполнение; измените существующее.
- «Формулы ссылаются друг на друга по кругу» — разорвите цикл между вычисляемыми полями.
- «Заполнять формулой поле журнала нельзя» / «Поле „…“ лежит в журнале» — формулы не работают с полями повторяющихся разделов.
- «Поле „…“ помечено обязательным» — снимите Обязательное у целевого поля: его никто не заполняет руками.
- «Формула читает слепое поле, поэтому „…“ тоже должно быть слепым» — отметьте целевое поле Слепое (значение маскируется).
- При вводе ответ 422 и значение не принимается — запись в поле, скрытое условием, или в вычисляемое поле отклоняется сервером. Это ожидаемо: поменяйте управляющий ответ или исходные поля.
Подробнее
Заголовок раздела «Подробнее»Почему скрытое значение не удаляется само
Заголовок раздела «Почему скрытое значение не удаляется само»Скип-логика никогда не удаляет данные молча. Если значение было введено, а потом ответ в управляющем поле изменился и поле скрылось, значение остаётся в базе. Дальше решает человек: Очистить (с причиной) — с обязательной причиной, записью в аудиторский след и обычными последствиями правки данных; либо координатор возвращает управляющий ответ — и поле снова видно вместе со значением.
Правка исходных пересчитывает результат
Заголовок раздела «Правка исходных пересчитывает результат»Если исходное значение исправили, система пересчитает вычисляемое поле. Пересчитанное значение — изменение данных, как любое другое: SDV-верификация по нему сбрасывается, а подписи, покрывающие это значение, инвалидируются и потребуют повторного подписания. Правка самого исходного значения, как обычно, требует причины изменения.
Язык выражений: краткая справка
Заголовок раздела «Язык выражений: краткая справка»Условия отображения, автозаполнение и правила проверки
пишутся на одном компактном языке выражений. Поля адресуются по имени данных (OID); доступны
сравнения (==, !=, <, <=, >, >=), арифметика (+, -, *, /) и связки
and / or / not.
| Функция | Что делает |
|---|---|
is_empty(x) |
истина, если поле пустое |
num(x) |
числовое значение поля |
days_between(a, b) |
число дней между двумя датами |
round(x, n) |
округление до n знаков |
ref('ФОРМА', 'ПОЛЕ') |
значение поля другой формы |
ref('ВИЗИТ', 'ФОРМА', 'ПОЛЕ') |
то же с уточнением визита — для межформенных проверок |
ref() доступен в правилах проверки и автозаполнении; условие отображения читает только поля
своей формы.
Смысл «истины» зависит от того, где выражение используется:
| Где используется | Истина означает |
|---|---|
| Правило проверки | нарушение — проверка сработала (блокировка или запрос) |
| Условие отображения | элемент виден |
| Автозаполнение | не условие, а формула — её результат записывается в целевое поле |
Редактор в конструкторе проверяет выражение на лету: под полем сразу видно «Выражение корректно» или конкретную ошибку, а также список полей, от которых выражение зависит. Выражения с ошибками не пройдут и отправку версии на ревью.