# Validation

## **Принципы** <a href="#id-validaciyaform-principy" id="id-validaciyaform-principy"></a>

Задача дизайнера — сделать так, чтобы пользователь не совершил ошибку и валидация не понадобилась, для этого:

1. Ограничьте выбор заведомо неверных значений в списке: блокируйте эти значения или не показывайте в списке.
2. Ограничьте ввод неподходящих символов. Если в поле нужно вводить только цифры, и это очевидно пользователю, игнорируйте ввод букв вместо того, чтобы показать ошибку. Используйте маски в полях, где у значений известен формат.
3. Пишите подсказки для заполнения формы. Например, плейсхолдер в полях ввода. В сложных интерфейсах, которыми часто пользуются, хорошо использовать скрытые подсказки: добавить рядом с полем иконку или изображение и показывать подсказку по наведению на него. Тогда человеку, который уже освоил интерфейс, подсказки не будут мешать, а новичок всегда сможет прочитать, что происходит.

{% hint style="danger" %}
Валидация на только что открытой пустой форме запрещена.&#x20;

Исключение — черновики, когда пользователь уже заполнял эту форму, через какое-то время вернулся к ней, а она заполнена с ошибками.
{% endhint %}

## **Виды валидации** <a href="#id-validaciyaform-vidyvalidacii" id="id-validaciyaform-vidyvalidacii"></a>

1. Мгновенная
2. При потере фокуса
3. При отправке формы (по кнопке)

{% hint style="info" %}
Чем раньше интерфейс сообщает об ошибке, тем лучше — пользователю проще вернуться и исправить ошибку
{% endhint %}

Следует разделять валидацию на серверную и клиентскую.

Тип валидации настраивается разработчиком на конкретном проекте.

Чаще всего серверная валидация требуется для проверки на уникальность вновь добавляемого значения, когда требуется сравнение вводимого результата со всем пулом имеющихся в БД данных. Такая валидация должна осуществляться по нажатию соответствующей кнопки интерфейса или использованию кнопки "Enter", Данное действие отправляет запрос на сервер, валидация осуществляется на стороне сервера и интерфейс (клиент) получает и выводит готовый результат валидации, например, сообщение о невалидности, либо, наоборот, валидность результата. В этом случае необходимо обязательно предусмотреть соответствующие элементы интерфейса - не только поле для валидации, но и кнопку, по которой осуществляется запрос.

За одно нажатие управляющей кнопки может проверятся валидность нескольких полей, если этого требует сценарий. Т.е. отправляться несколько запросов на сервер.

Если требуется валидация по корректности формата или типа значения, как правило данную проверку возможно осуществить сразу же, по окончании (/по мере) ввода значения пользователем, т.е., буквально, мгновенно. без нажатия дополнительных кнопок - при потере фокуса на поле или непосредственно по мере ввода значения, в зависимости от требований к валидации и пользовательского сценария.

### **Мгновенная валидация** <a href="#id-validaciyaform-1.mgnovennayavalidaciya" id="id-validaciyaform-1.mgnovennayavalidaciya"></a>

Самый быстрый способ сообщить об ошибке — мгновенная валидация. Она возможна только в тех случаях, когда в процессе ввода понятно, что значение некорректное. Обычно такие ошибки связаны с неправильной раскладкой клавиатуры (кириллица вместо латиницы) или вводом букв в цифровое поле (ID, номер заявки и др.) Для этих случаев мы используем поля с масками: ввод неподходящих символов в них заблокирован. Поэтому в наших интерфейсах чаще всего встречаются два другие вида валидации:

* по потере фокуса — основной вид валидации
* по отправке формы — для тех случаев, когда валидация по потере фокуса невозможна.

### **Валидация после потери фокуса** <a href="#id-validaciyaform-2.validaciyaposlepoterifokusa" id="id-validaciyaform-2.validaciyaposlepoterifokusa"></a>

#### **Когда использовать** <a href="#id-validaciyaform-kogdaispolzovat" id="id-validaciyaform-kogdaispolzovat"></a>

Этот вид валидации подходит для большинства случаев.

#### **Как работает** <a href="#id-validaciyaform-kakrabotaet" id="id-validaciyaform-kakrabotaet"></a>

Пользователь заполняет поле и переходит к следующему. В этот момент поле уходит из фокуса, и, если оно заполнено, срабатывает валидация.

Валидация срабатывает сразу после потери фокуса, если значение в поле заполнено или в нём ошибка. Если найдена ошибка, поле подсвечивается  зарезервированным для ошибок цветом. Фокус в это поле автоматически не возвращается.

{% hint style="danger" %}
Не валидируйте поля на пустоту по потере фокуса — не показывайте ошибку если поле не заполнено, возможно пользователь вернется и заполнит поле чуть позже. Показывать ошибку в таких случаях можно только после отправки формы.
{% endhint %}

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FgHMpaLroleqgaVUbjIqS%2Fimage.png?alt=media&#x26;token=d289b833-bd2a-4150-9181-668c51e16e8f" alt=""><figcaption><p>Старый вариант  инпута</p></figcaption></figure>

Текст ошибки появляется в тултипе, когда поле получает наведение или фокус: <br>

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FJ42jlk5viVDoWFNPaGeB%2Fimage.png?alt=media&#x26;token=7508cb8d-757e-486c-bdeb-5568effc25d1" alt=""><figcaption><p>Старый вариант  инпута</p></figcaption></figure>

Поле с ошибкой должно остаться подсвеченным, если оно получило фокус, его значение не исправляли, а затем оно потеряло фокус. Подсветка ошибки снимается с поля, как только пользователь начал исправлять ошибочное значение.

Поле может содержать краткую информацию, объясняющую условия невалидности. Это необязательное условие. Стоит учесть, что если планируется использовать информацию ниже поля поля, то при проектировании макетов стоит увеличить отступ до 20px и не нарушать общую ритмику.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FbfySZIOGQ6guFvP19V0Q%2Fimage.png?alt=media&#x26;token=a50da145-057d-40b9-a7f3-a68409aa4a1e" alt=""><figcaption><p>Старый вариант  инпута</p></figcaption></figure>

### **Валидация при отправке формы** <a href="#id-validaciyaform-3.validaciyapriotpravkeformy" id="id-validaciyaform-3.validaciyapriotpravkeformy"></a>

#### Когда использовать <a href="#id-validaciyaform-kogdaispolzovat.1" id="id-validaciyaform-kogdaispolzovat.1"></a>

Используйте этот вид валидации, когда нельзя проверить поля по потере фокуса. Например, для проверки заполнения обязательных полей.

#### Как работает <a href="#id-validaciyaform-kakrabotaet.1" id="id-validaciyaform-kakrabotaet.1"></a>

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

При прокрутке к первому полю от верхней границы окна до ошибочного поля остается отступ 50 px.

## **Блокирование кнопки отправки**

В небольших формах вместо проверки заполнения обязательных полей можно блокировать кнопку отправки формы. Используйте это поведение, когда очевидно, почему кнопка отправки формы неактивна. Например, на форме авторизации.

Как только заполнены все обязательные поля — кнопка становится активной. Если после этого пользователь стер значение в одном из полей — кнопка снова должна стать не активной.

## **Сообщения об ошибках** <a href="#id-validaciyaform-soobsheniyaoboshibkakh" id="id-validaciyaform-soobsheniyaoboshibkakh"></a>

Если в поле ошибка, его нужно подсветить: выделить цветом или как-то ещё, чтобы пользователь явно видел, что нужно исправить. Иногда этого достаточно, но обычно нужно рассказать об ошибке в явном виде — в **тултипе** или **подсказке** рядом с полем.

Об ошибках можно сообщать двумя способами, например, тултип или подсказка:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FqXjItYtD0Cz3KTf6MQRD%2Fimage.png?alt=media&#x26;token=25fc10ea-f31b-4252-9f1f-75184d4ccd68" alt=""><figcaption></figcaption></figure>

Или цветом зарезервированного текстом ошибки около поля, обычно под полем:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FGp5uXVU09K5cdoQJOAwy%2Fimage.png?alt=media&#x26;token=5328cdb7-27d2-4ea1-9cb1-598137783404" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Из этих двух способов мы рекомендуем использовать тултипы. Они идут отдельным слоем, поэтому не раздвигают форму и легко размещаются, даже если поля на форме расположены плотно.
{% endhint %}

## **Тултипы** <a href="#id-validaciyaform-tultipy.1" id="id-validaciyaform-tultipy.1"></a>

### Как работают <a href="#id-validaciyaform-tultipy.1" id="id-validaciyaform-tultipy.1"></a>

Тултип с подсказкой появляется в двух случаях:

1. При наведении на поле с ошибкой.
2. Когда поле с ошибкой получает фокус.

\
Тултип исчезает, когда:

1. Курсор вышел из области поля с ошибкой.
2. Поле с ошибкой потеряло фокус.

Тултип может появляться сверху или справа от контролла с ошибкой, так чтобы он не перекрывал полезную информацию:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FBhh3wZNoAEwE20Kukbf4%2Fimage.png?alt=media&#x26;token=c5123967-6602-4594-b853-0259cdd3ccec" alt=""><figcaption></figcaption></figure>

### Единообразие поведения и внешнего вида

Показывайте тултипы справа от полей. Eсли в этом случае они перекрывают важное содержимое на странице, выводите тултипы сверху. Придерживайтесь единообразия, но помните, что контент важнее него.

## **Подсказка**

Подсказка с сообщением об ошибке появляется сразу, как только произошла валидация и поле с ошибкой подсветилось.

Текст ошибки можно вывести справа от поля, если на форме есть место, а само сообщение короткое. Так форму не придется раздвигать, чтобы показать ошибку.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FYkQd5cY7UFrfulALVPqo%2Fimage.png?alt=media&#x26;token=ee57baa5-be74-420b-910d-59a7c9894fd3" alt=""><figcaption></figcaption></figure>

Если справа от поля нет места для текста, выводите сообщение под полем. Лучше делать это как можно реже: новая строка не раздвигает форму в высоту, ритмика теряется, это может запутать пользователя.&#x20;

<br>

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FYKtONEPJNY0CacWf42EW%2Fimage.png?alt=media&#x26;token=1e0f15c1-d3b7-4ef1-a673-ae88d112996a" alt=""><figcaption></figcaption></figure>

### В чём ошибка <a href="#id-validaciyaform-vchyomoshibka.1" id="id-validaciyaform-vchyomoshibka.1"></a>

Обязательно в явном виде скажите пользователю, в чём ошибка:

* В формате данных, которые он вводит в поле (не добавил @ в адрес электронной почты)
* В самих данных (ввел пароль или логин, которых не существует)

<table data-card-size="large" data-view="cards" data-full-width="false"><thead><tr><th><select><option value="P6hN56MJ08K9" label="✖️ Неправильно" color="blue"></option></select></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><span data-option="P6hN56MJ08K9">✖️ Неправильно</span></td><td><mark style="color:red;"><strong>Логин не подходит</strong></mark></td><td>Непонятно, ошибка в формате или что-то не так с самим логином.</td><td></td></tr><tr><td><span data-option="P6hN56MJ08K9">✖️ Неправильно</span></td><td><mark style="color:red;"><strong>Логин не подходит</strong></mark></td><td>Непонятно, ошибка в формате или что-то не так с самим логином</td><td></td></tr></tbody></table>

<table data-card-size="large" data-view="cards" data-full-width="false"><thead><tr><th><select><option value="VeRVQlvVTDoD" label="✔️ Правильно" color="blue"></option><option value="P6hN56MJ08K9" label="✖️ Неправильно" color="blue"></option></select></th><th></th><th></th></tr></thead><tbody><tr><td><span data-option="VeRVQlvVTDoD">✔️ Правильно</span></td><td><mark style="color:green;"><strong>Напишите телефон в формате</strong></mark><br><mark style="color:green;"><strong>+7 000 000 00 00</strong></mark></td><td>Сразу понятно, что ошибка в формате, а ещё есть подсказка, как должно быть. Можно сравнить и быстро найти ошибку</td></tr><tr><td><span data-option="VeRVQlvVTDoD">✔️ Правильно</span></td><td><mark style="color:green;"><strong>Такого номера нет в списке. Проверьте, пожалуйста</strong></mark></td><td>C форматом всё ок, человек просто перепутал номер.</td></tr><tr><td><span data-option="VeRVQlvVTDoD">✔️ Правильно</span></td><td><mark style="color:green;"><strong>Этот логин уже занят</strong> или <strong>Пользователя с таким логином нет</strong></mark></td><td>C форматом всё в порядке, нужно искать другой логин</td></tr><tr><td><span data-option="VeRVQlvVTDoD">✔️ Правильно</span></td><td><mark style="color:green;"><strong>В логине должно быть 20 цифр, три буквы и хотя бы одно тире</strong></mark></td><td>Нужно разбираться с форматом</td></tr></tbody></table>

## **Валидация зависимых полей**

Зависимые поля — это поля, значение которых зависит друг от друга. Требуется их совместная проверка.&#x20;

Подсветка зависимых полей пропадает, как только пользователь начал исправлять значение в одном из этих полей. Если пользователь что-то вводит в поле и мы понимаем, что значение не совпадает с форматом, нужно сразу подсвечивать и подсказывать, что где-то ошибка.

Например, "Тип данных" и "Дискретный набор". Если пользователь указал "тип данных" = дискретное, а поле с "Дискретным набором" оставил пустым, после отправки формы пустое поле с выбором дискретного набора будет подсвечено.

{% hint style="warning" %}
Важное допущение для описания: если поле обязательное, то пока его не заполнили кнопка **"Сохранить"** будет недоступна для нажатия
{% endhint %}

Есть форма из 5 полей:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FNwC5ro6TwVQO5SxqYsa8%2Fimage.png?alt=media&#x26;token=e8c2e3ca-04c6-43cb-bf3e-698b4a996bcf" alt=""><figcaption></figcaption></figure>

1. Пользователь пропустил поле **Название организации**.
2. Заполнил поля **Имя** и **Фамилия**.
3. В поле **Электронная почта** указал адрес в неправильном формате.
4. Перешёл в поле **Телефон**, указал номер в неправильном формате, но из поля пока не вышел.

Вот что он видит:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2Fw6BBnWogI9JSOhJ0XsqT%2Fimage.png?alt=media&#x26;token=77a7260a-f307-45c6-8ab2-d1c371a774b4" alt=""><figcaption></figcaption></figure>

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

Что он видит:

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FpilBw2f5WFXgJAXCtwk3%2Fimage.png?alt=media&#x26;token=640919a3-86d2-499c-819c-eb5f2fc6e3e1" alt=""><figcaption></figcaption></figure>

Пользователь нажал **Сохранить**.

Фокус перешёл в поле **Организация**, так как оно обязательное. Рядом с полем появился тултип с сообщением об ошибке.

Другие поля с ошибками продолжают подсвечиваться.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FdXfxFe7DVDNOfwiDMMiK%2Fimage.png?alt=media&#x26;token=f892a73b-4458-4e84-8723-83979439694c" alt=""><figcaption></figcaption></figure>

Пользователь начинает вводить текст в поле **Организация**.

Подсветка, которая показывает, что в поле ошибка, пропадает. Тултип с подсказкой остаётся.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FHktbCty4NWWZoTRCDHel%2Fimage.png?alt=media&#x26;token=0b5ede77-ffdd-47fd-aff2-7d79866cd7ab" alt=""><figcaption></figcaption></figure>

Пользователь заполнил поле **Организация**.

Фокус переведён на следующее неверно заполненное поле.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FpU9Y3nfGCIEf6fiIKPMy%2Fimage.png?alt=media&#x26;token=596f8c3b-c61c-4cf0-a0be-638098528fdf" alt=""><figcaption></figcaption></figure>

Пользователь исправил поле **Электронная почта** (тултип с сообщением об ошибке исчез).

Перешёл к следующему.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FIRyDH8DYcS0PLMYYDfJI%2Fimage.png?alt=media&#x26;token=a6a7e4fe-db52-4779-a3fb-dd2ac623a71a" alt=""><figcaption></figcaption></figure>

Теперь по нажатию кнопки «**Сохранить**» все будет хорошо.

PS.Стиль кнопок, полей и прочих элементов нужно смотреть на их страница/гайдлайне.

## **Валидация обязательных полей на нескольких вкладках** <a href="#id-validaciyaform-validaciyaobyazatelnykhpoleinaneskolkikhvkladkakh.1" id="id-validaciyaform-validaciyaobyazatelnykhpoleinaneskolkikhvkladkakh.1"></a>

В случае, если обязательные для заполнения поля располагаются на двух вкладка, вы можете показать наличие этих полей с помощью \* в заголовке наименования вкладки.

<figure><img src="https://4122576536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrqHekF3kQhhBvtSAI6Bj%2Fuploads%2FYVDOWdShkE5Wk8ETZJMK%2Fimage.png?alt=media&#x26;token=6d92db47-a61b-4796-9733-0b564beb4ea1" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Самое лучше решение – избегать такой конструкции формы/страницы/экрана , когда обязательные для заполнения поля располагаются на разных вкладках.
{% endhint %}

## Полезные ссылки

{% embed url="<https://medium.com/@olamishina/building-ux-for-error-validation-strategy-36142991017a>" %}

{% embed url="<https://www.smashingmagazine.com/2022/08/error-messages-ux-design/>" %}

{% embed url="<https://www.smashingmagazine.com/2022/09/inline-validation-web-forms-ux/>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://prizmds.gitbook.io/documentation/guidelines/validation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
