Валидация бизнес-правил электронных счетов

HPDFEInvoiceValidator объединяет валидацию контейнера Factur-X или ZUGFeRD с явно выбранными версионированными наборами бизнес-правил и country-правил

Полное проверенное исполнение правил

В комплект библиотеки входят соответствующие ресурсы `.sch` и `_codedb.xml` для MINIMUM, BASIC WL, BASIC, EN 16931 и EXTENDED

Движок XE2 и новее исполняет полную проверенную поверхность XPath 2 через безопасный разбор MSXML, детерминированные эквиваленты XPath 1 и прямое вычисление квантификаторов, FLWOR-сумм, приведений типов, сравнения последовательностей, внешних кодовых списков, шаблонов дат и булевых значений индикаторов

Профиль EN 16931 содержит 618 проверок, и каждая из них выполняется при каждом прогоне валидации

Комбинированная валидация

var
  Report: THPDFEInvoiceValidationReport;
begin
  if not HPDFValidateEInvoice(PDF,
    'Lib\resources\Schematron', Report) then
    LogValidationFailure(Report);
end;

HPDFValidateEInvoice сначала вызывает THotPDF.ValidateFacturXInvoice, извлекает и опознаёт XML счёта, загружает Schematron-ресурсы профиля и исполняет бизнес-правила

Обнаруженный гибридный счёт безопасно отказывает, если не удаётся извлечь XML, определить профиль, загрузить правила или кодовую базу либо вычислить выражения

Функция возвращает true, только когда контейнер валиден, бизнес-правила выполнены и не осталось ни одной находки уровня ошибки или предупреждения

Реестр профилей и область валидации

THPDFEInvoiceRuleRegistry регистрирует один слой бизнес-правил и, когда требуется, один слой country-правил на профиль, с явным именем ресурса, версией правил и опциональной реализацией IHPDFESchematronEngine

Реестр по умолчанию содержит пять поставляемых профилей Factur-X и базовые правила EXTENDED для французских профилей EXTENDED-CTC-FR и EXTENDED-B2B-FR

Французские профили требуют дополнительной регистрации country-правил, прежде чем ValidationComplete станет true, а XRECHNUNG требует и CII EN 16931, и немецких country-правил

Неизвестные профили не имеют правил по умолчанию и никогда не откатываются к EXTENDED, а HPDFSchematronFileForProfile возвращает пустую строку для неизвестных или country-специфичных профилей

HPDFValidateEInvoiceWithRegistry использует реестр вызывающего вместе с проверкой PDF-контейнера, а HPDFValidateEInvoiceXML валидирует явные байты XML и профиль, не проверяя PDF-контейнер

Отчёт раскрывает ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete и ValidationNote, а массив RuleSets записывает каждый выбранный ресурс, версию, область, сводку и статус завершения

Завершённое вычисление правил всё ещё может содержать нарушения бизнес-правил, поэтому проверяйте булев результат или BusinessRuleViolations наряду с ValidationComplete

Эти API сообщают покрытие бизнес- и country-правил, тогда как валидация XML Schema, транспортные политики и решения о юридическом принятии остаются за пределами этой области

Официальные правила XRechnung CII

HPDFEInvoiceSaxon поставляет опциональный мост Saxon HE, который исполняет немодифицированные скомпилированные таблицы стилей EN 16931 CII 1.3.16 и Schematron 2.6.0 XRechnung 3.0.2 из Lib/resources/Schematron/XRechnung

Ресурсы взяты из официальной конфигурации валидатора KoSIT от 31 августа 2026, а README ресурсов фиксирует их происхождение, лицензии и хеши

Хост явно передаёт исполняемый файл Java и class path Saxon, а библиотека запускает трансформацию без shell и видимого консольного окна, соблюдает таймаут, разбирает находки SVRL и удаляет свои временные файлы

Нулевой таймаут выбирает 60 секунд, значения выше 3,600,000 миллисекунд отклоняются, диагностический вывод ограничен 8 MiB, а скомпилированные таблицы стилей и отчёты SVRL — 64 MiB до разбора или загрузки

uses HPDFEInvoiceValidator, HPDFEInvoiceSaxon;

Registry := THPDFEInvoiceRuleRegistry.Create;
try
  Engine := HPDFCreateSaxonSchematronEngine(
    JavaExecutable, SaxonClassPath, 60000);
  HPDFRegisterXRechnungRules(Registry, Engine);
  Valid := HPDFValidateEInvoiceWithRegistry(PDF,
    'Lib\resources\Schematron', Registry, Report);
finally
  Registry.Free;
end;

Настройте class path Saxon с Saxon HE и его обязательными зависимостями и используйте отдельные экземпляры реестра и движка на каждый поток валидации

Опциональный мост требует Delphi XE2 или новее на Windows и предоставляемого хостом рантайма Java/Saxon; библиотека не скачивает и не устанавливает ни один из них

Отсутствующие рантаймы, неверный синтаксис счёта, запрещённые DTD, таймаут, провал трансформации и искажённый вывод SVRL дают явную диагностику неполной валидации

Официальные французские правила CTC для счетов

HPDFRegisterFrenchCTCRules выбирает официальный слой профиля и строгий country-слой BR-FR-Flux2 из релиза FNFE-MPE 1.4.0.04, опубликованного 4 сентября 2026 для AFNOR XP Z12-012 версии 1.4

Официальный релиз FNFE-MPE опубликован под Apache 2.0 и связан со страницей ресурсов FNFE-MPE, входящая таблица стилей EN 16931 CII сохраняет EUPL 1.2, а оригинальные скомпилированные таблицы стилей, исходники Schematron, кодовые базы, лицензии, исходные пути и хеши сохранены в Lib/resources/Schematron/France

Для fisFacturX хелпер поддерживает BASIC WL, EN 16931 и EXTENDED на опубликованных слоях правил Factur-X 1.09.2, а обозначение контейнера EXTENDED-CTC-FR использует тот же слой EXTENDED Factur-X плюс французские country-проверки

Для автономного fisCII поддерживаются EN 16931 и отдельный слой CII EXTENDED-CTC-FR, чьи ограничения и идентификатор guideline отличаются от гибридного слоя EXTENDED Factur-X

Engine := HPDFCreateSaxonSchematronEngine(
  JavaExecutable, SaxonClassPath, 60000);

HPDFRegisterFrenchCTCRules(Registry, 'EN 16931',
  Engine, fisFacturX);
Valid := HPDFValidateEInvoiceWithRegistry(PDF,
  'Lib\resources\Schematron', Registry, Report);

HPDFRegisterFrenchCTCRules(Registry, 'EXTENDED-CTC-FR',
  Engine, fisCII);
Valid := HPDFValidateEInvoiceXML(XMLBytes, 'EXTENDED-CTC-FR',
  'Lib\resources\Schematron', Registry, Report);

Регистрация сохраняет отдельные версии профиля и country-правил и делает французский country-слой обязательным для выбранного профиля, включая EN 16931 и BASIC WL, когда они явно зарегистрированы для Франции

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

В закреплённом официальном пакете нет профиля правил EXTENDED-B2B-FR, поэтому хелпер отклоняет это legacy-имя, а не трактует его как автоматически сертифицированный псевдоним

Успешная валидация подтверждает завершение этих опубликованных слоёв бизнес-правил счетов, тогда как XML Schema, сообщения жизненного цикла CDAR, извлечение данных e-reporting, авторизация платформы, транспорт и юридическая сертификация остаются отдельными областями

API движка

Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
  raise Exception.Create(ErrorText);

Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;

THPDFSchematronSummary сообщает Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable и EngineNote

Skipped в движке XE2 и новее всегда ноль и зарезервирован для заглушки Delphi 7 или унаследованных данных результата

Некорректные или неподдерживаемые выражения дают явные находки с уровнем ошибки, наращивают EvaluationErrors и никогда не проходят как успешные проверки

Хелпер-функции XML Factur-X

Юнит HPDFFacturX поставляет байтовые хелперы, которые читают XML счёта Factur-X / ZUGFeRD без построения DOM, поэтому они работают на всех поддерживаемых библиотекой версиях Delphi и безопасны для байтов, извлечённых через ExtractFacturXXML

HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) возвращает идентификатор guideline из элемента GuidelineSpecifiedDocumentContextParameter / ram:ID документа CII или пустую строку, когда его нет

HPDFIsFacturXConformanceLevel(Value, FileName, Version) валидирует имя уровня соответствия, принимая MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR и XRECHNUNG; legacy-уровень COMFORT дополнительно требует имя файла ZUGFeRD 1.0 ZUGFeRD-invoice.xml с версией 1.0

HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) сверяет guideline, найденный в XML, с объявленным уровнем соответствия, версией и встроенным именем файла

HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) заполняет запись THPDFFacturXInvoiceSummary из XML счёта и возвращает True, когда удалось найти хотя бы основной XML счёта; сам тип записи summary объявлен в HPDFDoc рядом с THPDFFacturXInvoiceInfo

Стабильные диагностика и ограничения

Доступность в тулчейнах

Delphi XE2 и новее используют встроенный движок совместимости MSXML

Delphi 7 сохраняет общие интерфейсы и типы результата, но возвращает диагностику о недоступном движке

Связанные API

Приёмка без GUI

Запустите Tests/Delphi/Run-EInvoiceRuleTests.ps1 с явными значениями JavaExecutable и SaxonClassPath или с соответствующими переменными окружения HOTPDF_JAVA_EXE и HOTPDF_SAXON_CLASSPATH

Раннер по умолчанию требует конфигурацию движка официальных правил и прогоняет и Win32, и Win64 с подавленным запуском PDF-просмотрщика; -NativeOnly сознательно пропускает исполнение официального Saxon