Валидация бизнес-правил электронных счетов
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
Стабильные диагностика и ограничения
- Идентификаторы правил, если они есть, разбираются из токена сообщения Schematron
- Отсутствующие идентификаторы получают детерминированные порядковые номера профиля и assertion или report
- Каждая находка сохраняет исходные контекст и тестовые выражения
- Пути к внешним кодовым базам ограничены именами файлов-соседей
- Обработка DTD и разрешение внешних XML-сущностей отключены
- Входной XML счёта ограничен 64 MiB
Доступность в тулчейнах
Delphi XE2 и новее используют встроенный движок совместимости MSXML
Delphi 7 сохраняет общие интерфейсы и типы результата, но возвращает диагностику о недоступном движке
Связанные API
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
Приёмка без GUI
Запустите Tests/Delphi/Run-EInvoiceRuleTests.ps1 с явными значениями JavaExecutable и SaxonClassPath или с соответствующими переменными окружения HOTPDF_JAVA_EXE и HOTPDF_SAXON_CLASSPATH
Раннер по умолчанию требует конфигурацию движка официальных правил и прогоняет и Win32, и Win64 с подавленным запуском PDF-просмотрщика; -NativeOnly сознательно пропускает исполнение официального Saxon