Wizualizacja dokumentów XML KSeF i ich konwersja do pdf

image_pdfimage_print

W wersji 2026.1.0 wprowadzono automatyczną konwersję plików XML KSeF do formatu pdf w punktach ACD typu „Współpraca z dowolnym programem OCR” i umożliwiono podgląd dokumentu „na żądanie” w tych punktach ACD. Te zmiany pozwalają na szybką weryfikację wizualną faktur pobranych do takich punktów ACD i zmniejszenie liczby błędów przy odczytywaniu dokumentów xml z Comarch ERP Optima i Comarch ERP XL w tych punktach ACD.

W tym celu w punktach ACD typu „Współpraca z dowolnym programem OCR” w ramach konfiguracji mapowania kontrolki typu Załącznik na zakładce „Kontrolki“ podczas definiowania punktu ACD dodano checkbox „Konwertuj pliki KSeF *.xml do *.pdf”.

W przypadku, jeśli wprowadzono odpowiednie zapytanie dla listy oraz dla kontrolki typu załącznik i zaznaczono checkbox, wówczas po kliknięciu w przycisk [Generuj], podczas przekazywania dokumentów do Comarch BPM, wszystkie pliki xml generowanych dokumentów zostają automatycznie skonwertowane na pdfi zapisane w takiej formie na kontrolce typu Załącznik na nowoutworzonym dokumencie Comarch BPM oraz w bazie danych Comarch BPM jako format docelowy faktury.

 

Uwaga

Należy zwrócić uwagę, aby zaznaczyć checkbox „Konwertuj pliki KSeF *.xml do *.pdf” w ramach konfiguracji mapowań dla tego typu obiegu, do którego mają zostać wygenerowane dokumenty. Zaznaczenie parametru dla danego typu obiegu nie wpływa na generowanie dokumentów do innych typów obiegów.

 

Jeżeli zaznaczono checkbox „Konwertuj pliki KSeF *.xml do *.pdf”, a podczas próby generowania dokumentu z punktu ACD wystąpi błąd (przykładowo xml ma niepoprawny format, plik, nie jest fakturą KSeF lub nastąpił błąd SQL), wówczas generowanie dokumentu zostanie przerwane i wyświetli się komunikat informujący o błędzie. Utworzenie dokumentu nie będzie możliwe aż do naprawy błędu w danych źródłowych.

 

Konfiguracja mapowania kontrolki typu Załącznik z widocznym checkboxem „Konwertuj pliki KSeF *.xml do *.pdf” w ramach punktu ACD typu „Współpraca z dowolnym programem OCR“

 

Przykładowy komunikat wyświetlany podczas generowania dokumentu w przypadku, gdy wystąpił błąd przy próbie konwersji pliku xml do pdf (w tym przypadku:próbowano konwertować plik w innym formacie niż xml)

 

Na liście dokumentów w punktach ACD typu „Współpraca z dowolnym programem OCR” udostępniono przycisk [Wyświetl dokument], który znajduje się w prawym górnym rogu okna panelu podglądu. Jeśli operator kliknie w przycisk, wówczas system uruchamia konwersję na bieżąco i pokazuje jej wynik w ramach podglądu po lewej stronie okna Comarch BPM. Przycisk jest dostępny, jeśli podczas konfiguracji mapowania na kontrolkę typu Załącznik zaznaczono checkbox „Konwertuj pliki KSeF *.xml do *.pdf“. Po wyświetleniu podglądu dokumentu przycisk [Wyświetl dokument], zostaje ukryty.

 

Widok punktu ACD typu „Współpraca z dowolnym OCR“ z widocznym przyciskiem „Wyświetl dokument“

 

Jeżeli podczas konwersji pliku xml do pdf po kliknięciu w przycisk [Wyświetl dokument], wystąpiły błędy (przykładowo z powodu błędnych danych z zapytania SQL, braku zgodności z XML KSeF), wówczas zostanie wyświetlony komunikat o błędzie.

 

Przykładowy komunikat wyświetlany w przypadku, gdy wystąpił błąd podczas próby wizualizacji pliku xml (w tym przypadku:próbowano wyświetlić plik, który był w innym formacie niż xml)

 

Widok punktu ACD typu „Współpraca z dowolnym OCR“ po kliknięciu przycisku „Wyświetl dokument“ i po udanej konwersji pliku xml do pdf

 

Jeśli operator wybierze z listy dokumentów w punkcie ACD inny dokument, wówczas przycisk [Wyświetl dokument] pojawi się ponownie.

 

Przyklad

Przykładowe zapytania (dla poniższych przykładów: w punkcie ACD połączono się z bazą Comarch BPM, tabelę dbo.DF_WorkAPProcess utworzono w bazie Comarch BPM i z poziomu MSSQL nadano uprawnienie insert oraz select do tej tabeli operatorowi OD_User):

  • Dla bazy Comarch ERP XL (dla dokumentów z poczekalni):
    • Dla zakładki „Lista”:
BEGIN TRY 
    SELECT  
        T3.KSF_ID AS Id1, 
        0 AS Id2, 
         
        REPLACE(T3.KSF_DokumentObcy, '/', '_') AS [Numer Faktury], 
        T3.KSF_Numer AS [Numer KSeF], 
        T3.KSF_NazwaSprzedawcy AS [Sprzedawca], 
        T3.KSF_Netto AS [Kwota Netto], 
        T2.DAB_Nazwa AS [Nazwa Pliku], 
        T2.DAB_Rozmiar AS [Rozmiar], 
        CONVERT(VARCHAR, T2.DAB_CzasDodania, 23) AS [Data Dodania], 
        T2.DAB_Rozszerzenie AS Typ 

    FROM Nazwa_bazy_XL.cdn.KSeFDokumenty AS T3 
    INNER JOIN Nazwa_bazy_XL.cdn.DaneObiekty AS T1 ON T1.DAO_ObiTyp = 14560 AND T1.DAO_ObiNumer = T3.KSF_ID 
    INNER JOIN Nazwa_bazy_XL.cdn.DaneBinarne AS T2 ON T1.DAO_DABId = T2.DAB_ID 
    INNER JOIN Nazwa_bazy_XL.cdn.Slowniki AS S ON S.SLW_ID = T2.DAB_TypId 
     
   LEFT JOIN Nazwa_bazy_z_polaczenia.dbo.DF_WorkAPProcess AS B1  
        ON B1.APW_DocumentID1 = T3.KSF_ID  
        AND B1.APW_APDId = @PointId@  

    WHERE T3.KSF_DokTyp = 0  
      AND T3.KSF_DokNumer = 0  
      AND S.SLW_Predefiniowany = 247  
       
            AND B1.APW_Id IS NULL  

    ORDER BY T2.DAB_CzasDodania DESC 
END TRY 
BEGIN CATCH 
    DECLARE @ErrorMessage varchar(max) = 'Błąd listy: ' + ERROR_MESSAGE(); 
    THROW 50001, @ErrorMessage, 1; 
END CATCH
    • Dla kontrolki typu Załącznik na zakładce „Kontrolki”:
SELECT TOP 1 
    CAST(T2.DAB_Dane AS VARBINARY(MAX)) AS DaneBinarne, 
    'xml' AS Rozszerzenie, 
    REPLACE(REPLACE(ISNULL(T2.DAB_Nazwa, 'FakturaKSeF'), '/', '_'), '\', '_') AS Nazwa 
FROM Nazwa_bazy_XL.cdn.KSeFDokumenty AS T3 
INNER JOIN Nazwa_bazy_XL.cdn.DaneObiekty AS T1 ON T1.DAO_ObiTyp = 14560 AND T1.DAO_ObiNumer = T3.KSF_ID 
INNER JOIN Nazwa_bazy_XL.cdn.DaneBinarne AS T2 ON T1.DAO_DABId = T2.DAB_ID 
WHERE T3.KSF_ID = @Id1@  
  AND T2.DAB_Rozszerzenie = 'xml'  
  AND T2.DAB_Dane IS NOT NULL
  • Dla bazy Comarch ERP XL (dla dokumentów, które zostały wygenerowane z poczekalni do rejestru VAT):
    • Dla zakładki „Lista”:
BEGIN TRY 
    SELECT  
        T1.TrN_GIDNumer AS Id1, 
        T1.TrN_GIDTyp AS Id2, 
       
       CAST( 
RTRIM(CDN.NazwaObiektu(T1.TrN_GIDTyp, T1.TrN_GIDNumer, 0, 2)) + '  ' + ISNULL(T3.Knt_Akronm, '')  
        AS VARCHAR(100)) AS [Nazwa Faktury], 

 CONCAT(CDN.NazwaObiektu(T1.TrN_GIDTyp, T1.TrN_GIDNumer, 0, 2), ' | ', T3.Knt_Akronim) AS [InformacjeWyswietlaneNaLiscie] 

    FROM CDN.TraNag AS T1 WITH (NOLOCK) 
    INNER JOIN CDN.KSeFDokumenty AS T2 WITH (NOLOCK) ON T1.TrN_GIDTyp = T2.KSF_DokTyp 

AND T1.TrN_GIDNumer = T2.KSF_DokNumer 
    LEFT JOIN CDN.KntKarty AS T3 WITH (NOLOCK) ON T1.TrN_KntNumer = T3.Knt_GIDNumer 

AND T1.TrN_KntTyp = T3.Knt_GIDTyp 
    LEFT JOIN dbo.DF_WorkAPProcess AS B1 ON B1.APW_DocumentID1 = T1.TrN_GIDNumer 
  AND B1.APW_DocumentID2 = T1.TrN_GIDTyp  
    AND B1.APW_APDId = @PointId@ 

    WHERE T1.TrN_GIDTyp IN (1521)    AND 
    B1.APW_ID IS NULL 
    AND EXISTS (SELECT 1 FROM cdn.DaneObiekty AS DOB WHERE DOB.DAO_ObiTyp = 14560 

AND DOB.DAO_ObiNumer = T2.KSF_ID) 

    ORDER BY T1.TrN_DataWplywu DESC 
END TRY 
 BEGIN CATCH 
  DECLARE @ErrorMessage varchar(max) = 'W zapytaniu wystąpił błąd: ' + ERROR_MESSAGE(); 
  THROW 50001, @ErrorMessage ,1; 
 END CATCH
    • Dla kontrolki typu Załącznik na zakładce „Kontrolki”:
SELECT TOP 1 
    CAST(T2.DAB_Dane AS VARBINARY(MAX)) AS DaneBinarne, 
    'xml' AS Rozszerzenie 
FROM cdn.KSeFDokumenty AS T3 
INNER JOIN cdn.DaneObiekty AS T1  
    ON T1.DAO_ObiTyp = 14560  
    AND T1.DAO_ObiNumer = T3.KSF_ID 
INNER JOIN cdn.DaneBinarne AS T2  
    ON T1.DAO_DABId = T2.DAB_ID 
WHERE T3.KSF_DokNumer = @Id1@   /*pobiera TrN_GIDNumer dokumentu XL*/ 
  AND T3.KSF_DokTyp = @Id2@     /*pobiera TrN_GIDTyp dokumentu XL*/ 
  AND T2.DAB_Rozszerzenie = 'xml'  
  AND T2.DAB_Dane IS NOT NULL
  • Dla bazy Comarch ERP Optima (dla dokumentów z poczekalni):
    • Dla zakładki „Lista”:
BEGIN TRY 
    SELECT  
        T1.DKF_DKFID AS Id1, 
        0 AS Id2, 
        REPLACE(T1.DKF_NumerDokumentu, '/', '_') AS [Numer Dokumentu], 
        T1.DKF_NumerDokumentu AS [Numer Oryginalny], 
        T1.DKF_NumerKSeF AS [Numer KSeF], 
        T1.DKF_PelnaNazwa AS [Kontrahent], 
        T1.DKF_Brutto AS [Kwota], 
        'xml' AS Typ 
         
    FROM Nazwa_bazy_Optima.CDN.DokumentyKSeF AS T1 
    LEFT JOIN Nazwa_bazy_z_polaczenia.dbo.DF_WorkAPProcess AS B1  
        ON B1.APW_DocumentID1 = T1.DKF_DKFID  
        AND B1.APW_APDId = @PointId@ 

    WHERE (T1.DKF_WartoscXml IS NOT NULL OR T1.DKF_Html IS NOT NULL) 
      AND B1.APW_Id IS NULL  
    
    ORDER BY T1.DKF_DataPozyskania DESC 
END TRY 
BEGIN CATCH 
    SELECT ERROR_MESSAGE() AS ErrorMessage; 
END CATCH
    • Dla kontrolki typu Załącznik na zakładce „Kontrolki”:
SELECT  
    CAST(DKF_WartoscXml AS NVARCHAR(MAX)) AS DaneBinarne, 
    'xml' AS Rozszerzenie, 
    REPLACE(REPLACE(ISNULL(DKF_NumerDokumentu, 'Faktura'), '/', '_'), '\', '_') AS Nazwa 
FROM Nazwa_bazy_Optima.CDN.DokumentyKSeF 
WHERE DKF_DKFID = @Id1@
  • Dla bazy Comarch ERP Optima (dla dokumentów, które zostały wygenerowane z poczekalni do rejestru VAT):
    • Dla zakładki „Lista”:
BEGIN TRY
SELECT 
V.VaN_VaNID AS Id1, /* Klucz podpięty pod pobieranie załącznika */
V.VaN_Typ AS Id2, /* Typ dokumentu (dla rejestru zakupu to 1) */

-- Nazwa Faktury (zrzutowana na VARCHAR dla zgodności z interfejsem)
CAST(
RTRIM(V.VaN_Dokument) + ' ' + ISNULL(V.VaN_KntNazwa1, '') 
AS VARCHAR(255)) AS [Nazwa Faktury],

-- Pełna informacja na listę
CONCAT(V.VaN_Dokument, ' | ', V.VaN_KntNazwa1) AS [InformacjeWyswietlaneNaLiscie]

FROM 
CDN.VatNag AS V WITH (NOLOCK)
INNER JOIN 
CDN.DokumentyKSeF AS K WITH (NOLOCK) ON V.VaN_VaNID = K.DKF_VaNId
LEFT JOIN 
dbo.DF_WorkAPProcess AS B1 ON B1.APW_DocumentID2 = V.VaN_VaNID 
AND B1.APW_APDId = @PointId@

WHERE 
V.VaN_Typ = 1 /* Rejestr Zakupów */
AND K.DKF_Typ = 1 /* Dokumenty KSeF zakupowe */
AND B1.APW_ID IS NULL /* Tylko nieprzeprocesowane */

ORDER BY 
V.VaN_DataZap DESC

END TRY
BEGIN CATCH
DECLARE @ErrorMessage varchar(max) = 'W zapytaniu wystąpił błąd: ' + ERROR_MESSAGE();
THROW 50001, @ErrorMessage, 1;
END CATCH
    • Dla kontrolki typu Załącznik na zakładce „Kontrolki”:
SELECT 
CAST(DKF_WartoscXml AS NVARCHAR(MAX)) AS DaneBinarne,
'xml' AS Rozszerzenie,
REPLACE(REPLACE(ISNULL(DKF_NumerDokumentu, 'Faktura'), '/', '_'), '\', '_') AS Nazwa
FROM Nazwa_bazy_Optima.CDN.DokumentyKSeF
WHERE DKF_VaNId = @Id1@

Czy ten artykuł był pomocny?