Translation. Original: offline/korekta-techniczna.md
Техническое исправление офлайн-счёта
20.08.2025
Описание функциональности
Техническое исправление позволяет повторно отправить счёт, выставленный в офлайн-режиме, который после отправки в систему KSeF был отклонён из-за технических ошибок, например:
- несоответствие схеме,
- превышение допустимого размера файла,
- дублирование счёта,
- другие ошибки технической валидации, препятствующие присвоению
номера KSeF.
Внимание!
- Техническое исправление не касается ситуаций, связанных с отсутствием полномочий субъектов, указанных в счёте (например, самовыставление счёта, валидация отношений для JST или VAT-групп).
- В этом режиме не разрешается исправлять содержание счёта – техническое исправление касается исключительно технических проблем, препятствующих его приёму в системе KSeF.
- Техническое исправление может отправляться только в интерактивной сессии, но может касаться офлайн-счетов, отклонённых как в интерактивной сессии, так и в пакетной сессии.
- Недопустимо техническое исправление офлайн-счёта, для которого уже было принято другое правильное исправление.
Пример процесса технического исправления офлайн-счёта
Продавец выставляет счёт в офлайн-режиме.
- Счёт содержит два QR-кода:
- QR-код I – позволяет верификацию счёта в системе KSeF,
- QR-код II – позволяет подтвердить подлинность выставителя на основе сертификата KSeF.
- Счёт содержит два QR-кода:
Клиент получает визуализацию счёта (например, в виде распечатки).
- После сканирования QR-кода I клиент получает информацию о том, что счёт ещё не был отправлен в систему KSeF.
- После сканирования QR-кода II клиент получает информацию о сертификате KSeF, который подтверждает подлинность выставителя.
Продавец отправляет офлайн-счёт в систему KSeF.
- Система KSeF проверяет документ.
- Счёт отклоняется из-за технической ошибки (например, неправильное соответствие схеме XSD).
Продавец обновляет своё программное обеспечение и повторно генерирует счёт с тем же содержанием, но соответствующий схеме.
- Поскольку содержимое XML отличается от первоначальной версии, хэш SHA-256 файла счёта другой.
Продавец отправляет исправленный счёт как техническое исправление.
- Указывает в поле
hashOfCorrectedInvoiceхэш SHA-256 первоначального, отклонённого офлайн-счёта. - Параметр
offlineModeустановлен вtrue.
- Указывает в поле
Система KSeF правильно принимает счёт.
- Документ получает номер KSeF.
- Счёт связывается с первоначальным офлайн-счётом, хэш которого был указан в поле
hashOfCorrectedInvoice. - Благодаря этому возможно перенаправление клиента со «старого» QR-кода I к исправленному счёту.
Клиент использует QR-код I, размещённый на первоначальном счёте.
- Система KSeF сообщает, что первоначальный счёт был технически исправлен.
- Клиент получает метаданные нового, правильно обработанного счёта и имеет возможность скачать его из системы.
Отправка исправления
Исправление отправляется в соответствии с принципами, описанными в документе интерактивная сессия, с дополнительной настройкой:
offlineMode: true,hashOfCorrectedInvoice– хэш первоначального счёта.
Пример на языке C#: KSeF.Client.Tests.Core\E2E\OnlineSession\OnlineSessionE2ETests.cs
var sendOnlineInvoiceRequest = SendInvoiceOnlineSessionRequestBuilder
.Create()
.WithInvoiceHash(invoiceMetadata.HashSHA, invoiceMetadata.FileSize)
.WithEncryptedDocumentHash(
encryptedInvoiceMetadata.HashSHA, encryptedInvoiceMetadata.FileSize)
.WithEncryptedDocumentContent(Convert.ToBase64String(encryptedInvoice))
.WithOfflineMode(true)
.WithHashOfCorrectedInvoice(hashOfCorrectedInvoice)
.Build();Пример на языке Java: OnlineSessionController#sendTechnicalCorrection.java
SendInvoiceOnlineSessionRequest sendInvoiceOnlineSessionRequest = new SendInvoiceOnlineSessionRequestBuilder()
.withInvoiceHash(invoiceMetadata.getHashSHA())
.withInvoiceSize(invoiceMetadata.getFileSize())
.withEncryptedInvoiceHash(encryptedInvoiceMetadata.getHashSHA())
.withEncryptedInvoiceSize(encryptedInvoiceMetadata.getFileSize())
.withEncryptedInvoiceContent(Base64.getEncoder().encodeToString(encryptedInvoice))
.withOfflineMode(true)
.withHashOfCorrectedInvoice(hashOfCorrectedInvoice)
.build();