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@