Er 20001 сущность содержит ошибки валидации

Форум КриптоПро
 » 
Средства криптографической защиты информации
 » 
КриптоПро JCP, JavaTLS
 » 
ФСС ORA-20001: Некорректная подпись головной организации: Ошибка при проверке сертификата. VALID_SIG


Offline

JfbYtd-7900

 


#1
Оставлено
:

3 апреля 2019 г. 14:01:58(UTC)

JfbYtd-7900

Статус: Активный участник

Группы: Участники

Зарегистрирован: 03.04.2019(UTC)
Сообщений: 45
Российская Федерация

Поблагодарили: 1 раз в 1 постах

Добрый день!

Подскажите, пожалуйста кто знает.

В документации ФСС написано:
8. К элементу <ds:SignedInfo> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается электронная подпись по алгоритму ГОСТ Р 34.10-2001 (или ГОСТ Р 34.10-2012) и заносится в <ds:SignatureValue> в формате Base64.

Вот сканоникализировал, по ГОСТу ЭЦП рассчитал, сформировал тестовый запрос и получил ошибку: ORA-20001: Некорректная подпись головной организации: Ошибка при проверке сертификата. VALID_SIGNATURE ЭП действительна; При проверке сертификата ЭП произошла ошибка. Ошибка построения цепочки сертификатов. Не найден сертификат Удостоверяющего Центра, указанный в сертификате пользователя

Код:


Signature sign=Signature.getInstance(Constants.SIGN_EL_ALG_2012_256);
sign.initSign(k); //Инициализирую подпись ключом моего личного сертификата
sign.update(b);   //Ввожу сканоникализированные данные
return(Base64.encode(sign.sign()));

Какова методология расчета ЭЦП для ФСС? Не понимаю как построить и подцепить цепочки сертификатов.


Вверх


Offline

Евгений Афанасьев

 


#2
Оставлено
:

3 апреля 2019 г. 15:18:43(UTC)

Евгений Афанасьев

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,782
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 655 раз в 618 постах

Здравствуйте.

Автор: JfbYtd-7900 Перейти к цитате

Ошибка при проверке сертификата. VALID_SIGNATURE ЭП действительна; При проверке сертификата ЭП произошла ошибка. Ошибка построения цепочки сертификатов. Не найден сертификат Удостоверяющего Центра, указанный в сертификате пользователя

Вероятно, на проверяющей стороне в доверенных нет корневого вашей цепочки сертификатов.

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

JfbYtd-7900

 


#3
Оставлено
:

3 апреля 2019 г. 15:26:44(UTC)

JfbYtd-7900

Статус: Активный участник

Группы: Участники

Зарегистрирован: 03.04.2019(UTC)
Сообщений: 45
Российская Федерация

Поблагодарили: 1 раз в 1 постах

Автор: Евгений Афанасьев Перейти к цитате

Здравствуйте.

Автор: JfbYtd-7900 Перейти к цитате

Ошибка при проверке сертификата. VALID_SIGNATURE ЭП действительна; При проверке сертификата ЭП произошла ошибка. Ошибка построения цепочки сертификатов. Не найден сертификат Удостоверяющего Центра, указанный в сертификате пользователя

Вероятно, на проверяющей стороне в доверенных нет корневого вашей цепочки сертификатов.

Да. Но как передать в ФСС всю цепочку? Пока не могу найти методологию расчета полной цепочки сертификатов ЭЦП для ФСС.


Вверх


Offline

Евгений Афанасьев

 


#4
Оставлено
:

3 апреля 2019 г. 16:48:07(UTC)

Евгений Афанасьев

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,782
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 655 раз в 618 постах

Автор: JfbYtd-7900 Перейти к цитате

Но как передать в ФСС всю цепочку?

Если документ формате XML, то можно добавить недостающие сертификаты в KeyInfo, как и сертификат подписи. Но, скорее всего, на проверяющей стороне корневой должен быть установлен в хранилище доверенных. Возможно, нужно использовать ключ и сертификат, выпущенный в определенном УЦ, который есть в списке доверенных проверяющей стороны.

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

JfbYtd-7900

 


#5
Оставлено
:

3 апреля 2019 г. 18:01:31(UTC)

JfbYtd-7900

Статус: Активный участник

Группы: Участники

Зарегистрирован: 03.04.2019(UTC)
Сообщений: 45
Российская Федерация

Поблагодарили: 1 раз в 1 постах

Начал копать в сторону CAdESSignature, из примеров CAdES и https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=11782 через тестовый TSP-сервер

Код:

            CAdESSignature cadesSignature = new CAdESSignature( true );
            Collection<X509CertificateHolder> holderList = new ArrayList<X509CertificateHolder>();
            
            for (X509Certificate cert1 : chain) 
                    {
                        holderList.add(new X509CertificateHolder(cert1.getEncoded()));
                    } 
                    cadesSignature.setCertificateStore(new CollectionStore(holderList));
            
            cadesSignature.addSigner(JCP.PROVIDER_NAME,getDigestOid(k),getPublicKeyOid(k),k, chain, CAdESType.CAdES_T, /*"http://www.cryptopro.ru/tsp/"*/Configuration.TSA_DEFAULT_ADDRESS, false );

Возникает вот такая ошибка:
апр 03, 2019 6:43:21 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 39014
апр 03, 2019 6:43:21 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
апр 03, 2019 6:43:22 PM ru.CryptoPro.CAdES.tools.CAdESUtility initJCPAlgorithms
INFO: Replacement of the BouncyCastle GOST algorithms.
Error building certification path for CN=»ПАО «МТС»», C=RU, ST=Москва, L=г. Москва, STREET=»Марксистская ул., д. 4″, O=»ПАО «МТС»», OID.1.2.643.100.1=#120D31303237373030313439313234, EMAILADDRESS=mts@temp.ru: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] ‘PKIX failure: invalid parameters of certificate’,
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at client.Cryptopro.setSignatureValue(Cryptopro.java:236)
at client.Class1.main(Class1.java:63)
Caused by: Error building certification path for CN=»ПАО «МТС»», C=RU, ST=Москва, L=г. Москва, STREET=»Марксистская ул., д. 4″, O=»ПАО «МТС»», OID.1.2.643.100.1=#120D31303237373030313439313234, EMAILADDRESS=mts@temp.ru: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] ‘PKIX failure: invalid parameters of certificate’,
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
… 4 more

В JAVA_HOME/lib/security/cacerts зарегистрировал cacer3.crt и tsa.cer. Подскажите, в чем может быть еще проблема?


Вверх


Offline

Евгений Афанасьев

 


#6
Оставлено
:

4 апреля 2019 г. 10:01:37(UTC)

Евгений Афанасьев

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,782
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 655 раз в 618 постах

Нужно включить логирование JCPLogger и собрать лог.

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

JfbYtd-7900

 


#7
Оставлено
:

4 апреля 2019 г. 10:14:01(UTC)

JfbYtd-7900

Статус: Активный участник

Группы: Участники

Зарегистрирован: 03.04.2019(UTC)
Сообщений: 45
Российская Федерация

Поблагодарили: 1 раз в 1 постах

Вообще-то что-то не то. Может тестовый инстанс ФСС не видит наши тестовый сертификат, а работает только с продуктовыми? Может такое быть? Т.к. локально проверка подписи проходит, возвращается TRUE, во все закомментированных случаях.

Код:


    public String sign(String value) throws Exception
    {
        byte[] b=null;
        JCPStoreApi jcpStoreApi=null;

        try
        {
            //Каноникализация
            b=Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS).canonicalize(value.getBytes());
            
            //Получение сведений о сертификате
            jcpStoreApi=new JCPStoreApi(); 
            PrivateKey k=jcpStoreApi.loadKey("le-4145024e-1dd0-4ce2-88c5-d515010385d9 - Copy","1234");
     
            if(k==null) return(null);

            //Подписание
            Signature sign=Signature.getInstance(Constants.SIGN_EL_ALG_2012_256,JCP.PROVIDER_NAME);
            sign.initSign(k);
            sign.update(b);
            
            byte[] s=sign.sign();
            
            //Проверка
            Signature sign2=Signature.getInstance(Constants.SIGN_EL_ALG_2012_256,JCP.PROVIDER_NAME);
            //sign2.initVerify(jcpStoreApi.certificate);
            //sign2.initVerify(jcpStoreApi.x509Certificate);
            sign2.initVerify(jcpStoreApi.x509Certificate.getPublicKey());
            sign2.update(b);
            System.out.println(sign2.verify(s));
            
            return(Base64.encode(s));
        }
        finally
        {
            b=null;
            jcpStoreApi=null;
        }
    }

апр 04, 2019 11:11:10 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 39014
апр 04, 2019 11:11:10 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
true
AHOwUNChDRwg3unByJpSIXGpG8nF5TGCwnXQ9Lsexdv376Cd1doyeoClIkxeFM38B4rmve44GpyG
E27lqhOWiw==


Вверх


Offline

Евгений Афанасьев

 


#8
Оставлено
:

5 апреля 2019 г. 9:26:43(UTC)

Евгений Афанасьев

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,782
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 655 раз в 618 постах

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

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

JfbYtd-7900

 


#9
Оставлено
:

5 апреля 2019 г. 9:34:05(UTC)

JfbYtd-7900

Статус: Активный участник

Группы: Участники

Зарегистрирован: 03.04.2019(UTC)
Сообщений: 45
Российская Федерация

Поблагодарили: 1 раз в 1 постах

Автор: Евгений Афанасьев Перейти к цитате

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

Спасибо. Направим запрос в ФСС.


Вверх

Пользователи, просматривающие эту тему

Guest

Форум КриптоПро
 » 
Средства криптографической защиты информации
 » 
КриптоПро JCP, JavaTLS
 » 
ФСС ORA-20001: Некорректная подпись головной организации: Ошибка при проверке сертификата. VALID_SIG

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Просмотров 8.6к. Опубликовано 19.12.2022
Обновлено 19.12.2022

Каждый сайт, который создает компания, должен отвечать принятым стандартам. В первую очередь затем, чтобы он попадал в поисковую выдачу и был удобен для пользователей. Если код страниц содержит ошибки, неточности, он становится “невалидным”, то есть не соответствующим требованиям. В результате интернет-ресурс не увидят пользователи или информация на нем будет отображаться некорректно. 

В этой статье рассмотрим, что такое валидность, какие могут быть ошибки в HTML-разметке и как их устранить.

Содержание

  1. Что такое HTML-ошибка валидации и зачем она нужна
  2. Чем опасны ошибки в разметке
  3. Как проверить ошибки валидации
  4. Предупреждения
  5. Ошибки
  6. Пример прохождения валидации для страницы сайта
  7. Как исправить ошибку валидации
  8. Плагины для браузеров, которые помогут найти ошибки в коде
  9. Коротко о главном

Что такое HTML-ошибка валидации и зачем она нужна

Под понятием  “валидация” подразумевается процесс онлайн-проверки HTML-кода страницы на соответствие стандартам w3c. Эти стандарты были разработаны Организацией всемирной паутины и стандартов качества разметки. Сама организация продвигает идею унификации сайтов по HTML-коду — чтобы каждому пользователю, вне зависимости от браузера или устройства, было удобно использовать ресурс.

Если код отвечает стандартам, то его называют валидным. Браузеры могут его прочитать, загрузить страницы, а поисковые системы легко находят страницу по соответствующему запросу. 

Чем опасны ошибки в разметке

Ошибки валидации могут разными — видимыми для глаза простого пользователя или такими, которые можно засечь только с помощью специальных программ. В первом случае кроме технических проблем, ошибки в разметке приводят к негативному пользовательскому опыту. 

К наиболее распространённым последствиям ошибок в коде HTML-разметки также относят сбои в нормальной работе сайта и помехи в продвижении ресурса в поисковых системах.

Рассмотрим несколько примеров, как ошибки могут проявляться при работе:

  • Медленно подгружается страница 

Согласно исследованию Unbounce, более четверти пользователей покидают страницу, если её загрузка занимает более 3 секунд, ещё треть  уходит после 6 секунд;

  • Не видна часть текстовых, фото и видео-блоков 

Эта проблема делает контент для пользователей неинформативным, поэтому они в большинстве случаев уходят со страницы, не досмотрев её до конца;

  • Страница может остаться не проиндексированной

Если поисковый робот распознает недочёт в разметке, он может пропустить страницу и прервать её размещение в поисковых системах;

  • Разное отображение страниц на разных устройствах

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

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

Как проверить ошибки валидации

Владельцы ресурсов используют 2 способа онлайн-проверки сайтов на наличие ошибок — технический аудит или использование валидаторов. 

Первый случай подходит для серьёзных проблем и масштабных сайтов. Валидаторами же пользуются ежедневно. Наиболее популярный — сервис The W3C Markup Validation Service. Он сканирует сайт и сравнивает код на соответствие стандартам W3C. Валидатор выдаёт 2 типа несоответствий разметки стандартам W3C: предупреждения и ошибки. 

Давайте рассмотрим каждый из типов чуть подробнее.

Предупреждения

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

Тем не менее, предупреждения всё равно нужно устранять, так как из-за них сайт может работать медленнее — например, по сравнению с конкурентами с такими же сайтами.

Примером предупреждения может быть указание на отсутствие тега alt у изображения. 

Ошибки

Ошибки  —  это те проблемы, которые требуют обязательного устранения. 

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

Распространённым примером ошибки может быть отсутствие тега <!DOCTYPE html> в начале страницы, который помогает информации преобразоваться в разметку. 

Пример прохождения валидации для страницы сайта

Рассмотрим процесс валидации на примере сайта avavax.ru, который создали на WordPress.

пример ошибки валидации

В результате проверки валидатор выдал 17 замечаний. После анализа отчета их можно свести к 3 основным:

  1. атрибут ‘text/javascript’ не требуется при подключении скрипта;
  2. атрибут ‘text/css’ не требуется при подключении стиля;
  3. у одного из элементов section нет внутри заголовка h1-h6.

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

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

Добавление кода в файл

Для этого на хук wp_loaded нужно повесить функцию output_buffer_start(), которая загрузит весь генерируемый код html в буфер. При выводе в буфер вызывается функция output_callback($tag), которая просматривает все теги, находит нежелательные атрибуты с помощью регулярных выражений и заменяет их пробелами. Затем на хук ‘shutdown вешается функция output_buffer_end(), которая возвращает обработанное содержимое буфера.

Для исправления семантики на сайте нужно использовать заголовки. Валидатор выдаёт предупреждение на секцию about, которая содержит фото и краткий текст. Валидатор требует, чтобы в каждой секции был заголовок. Для исправления предупреждения нужно добавить заголовок, но сделать это  так, чтобы его не было видно пользователям:

  1. Добавить заголовок в код:  <h3>Обо мне</h3>

Отключить отображение заголовка:

1 #about h3 {
2 display: none;
3 }

После этой части заголовок будет в коде, но валидатор его увидит, а посетитель — нет. 

За 3 действия удалось убрать все предупреждения, чтобы качество кода устроило валидатор. Это подтверждается зелёной строкой с надписью: “Document checking completed. No errors or warnings to show”.

Как исправить ошибку валидации

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

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

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

Плагины для браузеров, которые помогут найти ошибки в коде

Для поиска ошибок валидации можно использовать и встроенные в браузеры плагины. Они помогут быстро находить неточности еще на этапе создания кода. 

Для каждого браузера есть свой адаптивный плагин:

  • HTML Validator для браузера Firefox;
  • HTML Validator for Chrome;
  • HTML5 Editor для Opera.

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

Коротко о главном

Валидация — процесс выявления проблем с HTML-разметкой сайта и ее соответствия стандартам W3C. Это унифицированные правила, с помощью которых сайт может нормально работать и отображаться и для поисковых роботов, и для пользователей. 

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

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

Даже у крупных сайтов с миллионной аудиторией, например, Яндекс.Дзен или ВКонтакте, есть проблемы с кодом. Но комплексный подход к решению проблем помогает устранять серьёзные моменты своевременно. Нужно развивать сайт всесторонне, чтобы получить результат от его существования и поддержки. Если самостоятельно разобраться с проблемами не получается, не стоит “доламывать” — лучше обратиться за помощью к профессионалам, например, агентствам по веб-аудиту. 

Вернуться в основную статью

Для облегчения поиска ошибок был создан отдельный раздел для сбора ошибок из АРМ ЭЛН, читайте внимательнее подсказки ниже:


Для поиска по статье нажмите Ctrl+F и введите первые символы кода ошибки или вопроса

Поделиться статьей в:

  • Telegram
  • Vk

:!: В случае возникновения ошибки «ERR_SIGN Некорректная подпись головной организации: Ошибка при проверке сертификата. VALID_SIGNATURE ЭП действительна; При проверке сертификата ЭП произошла ошибка. Не удалось найти/получить доступ к списки отозванных сертификатов УЦ. Обратитесь в службу поддержки ФСС

Скачать данный файл — https://disk.yandex.ru/d/HoOPJ5WPC097RQ

Кликнуть правой кнопкой мыши по нему — Установить список отзыва


:!: В случае возникновения ошибки при установке или обновлении программы «GostCryptography.dll Этому файлу не сопоставлена программа для выполнения этого действия»

Необходимо обновить систему и выполнить команды в командной строке от имени администратора:

sfc /scannow

и

DISM /Online /Cleanup-Image /RestoreHealth

После этого необходимо перезагрузиться

Подробнее вы можете прочитать здесь


:!: В случае возникновения «Internal Error COMCryptoAPIClient» :

В командной строке CMD выполнить (с правами администратора):

cd C:FssTools

— для 32 бита:

C:WindowsMicrosoft.NETFrameworkv4.0.30319RegAsm.exe /registered C:FssToolsGostCryptography.dll

— для 64 бита:

C:WindowsMicrosoft.NETFramework64v4.0.30319RegAsm.exe /registered C:FssToolsGostCryptography.dll

:!: В случае возникновения ошибки «Сообщение не соответствует формату XML Encryption»

В меню Администрирование – Настройки сервисов ФСС – Строка соединения укажите следующий адрес сервиса:

https://eln.fss.ru/WSLnCryptoV20/FileOperationsLnService?WSDL

Далее в меню Администрирование – Настройка подписей для сервисов установите галку «Шифровать сообщение». После этого Вам необходимо указать Имя сертификата ФСС и Тип контейнера.


:!: В случае возникновения ошибки «Software caused connection abort: recv failed»


Обычно данная ошибка возникает при бездействии. Когда сервер автоматически закрывает соединение через некоторое время, а клиент получает данную ошибку в ответ на запрос
В иных случаях соединение может прерываться из-за перезапуска СУБД на сервере, когда клиент пытается запрашивать данные по уже несуществующим соединениям

:!: В случае возникновения ошибки «HibernateException: Collection is not associated with any session

Данная ошибка обозначает, что в БД АРМ ЛПУ сохранены строки с одинаковым номером ЭЛН.
Необходимо войти в PGAdmin по пути: C:postgresqlbin
Исполняемый файлpgAdmin3.exe

Пароль для пользователя Postgres — Manager1
и на схеме public выполнить запрос:

WITH t AS (
SELECT ln_code, COUNT(1) FROM public.fc_eln_data_history
GROUP BY ln_code
HAVING COUNT(1) > 1)
SELECT * FROM public.fc_eln_data_history
WHERE ln_code IN (SELECT ln_code FROM t);

Этот запрос выведет строки с одинаковыми номерами ЭЛН. Затем необходимо будет удалить ошибочную строку:
delete from public.fc_eln_data_history where id = ‘ваш id неверной строки’;

Если данный способ не работает и после обновления ПО ошибка повторяется

Необходимо выполнить запрос:

ALTER TABLE public.fc_eln_data_history ADD CONSTRAINT unique_lncode UNIQUE (ln_code);

Это ограничение запрещает создавать в таблице public.fc_eln_data_history строки с одинаковым значением ln_code


:!: В случае возникновения ошибки «В базе данных АРМ ЛПУ имеется некорректная запись» (Transaction already active)

Данная ошибка возникает в случае, когда в какой либо таблице БД приложения сохранены некорректные записи

Для исправления нужно удалить из БД приложения неверную строку (такие записи можно удалить только вручную).

Необходимо подключиться к серверу базы данных PostgreSQL, найти и удалить из базы ошибочную строку. При установке АРМ ЛПУ, вместе с БД и компонентами PostgreSQL устанавливается клиент для подключения к БД. По умолчанию находится здесь: C:postgresqlbinpgAdmin3.exe

В интерфейсе клиента открывается сервер PostgreSQL 9.5. Затем открывается схема fss (пользователь fss, пароль fss) – Схемы – public – Таблицы.

Данные в АРМ ЛПУ хранятся в таблицах:
fc_eln_data_history — данные листков нетрудоспособнсти;

fc_eln_periods — сведения о периодах нетрудоспособности;

ref_ln_numbers — список запрошенных номеров ЭЛН.

Для просмотра таблицы необходимо выделить ее в дереве таблиц и нажать на значок «Просмотр данных в выбранном объекте»
Выделяете и удаляете (delete) строку, которая содержит пустое значение номера ЭЛН или другие ошибки.
Как вариант, для поиска и удаления ошибочных записей возможно использование SQL запроса типа:
select id from fc_eln_data_history where ln_code is null;
delete from fc_eln_data_history where id = ваш id;
Для открытия окна SQL запросов необходимо в главном меню нажать на значок «SQL».

Обратите внимание! При удалении строки ЭЛН, если в этом ЭЛН были созданы периоды нетрудоспособности, сначала необходимо удалить их. Периоды нетрудоспособности хранятся в отдельной таблице fc_eln_periods и связаны с fc_eln_data_history по номеру ЭЛН. Просмотр и удаление периодов аналогично, описанному выше.


:!: В случае возникновения ошибки «Unable to acquire JDBC Connection»

Проблема связана с неработоспособностью сервисов ФСС, необходимо ожидать восстановления


:!: В случае возникновения ошибки «Ошибка вызова сервиса передачи/получения данных. ЛПУ НЕ НАЙДЕН В СПРАВОЧНИКЕ»

Необходимо взять документы и лицензии МО, обратиться (подойти на приём) в территориальный орган Фонда по месту осуществления деятельности. Сотрудники ТОФ внесут МО в соответствующие справочники, после чего МО сможет формировать ЭЛН.


:!: В случае возникновения ошибки «Ошибка вызова сервиса передачи/получения данных. Unmarchalling error: cvc-complex-type.2.4.a: Invalid content was found starting with element»

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


:!: В случае возникновения ошибки «Ошибка при проверке сертификата. VALID_SIGNATURE ЭП действительна; При проверке сертификата ЭП произошла ошибка. Ошибка построения цепочки сертификатов. Не найден сертификат Удостоверяющего центра, указанный в сертификате пользователя

Необходимо переустановить ВСЮ цепочку сертификатов уполномоченного лица ФСС


:!: В случае возникновения ошибки «ЭЛН с номером, указанным в поле «Продолжение ЭЛН» не закрыт»

Необходимо
закрыть предыдущий ЭЛН – невозможно отправить на сервис ЭЛН-продолжение, не
закрыв при этом предыдущий ЭЛН


:!: В случае возникновения ошибки «Значение поля (групп полей) отличается от существующего значения»

Ошибка сообщает что невозможно внести изменения в ранее успешно отправленные данные ЭЛН. Понятие
«Группа полей» подразумевает некую неделимую целостность полей в ЭЛН,
например, если при открытии ЭЛН были успешно отправлены значения «Фамилия» и
«Имя», при продлении в эту группу полей невозможно будет добавить «Отчество».
Также невозможно исправить или дополнить ранее отправленные данные по периоду
нетрудоспособности, например, в ранее отправленный период добавить подпись
Председателя ВК;


:!: В случае возникновения ошибки «Направленные данные ЭЛН уже присутствуют в системе»

Вы пытаетесь отправить данные, которые уже присутствуют в системе


:!: В случае возникновения ошибки при запуске программы «Invalid Configuration Location» The configuration area at .. could not be created. Please choose a writable location using the ‘-configuration’ command line option

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


:!: В случае возникновения ошибки «Количество новых периодов не должно превышать 1»

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


Всем, кому понравился или помог это проект — Вы можете помочь ему развиваться материально:
Donate (помощь проекту)

Область применения электронной подписи (ЭП или ЭЦП) довольно широка. Например, многие специальные сервисы требуют верификации пользователя с её помощью: Госуслуги, онлайн-сервисы для управления средствами в банке, электронные площадки и другие. Поэтому любые технические неполадки, возникающие при использовании ЭЦП, могут вызвать различные серьёзные: от упущенной выгоды до материальных убытков.

Какие бывают ошибки

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

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

Рассмотрим неполадки подробнее и разберёмся, как их решать.

Сертификат не найден

Иногда при попытке подписать электронный документ с помощью ЭП пользователь может столкнуться с ошибкой «Не удалось найти ни одного сертификата, пригодного для создания подписи».

У подобных ошибок могут быть следующие причины:

  1. На компьютере не установлены корневые сертификаты Удостоверяющего Центра (УЦ), в котором была получена ЭП. Необходимо установить либо обновить корневой сертификат. Установка корневых сертификатов удостоверяющего центра подробно описана в нашей инструкции.
  2. На ПК не установлено ни одного личного сертификата ЭП. Для применения ЭП необходимы и личные сертификаты. Об их установке мы писали в другой статье.
  3. Установленные на компьютере необходимые сертификаты не валидны. Сертификаты отозваны или просрочены. Уточните статус сертификата в УЦ. Ошибка с текстом «Ваш сертификат ключа подписи включён в список отозванных» возникает, если у сертификата закончился срок действия или на ПК нужно обновить список сертификатов. В последней ситуации следует вручную загрузить перечень отозванных сертификатов.

Для установки списка отозванных сертификатов:

  • Откройте личный сертификат пользователя в окне Свойства браузера. Чтобы открыть его, наберите «Свойства браузера» в поисковой строке меню Пуск. Перейдите во вкладку Содержание и нажмите кнопку «Сертификаты».
  • личный сертификат1

  • Во вкладке Состав выберите из списка пункт «Точки распространения списков отзыва».
  • В блоке Имя точки распространения скопируйте ссылку на загрузку файла со списком отзыва.
  • Имя точки2

  • Скачайте по указанной ссылке файл. Нажмите по нему правой кнопкой мыши и выберите в контекстном меню «Установить список отзыва (CRL)».
  • Следуйте указаниям «Мастера импорта сертификатов».

Не виден сертификат на носителе

Как правило, причина такой проблемы — сбой в работе программных компонентов. Для её решения достаточно перезагрузить компьютер. Однако иногда этого бывает недостаточно, поэтому требуется переустановка драйверов или обращение в службу техподдержки.

К наиболее распространённым причинам такой проблемы относятся следующие случаи:

  1. Драйвер носителя не установлен или установлен некорректно. Для решения проблемы необходимо извлечь носитель электронной подписи из ПК и скачать последнюю версию драйвера носителя с официальных ресурсов. Если переустановка драйвера не помогла, подключите носитель к другому ПК, чтобы убедиться в исправности токена. Если токен определится другой системой, попробуйте удалить на неисправном компьютере драйвер носителя и установить его заново.
  2. Долгое опознание носителя. Для решения проблемы необходимо дождаться завершения процесса или обновить версию операционной системы.
  3. Некорректная работа USB-порта. Подключите токен к другому USB-порту, чтобы убедиться, что проблема не в носителе ЭП. Если система определила токен, перезагрузите компьютер. Если это не поможет, следует обратиться службу технической поддержки.
  4. Неисправность носителя. Если при подключении токена к другому компьютеру или USB-порту система не определяет его, значит, проблема в самом носителе. Устранение неисправности возможно в данном случае лишь одним путём — нужно обратиться в сервисный центр для выпуска нового носителя.

ЭП не подписывает документ

Причин у подобной проблемы множество. Каждый случай требует отдельной проверки. Среди самых распространённых можно выделить следующие неполадки:

  1. Закрытый ключ на используемом контейнере не соответствует открытому ключу сертификата. Возможно, был выбран не тот контейнер, поэтому следует проверить все закрытые контейнеры на компьютере. Если необходимый контейнер по тем или иным причинам отсутствует, владельцу придётся обращаться в удостоверяющий центр для перевыпуска ЭП.
  2. Ошибка «Сертификат недействителен» (certificate is not valid). Следует повторно установить сертификат ЭП по инструкциям УЦ в зависимости от используемого криптопровайдера — КриптоПро CSP, ViPNet CSP или другого.
  3. Сертификат ЭП определяется как непроверенный. В этом случае необходимо переустановить корневой сертификат удостоверяющего центра.
  4. Истёк срок действия криптопровайдера. Для решения этой проблемы необходим новый лицензионный ключ к программе-криптопровайдеру. Для его получения необходимо обращаться к специалистам УЦ или к ответственным сотрудникам своей организации.
  5. Подключён носитель с другим сертификатом. Убедитесь, что подключён правильный токен. Проверьте также, не подключены ли носители других сертификатов. Отключите другие носители в случае их обнаружения.

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

подписания3

В этой ситуации помогает установка и регистрация библиотеки Capicom:

  1. Скачайте файл архива.
  2. Распакуйте и переместите файлы capicom.dll и capicom.inf в каталог syswow64, находящийся в корневой папке ОС.
  3. Откройте командную строку от имени администратора — для этого в меню Пуск наберите «Командная строка», нажмите по найденному приложению правой кнопкой мыши и выберите Запуск от имени администратора.
  4. «Командная строка»4

  5. Введите «c:windowssyswow64regsvr32.exe capicom.dll» (без кавычек) и нажмите ENTER. Должно появиться уведомление о том, что команда выполнена успешно.
  6. нажмите ENTER5

Выбранная подпись не авторизована

Подобная ошибка возникает при попытке авторизации в личном кабинете на электронных торговых площадках. Например, при входе на площадку ZakazRF отображается сообщение «Выбранная ЭЦП не авторизована».

площадку ZakazRF6

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

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

Часто задаваемые вопросы

Почему компьютер не видит ЭЦП?

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

О том, что делать, если компьютер не видит ЭЦП и о способах проверки настроек, мы подробно писали в нашей статье.

Почему КриптоПро не отображает ЭЦП?

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

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

Где на компьютере искать сертификаты ЭЦП?

Сертификат ЭЦП позволяет проверить подлинность подписи, содержит в себе срок её действия и информацию о владельце. Он автоматически загружается в папку с системными файлами. В операционной системе Windows от 7 версии и выше ЭЦП хранится по адресу:

C:UsersПОЛЬЗОВАТЕЛЬAppDataRoamingMicrosoftSystemCertificates. Вместо ПОЛЬЗОВАТЕЛЬ требуется указать наименование используемого компьютера.

Что такое сертификат ЭЦП и зачем он нужен мы рассказали в нашей статье.

Техническая база знаний T-Wiki.ru

Инструменты пользователя

Инструменты сайта

Боковая панель

Главное меню

Решение ошибок АРМ ЛПУ ЭРС

Для облегчения поиска ошибок был создан отдельный раздел для сбора ошибок из АРМ ЭРС, читайте внимательнее подсказки ниже:

Поделиться статьей в:

В случае возникновения ошибки при получении результата обработки: Ошибка вызова сервиса передачи/получения данных VALID_SIGNATURE ЭП действительна; ERROR_BUILDING_CERT_PATH При проверке сертификата ЭП произошла ошибка. Ошибка построения цепочки сертификатов

Причина:

Ошибка возникает из-за нарушения корректности цепочки сертификатов — либо один из сертификатов цепочки просрочен, либо установлен не туда, либо это вообще некорректный сертификат.

Решение:

На рабочее место пользователя с 4.07.22 необходимо ставить в «Личное хранилище»:

Скачиваем и устанавливаем ВСЮ ЦЕПОЧКУ СЕРТИФИКАТОВ уполномоченного лица ФСС:

(eln_prod_Личное.cer устанавливаем в «Личное» остальные два в «Доверенные корневые центры сертификации»)

Убеждаемся что у пользователя есть права на контейнер закрытого ключа учреждения

В случае возникновения ошибки при запуске программы: Unable to build entity manager factory

Причина:

Ошибка возникает в случае отсутствия связи с СУБД PostgreSQL, либо сервер БД недоступен

Решение

Необходимо проверить на сервере БД запущена ли служба Postgresql-9.5 и доступен ли сервер БД, а также порт указанный при установке АРМ ЭРС

В случае возникновения ошибки при запуске программы «Invalid Configuration Location» The configuration area at .. could not be created. Please choose a writable location using the ‘-configuration’ command line option

Причина:

Пользователю недостаточно места для создания и хранения временных файлов, создаваемых программой.

Решение:

Проверьте квотирование места на диске: уберите квотирование либо увеличьте доступное пользователю пространство,

В случае возникновения ошибки при получении результата обработки: Connection could not be allocated. Listener does not currently know of service requested in connect descriptor

Причина:

Сервер ФСС временно не доступен

Решение:

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

В случае возникновения ошибки при получении результата обработки: Отсутствует уполномоченный представитель с таким сертификатом ЭП

Причина:

Выбран неправильный сертификат УЛ ФСС

Решение:

Скачать сертификат Уполномоченного лица ФСС отсюда: https://lk.fss.ru/cert.html установить его в личные и выбрать его в настройках подписи.

В случае возникновения ошибки при получении результата обработки: Ошибка вызова сервиса передачи/получения данных. Could not send Message

Причина:

Сервер ФСС временно не доступен

Решение:

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

В случае возникновения ошибки при установке или обновлении программы «GostCryptography.dll Этому файлу не сопоставлена программа для выполнения этого действия»

Причина:

Возможно причина кроется в сломанных системных файлах

Решение:

Необходимо обновить систему и выполнить команды в командной строке от имени администратора:

После этого необходимо перезагрузиться

Подробнее вы можете прочитать здесь

В случае возникновения «ошибки шифрования» при проставленной галочке :

Причина:

Не применяются настройки шифрования выставленные в настройках ПО

Решение:

Перейти в «C:FssArmErsconfiguration.settings» (для х64 версии)

либо в «C:FssToolsconfiguration.settings» (для x86 версии)

Открыть в блокноте файл: ru.ibs.fss.eln.prefs в конце добавить строчку encryptmessages=1

В случае возникновения «Internal Error COMCryptoAPIClient» :

Причина:

В процессе установки программы библиотека GostCryptography.dll по каким-то причинам не зарегистрировалась

Решение:

В командной строке CMD выполнить (с правами администратора): Для x86 программы

Для x64 программы

В случае возникновения ошибок «Сообщение не найдено» либо бесконечный «Вызов сервиса ФСС» либо «Ошибка вызова сервиса передачи/получения данных Error processing request — getResultByID»

Причина:

Сервис ФСС перегружен, либо некорректна подпись МО

Решение:

Необходимо повторить отправку/запрос позднее. В программе АРМ ЭРС проверьте в настройках подписи корректна ли подпись медицинской организации (МО) либо сертификат ФСС

В случае возникновения «Ошибки дешифрования сообщения. Ошибка при попытке расшифровать сообщение»

Причина:

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

Решение:

Попробуйте совершить операцию позднее.

В крайнем случае проблема может решиться переустановкой криптопровайдера (КриптоПРО или VipnetCSP)

Также в программе АРМ ЭРС проверьте в настройках подписи корректна ли подпись медицинской организации (МО) либо сертификат ФСС

После обновления ПО данная настройка может быть пустой

Также можно попробовать удалить все установленные сертификаты связанные с ФСС и скачать их по данной ссылке: https://disk.yandex.ru/d/nAQmOZ7WZi8S1w

(eln_prod_Личное.cer устанавливаем в «Личное» остальные два в «Доверенные корневые центры сертификации»)

Убеждаемся что у пользователя есть права на контейнер закрытого ключа учреждения

Также можно снять галочку на «Проверять подпись на входящих сообщениях»

В случае возникновения ошибки «вызова сервиса передачи/получения данных»

Причина:

Перебои в работе сервиса взаимодействия ФСС

Решение:

В случае возникновения ошибки «Отсутствует лицензия на осуществление медицинской деятельности»

Причина:

Текст ошибки говорит сам за себя

Решение:

Необходимо проверить введенные в настройках реквизиты организации а также связаться с региональным представителем ФСС

В случае возникновения ошибки «Отсутствует заключенный договор с ТОФ на оказание услуг»

Причина:

Текст ошибки говорит сам за себя

Решение:

Необходимо связаться с региональным представителем ФСС

В случае возникновения ошибки «Internal Error Rollback Exception» при попытке открыть сведения о посещениях

Причина:

Ошибка возникает из-за отсутствующих строках и колонках в БД, программа пытается прочитать данные в несуществующих ячейках

Решение:

Необходимо обновить ПО на рабочем месте, где установлена БД

В случае возникновения ошибки «Unmarchalling Error» при попытке отправить/запросить талон/ЭРС

Причина:

скорее всего неправильно заполнены данные в определенном поле

Решение:

Необходимо изучить текст ошибки

(в данном примере ошибка гласит о том, что введено 10 цифр в поле, где должно быть 12 цифр)

В случае возникновения ошибки «Invalid element in ErsOpenService .. -registerMODate» при попытке отправить/запросить ЭРС

Причина:

Вы используете устаревшую версию программы, введены новые контроли, поля и т.д.

Решение:

Необходимо обновить АРМ ЭРС

В случае возникновения ошибки «ЭЦП неверна SIGNATURE ERROR ЭП Недействительна» при попытке отправить/запросить талон/ЭРС также возникает при запросе счета

Причина:

Внутренняя ошибка программы, из-за которой подпись на талоне не проставилась корректно

Решение:

Необходимо в талоне нажать кнопку «На подписании» затем снова подписать талон кнопкой «Подпись руководителя ЛПУ» (может потребоваться нажать 2 раза)

После этого повторно отправить талон

В случае возникновения ошибки «В настройках соединения указан неправильный порт. Проверьте правильность адреса сервиса в настройках соединения» при попытке отправить/запросить талон/ЭРС

Причина:

Проблема связана с недоступностью (полной неработоспособностью сервиса ФСС)

Решение:

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

В случае возникновения ошибки «Ошибка вызова сервиса передачи/получения данных. Несоответствующий статус для включения талонов в реестр» при попытке включить талоны в реестр

Причина:

Статус талонов в реестре отличается от «Принято в ТОФ»

Решение:

Для решения проблемы нужно убедиться, что статус перечисленных в ошибке талонов, включенных в реестр должен быть — Принято в ТОФ

Часто бывает так, что статус талона в локальной базе может отличаться от статуса в ФСС (для этого можно запросить статус обработки повторно) можно уточнить этот момент у представителя ФСС

В случае возникновения ошибки «Дата постановки на учет должна быть равна началу периода наблюдения» при попытке сохранить ЭРС

Причина:

Дата постановки на учет была забита вручную и скорее всего неправильно

Решение:

Необходимо ввести одинаковую дату постановки на учет и дату начала периода наблюдения через кнопку «Календарь» в поле с датами

В случае возникновения ошибки «Premature end of file

Причина:

Ошибка возникает, когда валидация отправляемого XML-файла не проходит на удаленном сервисе. Проблема на стороне ФСС.

Решение:

В случае возникновения ошибки «Ошибка вызова сервиса передачи/получения данных. 1606: Несоответствующий статус для включения талонов в реестр: Талон» при попытке получить результат обработки счета

Причина:

Для счета не нужно запрашивать результат обработки

Решение:

Для решения проблемы необходимо нажать кнопку «Получить данные об оплате счета»

В случае возникновения ошибки «Не удалось подписать информацию Invalid Iddata=[имя талона]» подписать реестр

Причина:

Некорректно заполнено поле — номер реестра

Решение:

Необходимо удалить пробелы или другие запрещенные символы из номера реестра

В случае возникновения ошибки «The content of element ‘status’ is not complete.» при попытке запросить результат обработки

Причина:

Проблема на стороне сервиса взаимодействия с ФСС

Решение:

Необходимо ждать решения проблемы со стороны ФСС

В случае возникновения ошибки Validator Exception: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed

Причина:

Проблема с SSL сертификатом на стороне ФСС

Решение:

Необходимо обновить ПО, либо подсунуть файл из архива cacerts.zip

в папку с программой/jre/lib/security

В случае возникновения ошибки «Internal error Widget is disposed»

Причина:

Внутренняя ошибка программы

Решение:

Перед любыми действиями делайте резервную копию папки!

Необходимо удалить содержимое папки

C:FssArmErsworkspace.metadata.pluginsorg.eclipse.e4.workbench

После этого перезапустите приложение

В случае возникновения ошибки при отправке реестров «Ошибка вызова сервиса передачи/получения данных. Unmarshalling Error: Длина поля типа #AnonType_bankCheckingAccbillinfo не соответствует ограничению»

Причина:

Ограничение на минимальную длину обязательного поля для реквизитов банка в счете

Решение:

Убедитесь в корректности заполнения реквизитов банковского счета. Смотрите текст ошибки:

р/с минимум 20 символов
наименование банка минимум 4 символа
БИК банка минимум 6 символов

Всем, кому понравился или помог это проект — Вы можете помочь ему развиваться материально: Donate (помощь проекту)

Источник

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Smr

Дата регистрации: 28.01.2011
Сообщений: 55

1С:Предприятие 8.3 (8.3.13.1690)
Бухгалтерия предприятия, редакция 3.0 (3.0.70.30)
Попытка сдать Подтверждение вида деятельности через 1 С Отчетность. Не удалось.
Может кто подсказать, в чем засада?

Не принят, обнаружены ошибки

Идентификатор запроса — 84c9345f-f694-4a07-8016-fdcac855643f
Статус обработки запроса — Ошибка обработки сообщения
Код сообщения SUCCESS — VALID_SIGNATURE ЭП действительна

Обратите внимание при обновлении возникли ошибки:
A certification chain processed correctly but terminated in a root certificate not trusted by the trust provider
Цепочка сертификатов обработана правильно, но один из сертификатов ЦС не имеет доверия от поставщика доверия?!

И, кстати, в форме не заполняется адрес регистрации. Приходится ручками вколачивать.

Сергей Голубев

Дата регистрации: 27.02.2006
Сообщений: 1990

Smr, попробуйте отправить ещё раз. Отчеты начали приниматься вчера ориентировочно после 20 часов.

Smr

Дата регистрации: 28.01.2011
Сообщений: 55

Сегодня снова закинули в ФСС — получили промежуточный протокол:
» Отчет рассматривается ФСС. Окончательный ответ должен быть сформирован по результатам рассмотрения сотрудником ФСС в срок от 1 дня до 2-х недель»

Надеюсь, что это оно самое — подтверждение того, что мы вовремя исполнили свою обязанность по сдаче этого отчета.

Кстати, «засада» была в том, что в Прил . 2 — Справке автоматом не заполняется п.3. место регистрации — т.е. сюда приходится ручками вписывать город и тогда всё проходит.

____
15 лет, как минимум, мы ждали этого счастья!

Сергей Голубев

Дата регистрации: 27.02.2006
Сообщений: 1990

если Место регистрации не заполнено (а оно автоматически не заполняется), то это выявляет ещё до отправки Проверка выгрузки.

Показывать по
10
20
40
сообщений

Наличие ошибок в коде страницы сайта всегда влечет за собой негативные последствия – от ухудшения позиций в ранжировании до жалоб со стороны пользователей. Ошибки валидации могут наблюдаться как на главной, так и на иных веб-страницах, их наличие свидетельствует о том, что ресурс является невалидным. Некоторые проблемы замечают даже неподготовленные пользователи, другие невозможно обнаружить без предварительного аудита, анализа. О том, что такое ошибки валидации и как их обнаружить, мы сейчас расскажем.

Комплексный аудит сайта, что входит, как сделать

Ошибка валидации, что это такое?

Для написания страниц используется HTML – стандартизированный язык разметки, применяемый в веб-разработке. HTML, как любой другой язык, имеет специфические особенности синтаксиса, грамматики и т. д. Если во время написания кода правила не учитываются, то после запуска сайта будут появляться различные виды проблем. Если HTML-код ресурса не соответствует стандарту W3C, то он является невалидным, о чем мы писали выше.

Почему ошибки валидации сайта оказывают влияние на ранжирование, восприятие?

Наличие погрешностей в коде – проблема, с которой необходимо бороться сразу после обнаружения. Поисковые системы «читают» HTML-код, если он некорректный, то процесс индексации и ранжирования может быть затруднен. Поисковые роботы должны понимать, каким является ресурс, что он предлагает, какие запросы использует. Особо критичны такие ситуации для ресурсов, имеющих большое количество веб-страниц.

Как проверить ошибки валидации?

Как проверить ошибки валидации
Для этой работы используется либо технический аудит сайта, либо валидаторы, которые ищут проблемы автоматически. Одним из самых популярных является сервис The W3C Markup Validation Service, выполняющий сканирование с оглядкой на World Wide Web Consortium (W3C). Рассматриваемый валидатор предлагает три способа, с помощью которых можно осуществить проверку сайта:

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

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

Существуют другие сервисы, позволяющие выполнить проверку валидности кода:

  • Dr. Watson. Проверяет скорость загрузки страниц, орфографию, ссылки, а также исходный код;
  • InternetSupervision.com. Отслеживает производительность сайта, проверяет доступность HTML.

Плагины для браузеров, которые помогут найти ошибки в коде

Решить рассматриваемую задачу можно с помощью плагинов, адаптированных под конкретный браузер. Можно использовать следующие инструменты (бесплатные):

  • HTML Validator для браузера Firefox;
  • HTML Validator for Chrome;
  • Validate HTML для Firefox.

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

Как исправить ошибку валидации?

Как исправить ошибку валидации
В первую очередь нужно сосредоточить внимание на слабых местах, связанных с контентом – это то, что важно для поисковых систем. Если во время сканирования было выявлено более 25 проблем, то их нельзя игнорировать из-за ряда причин:

  • частичная индексация;
  • медленная загрузка;
  • баги, возникающие во время непосредственной коммуникации пользователя с ресурсом.

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

Технический и SEO-аудит

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

В заключение

На всех сайтах наблюдаются ошибки валидации – их невозможно искоренить полностью, но и оставлять без внимания не стоит. Например, если провести проверку сайтов Google или «Яндекс», то можно увидеть ошибки, однако это не означает, что стоит вздохнуть спокойно и закрыть глаза на происходящее. Владелец сайта должен ставить во главу угла комплексное развитие, при таком подходе ресурс будет наполняться, обновляться и «лечиться» своевременно. Если проблем мало, то можно попробовать устранить их своими силами или с помощью привлечения стороннего частного специалиста. В остальных случаях лучше заказать услугу у проверенного подрядчика.

Что такое ошибки валидации и как их исправить

Просмотров 1.7к. Опубликовано 19.12.2022
Обновлено 19.12.2022

Каждый сайт, который создает компания, должен отвечать принятым стандартам. В первую очередь затем, чтобы он попадал в поисковую выдачу и был удобен для пользователей. Если код страниц содержит ошибки, неточности, он становится “невалидным”, то есть не соответствующим требованиям. В результате интернет-ресурс не увидят пользователи или информация на нем будет отображаться некорректно. 

В этой статье рассмотрим, что такое валидность, какие могут быть ошибки в HTML-разметке и как их устранить.

Содержание

  1. Что такое HTML-ошибка валидации и зачем она нужна
  2. Чем опасны ошибки в разметке
  3. Как проверить ошибки валидации
  4. Предупреждения
  5. Ошибки
  6. Пример прохождения валидации для страницы сайта
  7. Как исправить ошибку валидации
  8. Плагины для браузеров, которые помогут найти ошибки в коде
  9. Коротко о главном

Что такое HTML-ошибка валидации и зачем она нужна

Под понятием  “валидация” подразумевается процесс онлайн-проверки HTML-кода страницы на соответствие стандартам w3c. Эти стандарты были разработаны Организацией всемирной паутины и стандартов качества разметки. Сама организация продвигает идею унификации сайтов по HTML-коду — чтобы каждому пользователю, вне зависимости от браузера или устройства, было удобно использовать ресурс.

Если код отвечает стандартам, то его называют валидным. Браузеры могут его прочитать, загрузить страницы, а поисковые системы легко находят страницу по соответствующему запросу. 

Чем опасны ошибки в разметке

Ошибки валидации могут разными — видимыми для глаза простого пользователя или такими, которые можно засечь только с помощью специальных программ. В первом случае кроме технических проблем, ошибки в разметке приводят к негативному пользовательскому опыту. 

К наиболее распространённым последствиям ошибок в коде HTML-разметки также относят сбои в нормальной работе сайта и помехи в продвижении ресурса в поисковых системах.

Рассмотрим несколько примеров, как ошибки могут проявляться при работе:

  • Медленно подгружается страница 

Согласно исследованию Unbounce, более четверти пользователей покидают страницу, если её загрузка занимает более 3 секунд, ещё треть  уходит после 6 секунд;

  • Не видна часть текстовых, фото и видео-блоков 

Эта проблема делает контент для пользователей неинформативным, поэтому они в большинстве случаев уходят со страницы, не досмотрев её до конца;

  • Страница может остаться не проиндексированной

Если поисковый робот распознает недочёт в разметке, он может пропустить страницу и прервать её размещение в поисковых системах;

  • Разное отображение страниц на разных устройствах

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

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

Как проверить ошибки валидации

Владельцы ресурсов используют 2 способа онлайн-проверки сайтов на наличие ошибок — технический аудит или использование валидаторов. 

Первый случай подходит для серьёзных проблем и масштабных сайтов. Валидаторами же пользуются ежедневно. Наиболее популярный — сервис The W3C Markup Validation Service. Он сканирует сайт и сравнивает код на соответствие стандартам W3C. Валидатор выдаёт 2 типа несоответствий разметки стандартам W3C: предупреждения и ошибки. 

Давайте рассмотрим каждый из типов чуть подробнее.

Предупреждения

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

Тем не менее, предупреждения всё равно нужно устранять, так как из-за них сайт может работать медленнее — например, по сравнению с конкурентами с такими же сайтами.

Примером предупреждения может быть указание на отсутствие тега alt у изображения. 

Ошибки

Ошибки  —  это те проблемы, которые требуют обязательного устранения. 

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

Распространённым примером ошибки может быть отсутствие тега <!DOCTYPE html> в начале страницы, который помогает информации преобразоваться в разметку. 

Пример прохождения валидации для страницы сайта

Рассмотрим процесс валидации на примере сайта avavax.ru, который создали на WordPress.

пример ошибки валидации

В результате проверки валидатор выдал 17 замечаний. После анализа отчета их можно свести к 3 основным:

  1. атрибут ‘text/javascript’ не требуется при подключении скрипта;
  2. атрибут ‘text/css’ не требуется при подключении стиля;
  3. у одного из элементов section нет внутри заголовка h1-h6.

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

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

Добавление кода в файл

Для этого на хук wp_loaded нужно повесить функцию output_buffer_start(), которая загрузит весь генерируемый код html в буфер. При выводе в буфер вызывается функция output_callback($tag), которая просматривает все теги, находит нежелательные атрибуты с помощью регулярных выражений и заменяет их пробелами. Затем на хук ‘shutdown вешается функция output_buffer_end(), которая возвращает обработанное содержимое буфера.

Для исправления семантики на сайте нужно использовать заголовки. Валидатор выдаёт предупреждение на секцию about, которая содержит фото и краткий текст. Валидатор требует, чтобы в каждой секции был заголовок. Для исправления предупреждения нужно добавить заголовок, но сделать это  так, чтобы его не было видно пользователям:

  1. Добавить заголовок в код:  <h3>Обо мне</h3>

Отключить отображение заголовка:

1 #about h3 {
2 display: none;
3 }

После этой части заголовок будет в коде, но валидатор его увидит, а посетитель — нет. 

За 3 действия удалось убрать все предупреждения, чтобы качество кода устроило валидатор. Это подтверждается зелёной строкой с надписью: “Document checking completed. No errors or warnings to show”.

Как исправить ошибку валидации

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

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

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

Плагины для браузеров, которые помогут найти ошибки в коде

Для поиска ошибок валидации можно использовать и встроенные в браузеры плагины. Они помогут быстро находить неточности еще на этапе создания кода. 

Для каждого браузера есть свой адаптивный плагин:

  • HTML Validator для браузера Firefox;
  • HTML Validator for Chrome;
  • HTML5 Editor для Opera.

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

Коротко о главном

Валидация — процесс выявления проблем с HTML-разметкой сайта и ее соответствия стандартам W3C. Это унифицированные правила, с помощью которых сайт может нормально работать и отображаться и для поисковых роботов, и для пользователей. 

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

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

Даже у крупных сайтов с миллионной аудиторией, например, Яндекс.Дзен или ВКонтакте, есть проблемы с кодом. Но комплексный подход к решению проблем помогает устранять серьёзные моменты своевременно. Нужно развивать сайт всесторонне, чтобы получить результат от его существования и поддержки. Если самостоятельно разобраться с проблемами не получается, не стоит “доламывать” — лучше обратиться за помощью к профессионалам, например, агентствам по веб-аудиту. 

Пользователи часто передают в приложение некорректные данные. Такое происходит либо из злого умысла, либо по ошибке. Сто́ит проверять данные на соответствие бизнес-требованиям.

Эти бизнес-правила влияют на каждый уровень приложения. Веб-интерфейс сообщает пользователю подробные и локализованные сообщения об ошибках. Уровни бизнес-логики и хранения должны проверять приходящие от клиентов значения, перед отправкой в хранилище. База данных SQL делает окончательную проверку, чтобы гарантировать целостность хранимой информации.

Эти задачи поможет решить Bean Validation. Он интегрирован со Spring и Spring Boot. Hibernate Validator считается эталонной реализацией Bean Validation.

Идея Bean Validation в том, чтобы определять такие правила, как «Это поле не может быть null» или «Это число должно находиться в заданном диапазоне» с помощью аннотаций. Это гораздо проще, чем постоянно писать условные операторы проверок.

Hibernate Validator также задаёт правила валидации с помощью аннотаций над полями класса. Этот декларативный подход не загрязняет код. При передаче размеченного таким образом объекта класса в валидатор, происходит проверка на ограничения.

Добавьте стартер в проект, чтобы включить валидацию:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Актуальная версия Spring Boot в Maven

Спонсор поста

Используемые версии

Java 17
Spring Boot 2.7.1

История изменений статьи

26.02.2022: Обновил версию Java с 11 до 17. Также обновил версию Spring Boot до 2.6.3
29.06.2022: Spring Boot – 2.7.1. Добавил коллекцию Postman с тестами.

Валидация в контроллерах

Обычно данные сначала попадают в контроллер. У входящего HTTP запроса возможно проверить следующие параметры:

  • тело запроса.
  • переменные пути (например, id в /foos/{id}).
  • параметры запроса.

Рассмотрим каждый из них подробнее.

Валидация тела запроса

Тело запроса POST и PUT обычно содержит данные в формате JSON. Spring автоматически сопоставляет входящий JSON с объектом Java.

Разметим сущность с помощью аннотаций валидации.

public class PersonDto {

    private Long id;

    @NotBlank
    private String name;

    @Min(1)
    @Max(10)
    private int numberBetweenOneAndTen;

    @Pattern(regexp = "^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(.(?!$)|$)){4}$")
    private String ipAddress;

    // getters and setters

}

Все основные аннотации мы рассмотрим позднее, но по названиям довольно легко понять, какое условие они проверяют:

  • Поле name не должно быть пустым или null.
  • Поле numberBetweenOneAndTen должно́ находиться в диапазоне от 1 до 10, включительно.
  • Поле ipAddress должно содержать строку в формате IP-адреса.

Достаточно добавить для входящего параметра personDto аннотацию @Valid, чтобы передать объект в валидатор. Выполнение метода контролера начнётся только, если объект пройдёт все проверки.

@RestController
@RequestMapping("/api/person")
public class PersonController {

    @PostMapping
    public ResponseEntity<String> valid(@Valid @RequestBody PersonDto personDto) {
        return ResponseEntity.ok("valid");
    }

}

Вызываем наш POST метод и передаём в него не валидные данные.

Postman возвращает нам ошибку, а в консоли видим исключение. Оно сообщает нам о двух ошибках валидации.

Исключение MethodArgumentNotValidException выбрасывается, когда объект не проходит проверку. По умолчанию Spring преобразует это исключение в HTTP статус 400.

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

Проверка переменных пути и параметров запроса

При проверке переменных пути и параметров запроса не проверяются сложные Java-объекты, так как path-переменные и параметры запроса являются примитивными типами, такими как int, или их аналогами: Integer или String.

Вместо аннотации поля класса, как описано выше, добавляют аннотацию ограничения (в данном случае @Min) непосредственно к параметру метода в контроллере:

@Validated
@RestController
@RequestMapping("/api/person")
public class PersonController {

    @GetMapping("{id}")
    public ResponseEntity<String> getById(
            @PathVariable("id") @Min(0) int personId
    ) {
        return ResponseEntity.ok("valid");
    }

    @GetMapping
    public ResponseEntity<String> getByName(
            @RequestParam("name") @NotBlank String name
    ) {
        return ResponseEntity.ok("valid");
    }

}

Обратите внимание, что необходимо добавить @Validated в контроллер на уровне класса, чтобы проверять параметры метода. В этом случае аннотация @Validated устанавливается на уровне класса, даже если она присутствует на методах.

В отличии валидации тела запроса, при неудачной проверки параметра вместо метода MethodArgumentNotValidException будет выброшен ConstraintViolationException. По умолчанию последует ответ со статусом HTTP 500 (Internal Server Error), так как Spring не регистрирует обработчик для этого исключения по умолчанию.

Валидация в сервисном слое

Можно проверять данные на любых других компонентах Spring. Для этого используется комбинация аннотаций @Validated и @Valid.

@Service
@Validated
public class PersonService {

    public void save(@Valid PersonDto personDto) {
        // do something
    }

}

Напомню, как выглядит наша сущность:

public class PersonDto {

    private Long id;

    @NotBlank
    private String name;

    @Min(1)
    @Max(10)
    private int numberBetweenOneAndTen;

    @Pattern(regexp = "^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(.(?!$)|$)){4}$")
    private String ipAddress;

    // getters and setters

}

Казалось бы, пример такой же как и в контроллере и логично ожидать MethodArgumentNotValidException, но будет выброшен ConstraintViolationException и 500 ошибка.

Проверка аргументов метода

Помимо объкетов можно проверять примитивы и их обертки, выступающие в виде аргументов метода.

Валидация сущностей JPA

Persistence Layer – это последняя линия проверки данных. По умолчанию Spring Data использует Hibernate, который поддерживает Bean Validation из коробки.

Допустим, необходимо хранить объекты нашего класса PersonDto в базе данных. Когда репозиторий пытается сохранить не валидный PersonDto, чьи аннотации ограничений нарушаются, выбрасывается ConstraintViolationException.

Bean Validation запускается Hibernate только после того как EntityManager вызовет flush().

Для отключения валидации в репозиториях установите свойство Spring Boot spring.jpa.properties.javax.persistence.validation.mode равным null.

Где проводить валидацию?

На мой взгляд, лучшее место для основной валидации это сервисный слой. У этого есть несколько причин:

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

Конкретизация ошибок

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

Я подробно описывал обработку исключений в REST API в отдельной статье. Здесь мы разберем только обработку исключений валидации.

Сначала определим структуру сообщения с ошибкой. Назовем ее ValidationErrorResponse. И этот класс содержит список объектов Violation:

@Getter
@RequiredArgsConstructor
public class ValidationErrorResponse {

    private final List<Violation> violations;

}

@Getter
@RequiredArgsConstructor
public class Violation {

    private final String fieldName;
    private final String message;

}

Затем создаем ControllerAdvice, который обрабатывает все ConstraintViolationExventions, которые пробрасываются до уровня контроллера. Чтобы отлавливать ошибки валидации и для тел запросов, мы также будем перехватывать и MethodArgumentNotValidExceptions:

@ControllerAdvice
public class ErrorHandlingControllerAdvice {

    @ResponseBody
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ValidationErrorResponse onConstraintValidationException(
            ConstraintViolationException e
    ) {
        final List<Violation> violations = e.getConstraintViolations().stream()
                .map(
                        violation -> new Violation(
                                violation.getPropertyPath().toString(),
                                violation.getMessage()
                        )
                )
                .collect(Collectors.toList());
        return new ValidationErrorResponse(violations);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ValidationErrorResponse onMethodArgumentNotValidException(
            MethodArgumentNotValidException e
    ) {
        final List<Violation> violations = e.getBindingResult().getFieldErrors().stream()
                .map(error -> new Violation(error.getField(), error.getDefaultMessage()))
                .collect(Collectors.toList());
        return new ValidationErrorResponse(violations);
    }

}

Здесь информацию о нарушениях из исключений переводится в нашу структуру данных ValidationErrorResponse.

Можно изменить сообщение об ошибке с помощью параметра message у любой аннотации валидации.

@Pattern(
        regexp = "^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(.(?!$)|$)){4}$",
        message = "Не соответствует формату IP адреса"
)
private String ipAddress;

Валидация конфигурации приложения

Spring Boot аннотация @ConfigurationProperties используется для связывания свойств из application.properties с Java объектом.

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

@Validated
@ConfigurationProperties(prefix="app.properties")
class AppProperties {

  @NotEmpty
  private String name;

  @Min(value = 7)
  @Max(value = 30)
  private Integer reportIntervalInDays;

  @Email
  private String reportEmailAddress;

  // getters and setters
}

При попытке запуска с недействительным адресом электронной почты получаем ошибку:

***
APPLICATION FAILED TO START
***

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException:
  Failed to bind properties under 'app.properties' to
  io.reflectoring.validation.AppProperties failed:

    Property: app.properties.reportEmailAddress
    Value: manager.analysisapp.com
    Reason: must be a well-formed email address

Action:

Update your application's configuration

Стандартные ограничения

Библиотека javax.validation имеет множество аннотаций для валидации.

Аннотации имеют атрибуты, которые позволяют производить более тонкую настройку проверки, но каждая аннотация имеет следующие поля:

  • message – указывает на ключ свойства в ValidationMessages.properties, который используется для отправки сообщения в случае нарушения ограничения.
  • groups – позволяет определить, при каких обстоятельствах будет срабатывать эта проверка. О группах проверки поговорим позже.
  • payload – позволяет определить полезную нагрузку, которая будет передаваться сс проверкой.
  • @Constraint – указывает на реализацию интерфейса ConstraintValidator.

Рассмотрим самые популярные ограничения:

  • @NotNull — аннотированный элемент не должен быть null. Принимает любой тип.
  • @Null — аннотированный элемент должен быть null. Принимает любой тип.
  • @NotBlank — аннотированный элемент не должен быть null и должен содержать хотя бы один непробельный символ. Принимает CharSequence.
  • @NotEmpty — аннотированный элемент не должен быть null или пустым. Поддерживаемые типы:
    • CharSequence
    • Collection. Оценивается размер коллекции
    • Map. Оценивается размер мапы
    • Array. Оценивается длина массива
  • @Size — размер аннотированного элемента должен быть между указанными границами, включая сами границы. null элементы считаются валидными. Поддерживаемые типы:
    • CharSequence. Оценивается длина последовательности символов
    • Collection. Оценивается размер коллекции
    • Map. Оценивается размер мапы
    • Array. Оценивается длина массива
  • @AssertTrue проверяет, что аннотированное значение свойства истинно.
  • @Email подтверждает, что аннотированное свойство является действительным адресом электронной почты.
  • @Positive и @PositiveOrZero применяются к числовым значениям и подтверждают, что они строго положительные или положительные, включая 0.
  • @Negative и @NegativeOrZero применяются к числовым значениям и подтверждают, что они строго отрицательные или отрицательные, включая 0.
  • @Past и @PastOrPresent проверяют, что значение даты находится в прошлом или прошлом, включая настоящее.
  • @Future и @FutureOrPresent подтверждают, что значение даты находится в будущем или в будущем, включая настоящее.

Различия межу @NotNull, @NotEmpty и @NotBlank

@NotBlank применяется только к строкам и проверяет, что строка не пуста и не состоит только из пробелов.

@NotNull применяется к CharSequence, Collection, Map или Array и проверяет, что объект не равен null. Но при этом он может быть пуст.

@NotEmpty применяется к CharSequence, Collection, Map или Array и проверяет, что он не null имеет размер больше 0.

Аннотация @Size(min=6) пропустит строку состоящую из 6 пробелов и/или символов переноса строки, а @NotBlank не пропустит.

Группы валидаций

Некоторые объекты участвуют в разных вариантах использования. Возьмем типичные операции CRUD: при обновлении и создании, скорее всего, будет использоваться один и тот же класс. Тем не менее, некоторые валидации должны срабатывать при различных обстоятельствах:

  • только перед созданием
  • только перед обновлением
  • или в обоих случаях

Функция Bean Validation, которая позволяет нам внедрять такие правила проверки, называется “Validation Groups”. Все аннотации ограничений имеют поле groups. Это поле используется для передачи любых классов, каждый из которых определяет группу проверки.

Для нашего примера CRUD определим два маркерных интерфейса OnCreate и OnUpdate:

public interface Marker {

    interface OnCreate {}

    interface OnUpdate {}

}

Затем используем эти интерфейсы с любой аннотацией ограничения:

public class PersonDto {

  @Null(groups = Marker.OnCreate.class)
  @NotNull(groups = Marker.OnUpdate.class)
  private Long id;

  // ... ... ... ... ...

}

Это позволит убедиться, что id пуст при создании и заполнен при обновлении. Spring поддерживает группы проверки только с аннотацией @Validated

@Validated
@RestController
@RequestMapping("/api/group-valid/person")
public class PersonControllerGroupValid {

    @PostMapping
    @Validated({Marker.OnCreate.class})
    public ResponseEntity<String> create(@RequestBody @Valid PersonDto personDto) {
        return ResponseEntity.ok("valid");
    }

    @PutMapping
    @Validated(Marker.OnUpdate.class)
    public ResponseEntity<String> update(@RequestBody @Valid PersonDto personDto) {
        return ResponseEntity.ok("valid");
    }

}

Обратите внимание, что аннотация @Validated применяется ко всему классу. Чтобы определить, какая группа проверки активна, она также применяется на уровне метода.

Использование групп проверки может легко стать анти-паттерном.

При использовании групп валидации сущность должна знать правила валидации для всех случаев использования (групп), в которых она используется.

Создание своего ограничения

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

Напишем свою аннотацию, которая будет проверять, что строка начинается с большой буквы. Сначала создаем аннотацию @CapitalLetter:

@Target({ FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = CapitalLetterValidator.class)
@Documented
public @interface CapitalLetter {

  String message() default "{CapitalLetter.invalid}";

  Class<?>[] groups() default { };

  Class<? extends Payload>[] payload() default { };

}

Реализация валидатора выглядит следующим образом:

public class CapitalLetterValidator implements ConstraintValidator<CapitalLetter, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value != null && !value.isEmpty()) {
            return Character.isUpperCase(value.charAt(0));
        }
        return true;
    }

}

Теперь можно использовать аннотацию @CapitalLetter, как и любую другую аннотацию ограничения.

public class PersonDto {

  // ... ... ... ... ...

  @NotBlank
  @CapitalLetter
  private String name;

  // ... ... ... ... ...

}

Принудительный вызов валидации

Для принудительного вызова проверки, без использования Spring Boot, создайте валидатор вручную.

public class ProgrammaticallyValidatingService {

  public void validateInput(PersonDto personDto) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<personDto>> violations = validator.validate(personDto);
    if (!violations.isEmpty()) {
      throw new ConstraintViolationException(violations);
    }
  }

}

Тем не менее, Spring Boot предоставляет предварительно сконфигурированный экземпляр валидатора. Внедрив этот экземпляр в сервис не придется создавать его вручную.

@Service
public class ProgrammaticallyValidatingService {

  private Validator validator;

  public ProgrammaticallyValidatingService(Validator validator) {
    this.validator = validator;
  }

  public void validateInputWithInjectedValidator(PersonDto personDto) {
    Set<ConstraintViolation<PersonDto>> violations = validator.validate(personDto);
    if (!violations.isEmpty()) {
      throw new ConstraintViolationException(violations);
    }
  }

}

Резюмирую

Валидация это неотъемлимая часть бизнес логики. Используя зависимость spring-boot-starter-validation, мы можем облегчить себе работу.

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

Стоит возвращать клиенту понятное описание ошибки валидации, используя @ControllerAdvice.

Номер
Ошибка
Решение

1
Ошибка регистрации пациента для свидетельства […]
Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус»

2
Не найден CDA-документ
Повторить процедуру формирования и подписания ЭД

3
CertificateType certificateType, Decimal certificateId, String certificateIdString, Int32 maxTimeoutMs, ProcessingContext processingContext
Не заполнен / некорректно заполнен раздел «Профессиональное образование» или «Сертификаты» регистра кадров.
Необходимо проверить корректность введения данных в разделе «Регистр кадров» (данные подтягиваются из модуля «Регистр медицинских работников»). Профессиональное образование и сертификаты

4

Ошибка при формирование ЭД свидетельства о смерти:

System.Exception: Ошибка регистрации пациента для свидетельства #11732280240: {«Message»:[«Неправильный идентификатор системы»]}

at CdaGetter.Middleware.GetCdaMiddleware.GetCdaAsyncCore

Неправильный идентификатор системы / Отсутствует связь с МИС.
Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус», указав OID организации и код мединфо.

5

Exception EOleException in module p8561vcl.bpl at 0046E539.

Параметр задан неверно.

Некорректно заданы настройки криптопровайдера или установлена не поддерживаемая версия.
Если на ПК установлен Крипто-Про и VipNet CSP, то в VipNet CSP в меню «Дополнительно» снять галочку с опции «Поддержка работы VipNet CSP через Microsoft CryptoAPI» 2.) Если VipNet CSP отсутсвует, переустановить Крипто-Про.

6
Данные документа идентичны переданным ранее
Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус» с указанием, какие именно изменения вносились в свидетельство.

7
Ожидание CDA по свидетельству продлилось больше 30000.
Системная ошибка Нетрики. Повторить процедуру формирования и подписания ЭД

8
HTTP request failed
Техническая ошибка на стороне сервисов. Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус». 

9
System.Exception: Ошибка при формировании блока сведений по сотруднику […]
Расхождение данных ФРМО / ФРМР и данных в модулях «Паспорт ЛПУ», «Регистр медицинских работников» — раздел «Регистром кадров».
Необходимо проверить по сотруднику данные по исполнениям должностей. Данные в «Регистре медицинских работников, раздел Регистр кадров» должны полностью совпадать с данными в продуктивном контуре ФРМР (Дата начала, Должность, Структурное подразделение, кол-во ставок, Тип занятости). После приведения данных в соответствие, повторно сформировать электронный документ.

10

Поле «State» заполнено некорректно.

DeadInfo.AddressDto.State»,»Поле «State» заполнено некорректно.

Ошибка связана с некорректным заполнением Адреса, (регион. улица).
Необходимо заполнять адрес согласно справочнику «Географические понятия»

11
The element type «hr» must be terminated by the matching end-tag «</hr>».
Ошибка связана с несоответствием данных в ФРМР и регистром кадров (регистром медицинских работников).
Необходимо актуализировать информацию на ФРМР. Данные должны соответствовать регистру медицинских работников. После — повторить процедуру создания электронного документа и его подписание.

12
Сертификаты недоступны. В окне выбора сертификатов нет доступных записей.
Не выполнены рекомендации, указанные в руководстве пользователя по пункту «Подготовительный этап работ».
Необходимо выполнить пункт 3.1.3.1 «Подготовительный этап работ» руководства пользователя

13
Object reference not set to an instance of an object.
Несоответствие данных в ФРМО и ФРМР с «Регистром медицинских работников», «Паспорт ЛПУ».
Необходимо актуализировать информацию на ФРМР и ФРМО. Данные должны соответствовать модулю «Регистр медицинских работников» и «Паспорт ЛПУ». После — повторить процедуру создания электронного документа и его подписание.

14
Документ заблокирован другим пользователем
Ошибка говорит о том, что документ открыт у других пользователей. Необходимо закрыть документ под другими пользователями и повторить процедуру формирования и подписания ЭД.

15
В сертификате отсутствует атрибут «OGRN»
При использовании ЭЦП руководителя не обнаружен реквизит «ОГРН». Необходимо подписывать ЭЦП, содержащей указанный атрибут. 

16
Поле «Middle Name» заполнено некорректно. Recipient.Person.HumanName.MiddleName
Во вкладке «Получатель» некорректно заполнено поле «Фамилия», «Имя» или «Отчество». Необходимо внести корректировки на вкладке «Получатель»: некорректно заполнено поле «Фамилия», «Имя» или «Отчество».

17
Ошибка поиска должности (…) сотрудника […] на дату XX.XX.XXXX в регистре кадров»
У сотрудника (…) на XX.XX.XXXX нет действующей должности ‘….’. Необходимо указать в свидетельстве одну из должностей, которая действует на эту дату. 

18

System.Exception: Подпись врача не найдена.

at CdaSender.Middleware.SendMiddleware.GetRequestDataAsync(Decimal rn, CertificateType certificateTy

Ошибка возникает по причине некорректного указания должности для сотрудников, заполненных по полям «Лицо, заполнившее свидетельство», «Лицо, выдавшее свидетельство», «Лицо, установившее смерть».
Вкладка «Медицинский персонал». Для сотрудников, указанных в полях «Лицо, заполнившее свидетельство», «Лицо, выдавшее свидетельство», «Лицо, установившее смерть» запрещено указывать должности, относящиеся к блоку «Руководители медицинских организаций». Необходимо внести корректировки по полю «Должность». ФЛК на стороне подсистемы «Демография» будет доработан в ближайшее время.

19
RUNTIME_ERROR; Message: Непредвиденная ошибка
Подобного рода ошибки возникают в тот момент, когда ЭД был отправлен в ФРЭМД, но при этом федеральный сервис был в этот момент не доступен. При этом в сервисе Нетрики происходит автоматическая переотправка таких документов. Со стороны пользователя дополнительных действий не требуется. Необходимо дождаться статуса документа, когда он либо будет «Принят ЕГИСЗ», либо «Ошибка ЕГИСЗ» (с описание корректной причины отказа в принятии документа). Если в «Журнале сообщений» нет записей, необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус».

20
Неверный СНИЛС = ошибка в вычислении контрольной суммы
Не пройдена проверка на соблюдение контрольной суммы указанного СНИЛС. Необходимо произвести корректировки в поле «СНИЛС». ФЛК на стороне подсистемы «Демография» будет доработан в ближайшее время.

21
Неверный формат SOAP-сообщения ответа поставщика (unmarshalling): The element type «hr» must be terminated by the matching end-tag «</hr>».
Отсутствие доступа к федеральному сервису в момент отправки документа. Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка автоматически со стороны интеграционного шлюза.

22
Поле Id Document Type заполнено некорректно. Recipient.Person.DocumentsDto[1].IdDocumentType

Некорректно указан тип документа, удостоверяющего личность. Необходимо внести корректировки по полю «Тип документа, удостоверяющего личность».

23
Поле ‘Birth Area’ заполнено некорректно. NbInfo.BirthArea.
Не заполнено поле «Местность» блока «Адреса». Документ «Свидетельство о рождении», на вкладке «Даные ребенка» необходимо указать «Местность». 

24
[«Указан некорректный номер Медицинского свидетельства о рождении. Допустимо использовать значение, соответствующее регулярному выражению ^[2]{1}[0-9]{8,9}$. DocN»]
С 1.03.2022 введена новая нумерация медицинских свидетельств о рождении. В связи с этим свидетельства со старыми номерами, не отправленные до 1 марта, невозможно выгрузить в региональную систему Нетрика. Выгружайте свидетельства, выданные после 1 марта.

25
Ошибка отправки:
<s:Envelope xmlns:s=»http://schemas.xmlsoap.org/soap/envelope/»><s:Body><s:Fault><faultcode>s:Client</faultcode><faultstring xml:lang=»ru-RU»>Создатель этой ошибки не указал Reason.</faultstring><detail><RequestFault xmlns=»http://schemas.datacontract.org/2004/07/N3.EMK.Dto.Common» xmlns:i=»http://www.w3.org/2001/XMLSchema-instance»><PropertyName/><Message>Произошла техническая ошибка</Message><ErrorCode>99</ErrorCode><Errors/></RequestFault></detail></s:Fault></s:Body></s:Envelope>

Техническая ошибка. Необходимо заново нажать на документе ПКМ — Электронный документ — Сформировать и отправить ЭД — ОК.

При этом статус документа должен быть автоматически сменён на «Передача данных в ЕГИСЗ»

26
Code: NOT_UNIQUE_PROVIDED_ID; Message: Документ с идентификатором ‘…’ уже зарегистрирован
Данный документ был успешно зарегистрированы в РЭМД, но статус от федерального сервиса не пришел. При этом в сервисе Нетрики происходит автоматическая переотправка таких документов. Со стороны пользователя дополнительных действий не требуется. Необходимо дождаться статуса документа, когда он либо будет «Принят ЕГИСЗ», либо «Ошибка ЕГИСЗ» (с описание корректной причины отказа в принятии документа). Если в «Журнале сообщений» нет записей, необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус».

27
Code: PERSON_POST_IN_FRMR_MISMATCH; Message: Указанная должность сотрудника не соответствует занимаемой им должности в организации […] на дату создания документа […] по данным ФРМР. Сотрудник с индексом

Расхождение данных на продуктивном контуре ФРМР и данных в подсистеме «Демография» по блоку «Медперсонал».

Необходимо проверить сведения по сотрудникам в разделе «Регистр кадров»:

  • Исполнение должности. Должность работника МО

Данные в «Регистре кадров» должны полностью совпадать с данными в продуктивном контуре ФРМР на дату выдачи свидетельства. После приведения данных в соответствие, повторно сформировать электронный документ. 

28
PERSON_CARD_NOT_FOUND; Message: По данным REST-службы ФРМР на дату создания документа […] отсутствует личное дело сотрудника с индексом [0]

Расхождение данных на продуктивном контуре ФРМР и данных в подсистеме «Демография» по блоку «Медперсонал».

Необходимо проверить сведения по сотрудникам в разделе «Регистр кадров»:

  • ФИО
  • Дата рождения
  • Пол
  • СНИЛС
  • Исполнение должности. Должность работника МО
  • Исполнение должности. Структурное подразделение
  • Профессиональное образование. Специальность

Данные в «Регистре кадров» должны полностью совпадать с данными в продуктивном контуре ФРМР на дату выдачи свидетельства. После приведения данных в соответствие, повторно сформировать электронный документ. 

29
System.Exception: Ошибка регистрации пациента для свидетельства #: {«Message»:[«Rest Request to MPI return status code BadRequest. Content: {«resourceType»:»OperationOutcome»,»issue»:[{«severity»:»error»,»code»:»value»,»details»:{«coding»:[{«system»:»http://hl7.org/fhir/issue-type»,»code»:»value»}]},»diagnostics»:»Parameter Patient.BirthDate content is invalid»},{«severity»:»error»,»diagnostics»:»Parameter Patient.BirthDate content is invalid»}]}»]}
Ошибка может возникает в случае, если личность пациента не установлена.
Выгрузка свидетельств для пациентов с неустановленной личностью в данный момент не поддерживается федеральной системой. В случае, если личность пациента не установлена, свидетельство не подлежит выгрузке в формате электронного документа.

30
System.Exception: Ошибка регистрации пациента для свидетельства #: {«Message»:[«Rest Request to MPI return status code Forbidden. Content: {«resourceType»:»OperationOutcome»,»issue»:[{«severity»:»error»,»code»:»forbidden»,»details»:{«coding»:[{«system»:»http://hl7.org/fhir/issue-type»,»code»:»forbidden»}]},»diagnostics»:»Unauthorized»},{«severity»:»error»,»diagnostics»:»Unauthorized»}]}»]}
Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус»

31
Code: FILE_WAS_NOT_SENT; Message: РМИС/МИС не передала файл ЭМД
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

32
callback:
Code: GET_DOCUMENT_FILE_ERROR; Message: Сервис предоставляющей ИС не доступенjava.lang.IllegalArgumentException: Невозможно вызвать операцию getDocumentFile callback-сервиса РМИС версии 3.0. Адрес сервиса: https://ips.rosminzdrav.ru/644401e0fba9a. Ошибка: connect timed out. Тип ошибки: SocketTimeoutException
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

33
callback:
Доступ к сервису временно запрещён — для системы, соответствующей идентификатору c4e06f16-7ff5-4610-b664-04180756f025, превышен лимит запросов к сервису
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

34
В случае возникновения ошибки: callback: Code: VALIDATION_ERROR; Message: Ошибки валидации в ФРМСС:[code: MSSCERT, description: Внутренняя ошибка сервиса ФРМСС, уникальный идентификатор ошибки: aa21f6cc-55ed-4e15-a25c-931d71d48004].
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

35
Code: PATIENT_CREATION_ERROR; Message: Внутренняя ошибка ГИП при создании пациента
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

36
Code: INTERNAL_ERROR; Message: Внутренняя ошибка системы
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

37
System.Exception: Error while executing SQL non query: ORA-20103: Недопустимо изменение параметра ID_PATIENT
Если по свидетельству был получен CDA-документ, а после были внесены правки по пациенту (умершему), то для повторного переформирования электронного документа необходимо обратиться к сотрудникам МИАЦ для внесения изменений в Регистре пациентов (Нетрика), после изменений данных в их системе, переформировывать CDA в Демографии и заново повторить отправку документа

38
System.Exception: Ошибка отправки свидетельства #**********: {«Message»:[«Идентификатор пациента в запросе не совпадает с ранее зарегистрированным»]}
Если по свидетельству был получен CDA-документ, а после были внесены правки по пациенту (умершему), то для повторного переформирования электронного документа необходимо обратиться к сотрудникам МИАЦ для внесения изменений в Регистре пациентов (Нетрика), после изменений данных в их системе, переформировывать CDA в Демографии и заново повторить отправку документа

39
Удаление свидетельства
Для удаления свидетельства необходимо обратиться к сотруднику МИАЦ, Клевко Василию Александровичу.

40
Удалить электронный документ

Необходимо оформить Заявка.docx и направить в МИАЦ.

Для получения локального идентификатора необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус»

41
Ошибка отправки свидетельства #********: {«Message»:[«Поле «Death Area» заполнено некорректно. DeadInfo.DeathArea»]}
Не заполнено поле «Местность». Документ «Свидетельство о смерти», на вкладке «Адреса» необходимо указать «Местность».

43
System.Exception: Ошибка отправки свидетельства #*********: {«Message»:[«Поле ‘Registry Area’ заполнено некорректно. MotherInfo.RegistryArea»]}

Свидетельство о рождении, закладки: данные матери — не заполнено поле «Местность».

По обязательности заполнения поля «Местность» был сделан запрос в СТП ЕГИСЗ (#886057), на который получен ответ:

«В Руководстве по реализации СЭМД «Медицинское свидетельство о рождении» Редакция 4, действительно, указание местности регистрации матери является обязательным.»

44
Поле ‘Mother Occupation’ заполнено некорректно. MotherInfo.MotherOccupation
Некорректно заполнено поле «Занятость матери». Недопустимо использовать значение «Неизвестно». 

45
Ошибка при обмене данными: SocketException: Обрыв канала (Write failed)
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

46
The request channel timed out attempting to send after 00:01:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

47
Превышено время ожидания ответа поставщика
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

49
Code: RUNTIME_ERROR; Message: Internal error
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

50
Не удалось построить цепочку сертификатов до Головного УЦ(сертификат организации выдан не аккредитованным УЦ или один из сертификатов цепочки не действителен)
Для регистрации документа в РЭМД необходимо, чтобы подпись МО и сотрудников действовала на дату создания ЭМД и дату регистрации ЭМД в РЭМД.

В данном случае тип ошибки определяется ответом от УЦ, мы уже работаем над исправлением отправляемого кода ошибки.

Документы, согласно пп 140, необходимо регистрировать в РЭМД в течении 1 суток с момента их создания.
Однако, согласно ФЗ-63 и подчиненным актам ФСБ — при проверки подписи, подпись должна быть действительна, то есть если врач подписал ЭМД, далее у него истекла подпись и далее направить документ на регистрацию, то такой документ зарегистрирован не будет, так как проверка подписи, осуществляемая сертифицированными криптографическими средствами, выполнена не будет.

51
CryptoProSigner timeout exception
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза

52
System.ArgumentException: Документ с таким NRN отсутвует в базе
Вкладка Медперсонал, блок Руководитель, должен быть указан руководитель организации.

53
В регистре найдено медицинское свидетельство о рождении с указанными серией и номером. Необходимо исправить серию и номер
Документ «Сведения о бумажном МСР» зарегистрирован в РЭМД. Необходимо направить запрос в техническую поддержку ООО ЦИТ «Южный Парус» с перечнем номеров свидетельств для смены статусов в подсистеме Демография.

54

Сертификат сотрудника не действителен на дату создания документа /

Сертификат МО не действителен на дату создания документа

Необходимо проверить действие исполнения должности, указанной в свидетельстве у всех сотрудников с вкладки Медперсонал.  Если условие соблюдено, направить список номеров свидетельств в СТП Парус.

55
Данные документа с IdDocumentType = 14 различаются в MotherInfo и Recipient.
Свидетельство о рождении, вкладка «Данные матери» поле код подразделения не должно быть пустым.

56
Доступ к сервису временно запрещён — для системы, соответствующей идентификатору ***********************, превышен лимит запросов к сервису
Со стороны пользователя действий не требуется,по документу будет произведена повторная отправка в ФРЭМД автоматически со стороны интеграционного шлюза.

57
Message»:[«Поле ‘Issued Date’ не может быть пустым. DeadInfo.Person.DocumentsDto[0].IssuedDate»]
Отсутствует дата выдачи документа, удостоверяющего личность. 

One of the main blocker for solving this problem is the default eagerly-failing nature of the jackson data binder; one would have to somehow convince it to continue parsing instead of just stumble at first error. One would also have to collect these parsing errors in order to ultimately convert them to BindingResult entries. Basically one would have to catch, suppress and collect parsing exceptions, convert them to BindingResult entries then add these entries to the right @Controller method BindingResult argument.

The catch & suppress part could be done by:

  • custom jackson deserializers which would simply delegate to the default related ones but would also catch, suppress and collect their parsing exceptions
  • using AOP (aspectj version) one could simply intercept the default deserializers parsing exceptions, suppress and collect them
  • using other means, e.g. appropriate BeanDeserializerModifier, one could also catch, suppress and collect the parsing exceptions; this might be the easiest approach but requires some knowledge about this jackson specific customization support

The collecting part could use a ThreadLocal variable to store all necessary exceptions related details. The conversion to BindingResult entries and the addition to the right BindingResult argument could be pretty easily accomplished by an AOP interceptor on @Controller methods (any type of AOP, Spring variant including).

What’s the gain

By this approach one gets the data binding errors (in addition to the validation ones) into the BindingResult argument the same way as would expect for getting them when using an e.g. @ModelAttribute. It will also work with multiple levels of embedded objects — the solution presented in the question won’t play nice with that.

Solution Details (custom jackson deserializers approach)

I created a small project proving the solution (run the test class) while here I’ll just highlight the main parts:

/**
* The logic for copying the gathered binding errors 
* into the @Controller method BindingResult argument.
* 
* This is the most "complicated" part of the project.
*/
@Aspect
@Component
public class BindingErrorsHandler {
    @Before("@within(org.springframework.web.bind.annotation.RestController)")
    public void logBefore(JoinPoint joinPoint) {
        // copy the binding errors gathered by the custom
        // jackson deserializers or by other means
        Arrays.stream(joinPoint.getArgs())
                .filter(o -> o instanceof BindingResult)
                .map(o -> (BindingResult) o)
                .forEach(errors -> {
                    JsonParsingFeedBack.ERRORS.get().forEach((k, v) -> {
                        errors.addError(new FieldError(errors.getObjectName(), k, v, true, null, null, null));
                    });
                });
        // errors copied, clean the ThreadLocal
        JsonParsingFeedBack.ERRORS.remove();
    }
}

/**
 * The deserialization logic is in fact the one provided by jackson,
 * I only added the logic for gathering the binding errors.
 */
public class CustomIntegerDeserializer extends StdDeserializer<Integer> {
    /**
    * Jackson based deserialization logic. 
    */
    @Override
    public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        try {
            return wrapperInstance.deserialize(p, ctxt);
        } catch (InvalidFormatException ex) {
            gatherBindingErrors(p, ctxt);
        }
        return null;
    }

    // ... gatherBindingErrors(p, ctxt), mandatory constructors ...
}

/**
* A simple classic @Controller used for testing the solution.
*/
@RestController
@RequestMapping("/errormixtest")
@Slf4j
public class MixBindingAndValidationErrorsController {
    @PostMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Level1 post(@Valid @RequestBody Level1 level1, BindingResult errors) {
    // at the end I show some BindingResult logging for a @RequestBody e.g.:
    // {"nr11":"x","nr12":1,"level2":{"nr21":"xx","nr22":1,"level3":{"nr31":"xxx","nr32":1}}}
    // ... your whatever logic here ...

With these you’ll get in BindingResult something like this:

Field error in object 'level1' on field 'nr12': rejected value [1]; codes [Min.level1.nr12,Min.nr12,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [level1.nr12,nr12]; arguments []; default message [nr12],5]; default message [must be greater than or equal to 5]
Field error in object 'level1' on field 'nr11': rejected value [x]; codes []; arguments []; default message [null]
Field error in object 'level1' on field 'level2.level3.nr31': rejected value [xxx]; codes []; arguments []; default message [null]
Field error in object 'level1' on field 'level2.nr22': rejected value [1]; codes [Min.level1.level2.nr22,Min.level2.nr22,Min.nr22,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [level1.level2.nr22,level2.nr22]; arguments []; default message [level2.nr22],5]; default message [must be greater than or equal to 5]

where the 1th line is determined by a validation error (setting 1 as the value for a @Min(5) private Integer nr12;) while the 2nd is determined by a binding one (setting "x" as value for a @JsonDeserialize(using = CustomIntegerDeserializer.class) private Integer nr11;). 3rd line tests binding errors with embedded objects: level1 contains a level2 which contains a level3 object property.

Note how other approaches could simply replace the usage of custom jackson deserializers while keeping the rest of the solution (AOP, JsonParsingFeedBack).

One of the main blocker for solving this problem is the default eagerly-failing nature of the jackson data binder; one would have to somehow convince it to continue parsing instead of just stumble at first error. One would also have to collect these parsing errors in order to ultimately convert them to BindingResult entries. Basically one would have to catch, suppress and collect parsing exceptions, convert them to BindingResult entries then add these entries to the right @Controller method BindingResult argument.

The catch & suppress part could be done by:

  • custom jackson deserializers which would simply delegate to the default related ones but would also catch, suppress and collect their parsing exceptions
  • using AOP (aspectj version) one could simply intercept the default deserializers parsing exceptions, suppress and collect them
  • using other means, e.g. appropriate BeanDeserializerModifier, one could also catch, suppress and collect the parsing exceptions; this might be the easiest approach but requires some knowledge about this jackson specific customization support

The collecting part could use a ThreadLocal variable to store all necessary exceptions related details. The conversion to BindingResult entries and the addition to the right BindingResult argument could be pretty easily accomplished by an AOP interceptor on @Controller methods (any type of AOP, Spring variant including).

What’s the gain

By this approach one gets the data binding errors (in addition to the validation ones) into the BindingResult argument the same way as would expect for getting them when using an e.g. @ModelAttribute. It will also work with multiple levels of embedded objects — the solution presented in the question won’t play nice with that.

Solution Details (custom jackson deserializers approach)

I created a small project proving the solution (run the test class) while here I’ll just highlight the main parts:

/**
* The logic for copying the gathered binding errors 
* into the @Controller method BindingResult argument.
* 
* This is the most "complicated" part of the project.
*/
@Aspect
@Component
public class BindingErrorsHandler {
    @Before("@within(org.springframework.web.bind.annotation.RestController)")
    public void logBefore(JoinPoint joinPoint) {
        // copy the binding errors gathered by the custom
        // jackson deserializers or by other means
        Arrays.stream(joinPoint.getArgs())
                .filter(o -> o instanceof BindingResult)
                .map(o -> (BindingResult) o)
                .forEach(errors -> {
                    JsonParsingFeedBack.ERRORS.get().forEach((k, v) -> {
                        errors.addError(new FieldError(errors.getObjectName(), k, v, true, null, null, null));
                    });
                });
        // errors copied, clean the ThreadLocal
        JsonParsingFeedBack.ERRORS.remove();
    }
}

/**
 * The deserialization logic is in fact the one provided by jackson,
 * I only added the logic for gathering the binding errors.
 */
public class CustomIntegerDeserializer extends StdDeserializer<Integer> {
    /**
    * Jackson based deserialization logic. 
    */
    @Override
    public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        try {
            return wrapperInstance.deserialize(p, ctxt);
        } catch (InvalidFormatException ex) {
            gatherBindingErrors(p, ctxt);
        }
        return null;
    }

    // ... gatherBindingErrors(p, ctxt), mandatory constructors ...
}

/**
* A simple classic @Controller used for testing the solution.
*/
@RestController
@RequestMapping("/errormixtest")
@Slf4j
public class MixBindingAndValidationErrorsController {
    @PostMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Level1 post(@Valid @RequestBody Level1 level1, BindingResult errors) {
    // at the end I show some BindingResult logging for a @RequestBody e.g.:
    // {"nr11":"x","nr12":1,"level2":{"nr21":"xx","nr22":1,"level3":{"nr31":"xxx","nr32":1}}}
    // ... your whatever logic here ...

With these you’ll get in BindingResult something like this:

Field error in object 'level1' on field 'nr12': rejected value [1]; codes [Min.level1.nr12,Min.nr12,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [level1.nr12,nr12]; arguments []; default message [nr12],5]; default message [must be greater than or equal to 5]
Field error in object 'level1' on field 'nr11': rejected value [x]; codes []; arguments []; default message [null]
Field error in object 'level1' on field 'level2.level3.nr31': rejected value [xxx]; codes []; arguments []; default message [null]
Field error in object 'level1' on field 'level2.nr22': rejected value [1]; codes [Min.level1.level2.nr22,Min.level2.nr22,Min.nr22,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [level1.level2.nr22,level2.nr22]; arguments []; default message [level2.nr22],5]; default message [must be greater than or equal to 5]

where the 1th line is determined by a validation error (setting 1 as the value for a @Min(5) private Integer nr12;) while the 2nd is determined by a binding one (setting "x" as value for a @JsonDeserialize(using = CustomIntegerDeserializer.class) private Integer nr11;). 3rd line tests binding errors with embedded objects: level1 contains a level2 which contains a level3 object property.

Note how other approaches could simply replace the usage of custom jackson deserializers while keeping the rest of the solution (AOP, JsonParsingFeedBack).

Валидация: внутри сущностей или снаружи?

Время прочтения
3 мин

Просмотры 19K

Обратите внимание, что хотя пост написан от первого лица, это перевод статьи из блога Jimmy Bogard, автора AutoMapper.

Меня часто спрашивают, особенно в контексте архитектуры вертикальных слоев (vertical slice architecture), где должна происходить валидация? Если вы применяете DDD, вы можете поместить валидацию внутри сущностей. Но лично я считаю, что валидация не очень вписывается в ответственность сущности.

Часто валидация внутри сущностей делается с помощью аннотаций. Допустим, у нас есть Customer и его поля FirstName/LastName обязательны:

public class Customer
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}

Проблем с таким подходом две:

  • Вы изменяете состояние сущности до валидации, то есть ваша сущность может находиться в невалидном состоянии
  • Неясен контекст операции (что именно пытается сделать пользователь)

И хотя вы можете показать ошибки валидации (обычно генерируемые ORM) пользователю, не так-то просто сопоставить исходные намерения и детали реализации состояния. Как правило, я стараюсь избегать такого подхода.

Однако, если вы придерживаетесь DDD, вы можете обойти проблему изменяющегося состояния, добавив метод:

public class Customer
{
  public string FirstName { get; private set; }
  public string LastName { get; private set; }
    
  public void ChangeName(string firstName, string lastName) {
    if (firstName == null)
      throw new ArgumentNullException(nameof(firstName));
    if (lastName == null)
      throw new ArgumentNullException(nameof(lastName));
      
    FirstName = firstName;
    LastName = lastName;
  }
}

Немного лучше, но лишь немного, потому что исключения — единственный способ показать ошибки валидации. Исключения вы не любите, поэтому берете какой-нибудь вариант результата [выполнения] команды (command result):

public class Customer
{
  public string FirstName { get; private set; }
  public string LastName { get; private set; }
    
  public CommandResult ChangeName(ChangeNameCommand command) {
    if (command.FirstName == null)
      return CommandResult.Fail("First name cannot be empty.");
    if (lastName == null)
      return CommandResult.Fail("Last name cannot be empty.");
      
    FirstName = command.FirstName;
    LastName = command.LastName;
    
    return CommandResult.Success;
  }
}

И опять отображение ошибки пользователю вызывает раздражение, так как возвращается только одна ошибка за раз. Я мог бы вернуть их всем скопом, но как тогда мне сопоставить их с именами полей на экране? Никак. Очевидно, сущности хреново подходят для валидации команды. Однако, для этого прекрасно подходят фреймворки валидации (validation frameworks).

Валидация команды (command validation)

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

При таком подходе моя валидация строится вокруг команд и действий, а не сущностей. Я мог бы сделать что-то типа такого:

public class ChangeNameCommand {
  [Required]
  public string FirstName { get; set; }
  [Required]
  public string LastName { get; set; }
}

public class Customer
{
  public string FirstName { get; private set; }
  public string LastName { get; private set; }
    
  public void ChangeName(ChangeNameCommand command) {
    FirstName = command.FirstName;
    LastName = command.LastName;
  }
}

Мои атрибуты валидации находятся в самой команде, и только при условии валидности команды я смогу применить ее к моим сущностям для перевода их в новое состояние. Внутри сущности я должен просто обработать команду ChangeNameCommand и выполнить переход в новое состояние, будучи уверенным, что выполняются мои инварианты. Во многих проектах я использую FluentValidation:

public class ChangeNameCommand {
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

public class ChangeNameValidator : AbstractValidator<ChangeNameCommand> {
  public ChangeNameValidator() {
    RuleFor(m => m.FirstName).NotNull().Length(3, 50);
    RuleFor(m => m.LastName).NotNull().Length(3, 50);
  }
}

public class Customer
{
  public string FirstName { get; private set; }
  public string LastName { get; private set; }
    
  public void ChangeName(ChangeNameCommand command) {
    FirstName = command.FirstName;
    LastName = command.LastName;
  }
}

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

Валидируйте команды, а не сущности, и выполняйте валидацию на границах (perform the validation at the edges).

Разбор ошибок валидации сайта

Наконец-то появилось свободное время между бесконечной чередой заказов, и я решил заняться своим блогом. Попробуем его улучшить в плане валидации. Ниже в статье я расскажу, что такое валидация сайта, кода html и css, зачем она нужна и как привести сайт к стандартам на конкретном примере.

Что такое валидация сайта?

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

Конкретный пример прохождения валидации для страницы сайта

Возьмем первую попавшуюся страницу на моем сайте — Кодирование и декодирование base64 на Java 8. Забьем адрес страницы в валидатор и смотрим результат:

ошибки валиадции

Errors found while checking this document as HTML 4.01 Transitional!
Result:	105 Errors, 67 warning(s)

Да уж, картина вырисовывается неприятная: больше сотни ошибок и 67 предупреждений – как вообще поисковики индексируют мой блог, и заходят люди? Но не будем огорчаться, а научимся проходить валидацию, справлять ошибки. Итак, первое предупреждение:

Unable to Determine Parse Mode!

The validator can process documents either as XML (for document types such as XHTML, SVG, etc.) or SGML (for HTML 4.01 and prior versions). For this document, the information available was not sufficient to determine the parsing mode unambiguously, because:

the MIME Media Type (text/html) can be used for XML or SGML document types
No known Document Type could be detected
No XML declaration (e.g <?xml version="1.0"?>) could be found at the beginning of the document.
No XML namespace (e.g <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">) could be found at the root of the document.
As a default, the validator is falling back to SGML mode.

Warning No DOCTYPE found! Checking with default HTML 4.01 Transitional Document Type.

No DOCTYPE Declaration could be found or recognized in this document. This generally means that the document is not declaring its Document Type at the top. It can also mean that the DOCTYPE declaration contains a spelling error, or that it is not using the correct syntax.

The document was checked using a default "fallback" Document Type Definition that closely resembles “HTML 4.01 Transitional”.

Это одно и тоже. А исправляется просто: в самом начале страницы добавить тег:

<!DOCTYPE html>

Проверяем ,что у нас получилось и видим, что одним этим тегом мы убрали 105 ошибок и 3 предупреждения! Теперь у нас осталось только 64 предупреждения. Начинаем разбирать их по одному.

Warning: The type attribute for the style element is not needed and should be omitted.
From line 5, column 1; to line 5, column 23
/x-icon">↩<style type="text/css">↩↩↩↩A 

Это значит, что для элемента style не нужен атрибут type – это лишнее. На странице у нас два таких замечания. Аналогичное предупреждение и по JavaScript:

Warning: The type attribute is unnecessary for JavaScript resources.
From line 418, column 1; to line 418, column 31
</script>↩<script type="text/javascript">↩$(doc

Таких у нас 8 ошибок. Убираем данные атрибуты и ура – еще на 10 предупреждений меньше!

Error: CSS: background: The first argument to the linear-gradient function should be to top, not top.
At line 39, column 61
0%,#E8E8E8 100%);↩    border-r

Следующая ошибка — первый аргумент у linear-gradient должен быть to top, а не top. Исправлем. Далее ошибка:

Error: CSS: Parse Error.
From line 65, column 13; to line 65, column 16
margin: 0 auto;↩padd

Здесь у меня неверно закомментировано css. Надо просто убрать эту строку. Или закомментировать по-другому /* и */. Я так сделал, как привык так комментировать на Java.

Error: CSS: @import are not allowed after any valid statement other than @charset and @import..
At line 88, column 74
0,600,700,300);↩@import url(//

Теперь у нас идет ошибка импорта. Перенесем эти строчки в самое начало файла и она исчезнет.

Error: Bad value _blanck for attribute target on element a: Reserved keyword blanck used.
From line 241, column 218; to line 241, column 295
 cookies. <a href="//upread.ru/art.php?id=98" target="_blanck" style="display: inline;">Здесь

Далее не нравится значение атрибута target, нам сообщают, что надо использовать «blank» без нижнего подчеркивания спереди. Убираем.

Error: End tag li seen, but there were open elements.
From line 379, column 2; to line 379, column 6
<ul>↩	</li>↩↩</ul

Теперь у нас идет div не на месте.

Error: Table columns in range 2…3 established by element td have no cells beginning in them.
From line 262, column 5; to line 263, column 94
px;">↩<tr>↩<td colspan="3" style="width:100%; padding-bottom: 25px;padding-top: 0px; text-align:center;">↩<img 

Следующая ошибка – лишний colspan у ячейки. В моем случае таблица состоит всего из одной ячейки, видимо, забыл убрать, когда менял дизайн. Теперь это и делаем.

Error: Element style not allowed as child of element div in this context. (Suppressing further errors from this subtree.)
From line 486, column 1; to line 486, column 7
↩</table>↩<tyle>↩.hleb
Contexts in which element style may be used:
Where metadata content is expected.
In a noscript element that is a child of a head element.
In the body, where flow content is expected.
Content model for element div:
If the element is a child of a dl element: one or more dt elements followed by one or more dd elements, optionally intermixed with script-supporting elements.
If the element is not a child of a dl element: Flow content.

А эта ошибка говорит о том, что нельзя вставлять style внутри div. Переносим в начало файла.

Error: The width attribute on the table element is obsolete. Use CSS instead.
From line 505, column 1; to line 505, column 21
>↩↩↩↩↩↩↩↩↩<table width ="100%">↩<tr>↩

Тут нам подсказывают, что не стоит устанавливать ширину атрибутом, а лучше сделать это отдельным тегом. Меняем на style=»width:100%;».

Error: Duplicate attribute style.
At line 507, column 41
ign="top" style="padding-right

Переводим: дублируется атрибут style. Второй стиль при этом работать не будет. Объединяем

Error: Attribute name not allowed on element td at this point.
From line 506, column 5; to line 507, column 82
0%;">↩<tr>↩<td style="width:1%;padding-right:10px;" valign="top" name="navigid" id="navigid">↩↩↩↩</
Attributes for element td:
Global attributes
colspan - Number of columns that the cell is to span
rowspan - Number of rows that the cell is to span
headers - The header cells for this cell

У ячейки не должно быть имени – атрибута name. Тут в принципе можно убрать, id вполне хватит.

Error: The valign attribute on the td element is obsolete. Use CSS instead.
From line 506, column 5; to line 507, column 67
0%;">↩<tr>↩<td style="width:1%;padding-right:10px;" valign="top" id="navigid">↩↩↩↩</

Убираем valign. Вместо него ставим style=»vertical-align:top».

Error: & did not start a character reference. (& probably should have been escaped as &.)
At line 543, column 232
при lineLength &t;= 0) и lineS

А эта ошибка вообще непонятно как оказалась ) Это я коде к статье ошибся. Меняем на <

Error: An img element must have an alt attribute, except under certain conditions. For details, consult guidance on providing text alternatives for images.
From line 654, column 1; to line 654, column 30
 /><br />↩<img src="img/art374-1.jpg" />↩<br /

У изображений должен быть alt. Добавляем альты с описанием картинок.

Error: CSS: padding: only 0 can be a unit. You must put a unit after your number.
From line 260, column 18; to line 260, column 19
dding: 10 20;↩}↩↩#

Только ноль может быть без обозначений. Надо поставить что – это пиксели, или к примеру, проценты. Добавляем px после чисел.

Warning: The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.
At line 974, column 8
ipt> ↩↩↩ <!--детектим адблок

Не нравятся комментарии. Да, в общем, их можно и убрать, не разбираясь, не особенно они и нужны.

Error: Stray end tag td.
From line 982, column 1; to line 982, column 5
↩</table>↩</td>↩↩<sty

Заблудившийся тег td. Убираем его.

Error: Bad value  for attribute action on element form: Must be non-empty.
From line 1102, column 6; to line 1102, column 98
/h6>↩					<form action="" id="jaloba-to-me" class="submit" method="POST" accept-charset="windows-1251">	<tabl

Здесь валидатор не устраивает пустое значение атрибута action – должен быть адрес страницы какой-то. У нас обрабатывается данная форма js, так что без разницы, поставим action=”self”

Все! Смотрим результат:

валиадция сайта пройдена

Нет ошибок или предупреждений, страница полностью валидна.

Если вам что-то непонятно в статье или вы хотите, чтобы ваш сайт полностью соответствовал спецификации и стандартам HTML ,вы можете обратиться ко мне. Я проверю и устраню любые шибки валидации.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, сайтостроение, html, валидация

Валидация

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

Описанное здесь поведение валидаций и отображение ошибок реализовано в библиотеке «React UI Validations», по возможности используйте эту библиотеку в продукте.

Принципы

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

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

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

Виды валидации

Существует три вида валидаций: мгновенная, по потере фокуса и по отправке формы.

Чем раньше интерфейс сообщает об ошибке, тем лучше — пользователю проще вернуться и исправить ошибку.

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

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

Валидация по потере фокуса

Когда использовать

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

Как работает

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

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

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

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

Красная подсветка снимается с поля, как только пользователь начал исправлять ошибочное значение.

Валидация при отправке формы

Когда использовать

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

Как работает

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

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

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

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

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

Сообщения об ошибках

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

  1. Красным текстом около поля, обычно под полем или справа от него:
  2. Текстом в тултипе:

Из этих двух способов мы рекомендуем использовать тултипы. Они идут отдельным слоем, поэтому не раздвигают форму и легко размещаются, даже если поля на форме расположены плотно.

Тултипы

Как работают

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

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

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

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

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

Тултип по наведению перекрывает тултип по фокусу.

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

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

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

Красные тексты на странице

Как работают

Красный текст ошибки появляется сразу, как только произошла валидация и ошибочное поле подсветилось.

Как только пользователь начал исправлять значение, красная подсветка поля исчезает, и цвет текста ошибки меняется на черный — #222.

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

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

Если справа от поля нет места для текста, раздвигайте форму и выводите сообщение под полем.

На более сложных формах выводите сообщение об ошибке в тултипе.

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

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

Ошибки, которые связаны с нарушением зависимости полей, мы показываем после сабмита формы. Например, ИНН и КПП. Если пользователь указал ИНН из 10 цифр, а поле с КПП оставил пустым, после отправки формы пустое поле с КПП будет подсвечено.

ИНН может быть двух видов:

  • 10-значный у юридических лиц
  • 12-значный у ИП.

Если пользователь указал ИНН из 12 цифр, значит организация — индивидуальный предприниматель, и у нее нет КПП, значит поле КПП заполнять не нужно. И наоборот, если заполнено КПП, а ИНН указан 12-значный, возможно неверно указан ИНН.

Подсветка зависимых полей пропадает, как только пользователь начал исправлять значение в одном из этих полей.

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

Пример

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

  • Название организации — простое текстовое, обязательное
  • ИНН — 10 или 12 цифр, проверка контрольной суммы по потере фокуса, обязательное
  • КПП — 9 цифр с проверкой контрольной суммы по потере фокуса, обязательное, если ИНН состоит из 10 цифр
  • Электронная почта — адрес почты, проверка по потере фокуса по маске a@a.aa, необязательное
  • Телефон — международный формат, проверка по потере фокуса по маске +00000000000, обязательное

Пользователь пропустил поле с названием организации, заполнил ИНН значением из 10 цифр, перешел в поле почты, указал некорректный адрес, перешел в поле с телефоном и указал некорректный номер, но из поля пока не ушел:

Пользователь навел курсор на поле с почтой, появился тултип. Но исправлять значение пользователь не стал:

Пользователь нажал кнопку «Отправить» — фокус перешел в поле «Название организации», так как оно обязательное и незаполненное:

Поле с телефоном также подсветилось красным, так как заполнено некорректно. ИНН и КПП подсветились, так как ИНН состоит из 10 цифр, значит должен быть заполнен и КПП — валидация зависимых полей произошла только после отправки формы.

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

Заполнил название организации, перешел в поле ИНН:

Понял, что ИНН правильный, и нужно заполнить КПП:

Начал заполнять поле КПП. Красная рамка у ИНН и КПП исчезла — пользователь изменил значение в одном из зависимых полей:

Заполнил КПП, перешел в следующее поле:

Исправил почту, перешел в следующее поле:

Исправил телефон, кликнул за пределами поля:

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

Наличие ошибок в коде страницы сайта всегда влечет за собой негативные последствия – от ухудшения позиций в ранжировании до жалоб со стороны пользователей. Ошибки валидации могут наблюдаться как на главной, так и на иных веб-страницах, их наличие свидетельствует о том, что ресурс является невалидным. Некоторые проблемы замечают даже неподготовленные пользователи, другие невозможно обнаружить без предварительного аудита, анализа. О том, что такое ошибки валидации и как их обнаружить, мы сейчас расскажем.

Комплексный аудит сайта, что входит, как сделать

Ошибка валидации, что это такое?

Для написания страниц используется HTML – стандартизированный язык разметки, применяемый в веб-разработке. HTML, как любой другой язык, имеет специфические особенности синтаксиса, грамматики и т. д. Если во время написания кода правила не учитываются, то после запуска сайта будут появляться различные виды проблем. Если HTML-код ресурса не соответствует стандарту W3C, то он является невалидным, о чем мы писали выше.

Почему ошибки валидации сайта оказывают влияние на ранжирование, восприятие?

Наличие погрешностей в коде – проблема, с которой необходимо бороться сразу после обнаружения. Поисковые системы «читают» HTML-код, если он некорректный, то процесс индексации и ранжирования может быть затруднен. Поисковые роботы должны понимать, каким является ресурс, что он предлагает, какие запросы использует. Особо критичны такие ситуации для ресурсов, имеющих большое количество веб-страниц.

Как проверить ошибки валидации?

Как проверить ошибки валидации
Для этой работы используется либо технический аудит сайта, либо валидаторы, которые ищут проблемы автоматически. Одним из самых популярных является сервис The W3C Markup Validation Service, выполняющий сканирование с оглядкой на World Wide Web Consortium (W3C). Рассматриваемый валидатор предлагает три способа, с помощью которых можно осуществить проверку сайта:

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

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

Существуют другие сервисы, позволяющие выполнить проверку валидности кода:

  • Dr. Watson. Проверяет скорость загрузки страниц, орфографию, ссылки, а также исходный код;
  • InternetSupervision.com. Отслеживает производительность сайта, проверяет доступность HTML.

Плагины для браузеров, которые помогут найти ошибки в коде

Решить рассматриваемую задачу можно с помощью плагинов, адаптированных под конкретный браузер. Можно использовать следующие инструменты (бесплатные):

  • HTML Validator для браузера Firefox;
  • HTML Validator for Chrome;
  • Validate HTML для Firefox.

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

Как исправить ошибку валидации?

Как исправить ошибку валидации
В первую очередь нужно сосредоточить внимание на слабых местах, связанных с контентом – это то, что важно для поисковых систем. Если во время сканирования было выявлено более 25 проблем, то их нельзя игнорировать из-за ряда причин:

  • частичная индексация;
  • медленная загрузка;
  • баги, возникающие во время непосредственной коммуникации пользователя с ресурсом.

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

Технический и SEO-аудит

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

В заключение

На всех сайтах наблюдаются ошибки валидации – их невозможно искоренить полностью, но и оставлять без внимания не стоит. Например, если провести проверку сайтов Google или «Яндекс», то можно увидеть ошибки, однако это не означает, что стоит вздохнуть спокойно и закрыть глаза на происходящее. Владелец сайта должен ставить во главу угла комплексное развитие, при таком подходе ресурс будет наполняться, обновляться и «лечиться» своевременно. Если проблем мало, то можно попробовать устранить их своими силами или с помощью привлечения стороннего частного специалиста. В остальных случаях лучше заказать услугу у проверенного подрядчика.

Что такое ошибки валидации и как их исправить

Понравилась статья? Поделить с друзьями:
  • Epson произошла ошибка связи
  • Epson пишет ошибка
  • Epson ошибка системы 202621
  • Epson ошибка принтера выключите принтер затем вновь включите
  • Epson ошибка b200