Baza wiedzy LINKSPOT › Obsługa Krajowego Systemu e-Faktur (KSeF)

Pobieranie danych z KSeF do kontrolki tabelarycznej Elementy na Fakturze zakupu XL

Obsługa Krajowego Systemu e-Faktur (KSeF) · Opublikowano 2026-01-16

Zastosowanie

Dzięki zastosowaniu tej zintegrowanej konfiguracji, proces obiegu faktur zakupu w Comarch BPM zyskuje pełną automatyzację i spójność danych. Dane są pobierane bezpośrednio z systemu KSeF (poprzez BPM), a kontrolka tabelaryczna jest automatycznie wypełniana.

Głównym celem jest:

Zawartość przykładu

Kliknij tutaj, aby pobrać przykład

Zasada działania

Mechanizm opiera się na dwóch trybach działania zintegrowanych w jednej kontrolce Dane Tabelaryczne (Elementy), wykorzystując dane z bazy Comarch BPM, które zostały zapisane po przetworzeniu faktury z KSeF w punkcie ACD.

Konfiguracja przykładu

  1. Utworzono kontrolkę ID_KSeF: Na karcie obiegu dodano kontrolkę typu Liczba całkowita o nazwie (identyfikatorze) ID_KSeF, do której będzie zapisywane ID dokumentu KSeF.

Kontrolka Liczba całkowita ID_KSeF

  1. Utworzono kontrolkę Tabelaryczną: Dodano kontrolkę typu Dane tabelaryczne o nazwie (identyfikatorze) Elementy i skonfigurowano w niej następujące kolumny:

Kolumny w kontrolce Dane tabelaryczne

  1. W kontrolce typu Dane tabelaryczne  na zakładce Listy zdefiniowano zapytanie pobierające:
 select Naz_gidLp as Id,  
 CASE  
  WHEN Naz_Nazwa='A 23.00' THEN '23%' 
  WHEN Naz_Nazwa='B 8.00' THEN '8%' 
  WHEN Naz_Nazwa='C 0.00' THEN '0%' 
  WHEN Naz_Nazwa='D 0.00' THEN 'ZW' 
  WHEN Naz_Nazwa='E 0.00' THEN 'NP' 
  WHEN Naz_Nazwa='F 7.00' THEN '7%' 
  WHEN Naz_Nazwa='G 5.00' THEN '5%' 
 END  
 from CDN.Nazwy  
 where Naz_GIDTyp = 624  AND trim(substring(Naz_Nazwa,9,2))=''

Lista Stawka VAT w kontrolce Dane tabelaryczne

  1. Dodano obserwację kontrolki: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości, dodano powiązanie do kontrolki ID_KSeF oraz do samej siebie.

Dane tabelaryczna, zakładka Inicjowanie wartości

  1. Dodano zapytanie SQL: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości w sekcji Wzór na wartość SQL ERP dodano zapytanie, które pobiera dane z tabeli do.KS_DocumentItems na podstawie przekazanego parametru @ID_KSeF@ (ID dokumentu KSeF). Zapytanie inicjuje kolumnę Towar jako wartość NULL, którą użytkownik powinien uzupełnić ręcznie.

W zapytaniu przed nazwą tabeli do.KS_DocumentItems należy wskazać właściwą nazwę bazy Comarch BPM.

Ta sekcja jest wywoływana tylko raz, podczas inicjowania obiegu:

IF @^SenderControlName@ = 'ID_KSeF' /*Identyfikator kontrolki do której pobierane jest ID dokumentu KSeF */ 
BEGIN 
    /* Tryb 1: Inicjowanie wierszy z dokumentu KSeF */ 
     
    WITH ProcessedDocumentItems AS ( 
        /* CTE 1: Ujednolicenie stawek VAT, tabela KSI_ElementStawkaVAT */ 
        SELECT 
              
            KSI_ElementNazwa, 
            KSI_ElementCenaNetto,     
            KSI_ElementIlosc,        
            KSI_ElementWartoscNetto, 
            KSI_ElementStawkaVAT,   
            CASE 
                WHEN di.KSI_ElementStawkaVAT LIKE 'Stawka%' THEN LTRIM(RTRIM(SUBSTRING(di.KSI_ElementStawkaVAT, 7, LEN(di.KSI_ElementStawkaVAT) - 6))) 
                WHEN di.KSI_ElementStawkaVAT = 'zw' THEN 'ZW' 
                WHEN di.KSI_ElementStawkaVAT = 'np' THEN 'NP' 
                ELSE di.KSI_ElementStawkaVAT 
            END AS StandardizedStawkaVAT 
        FROM 
            [BPM_Przyklady].do.KS_DocumentItems AS di  /*Należy wskazać nazwę bazy BPM*/ 
        WHERE KSI_DocumentId = @ID_KSeF@  /*Identyfikator kontrolki liczba całkowita, do której pobierane jest ID dokumentu KSeF*/ 
    ), 
    ProcessedNazwyRanked AS ( 
        /* CTE 2: Porządkowanie stawek VAT z tabeli słownikowej (CDN.Nazwy), w celu zapewnienia unikalności */ 
        SELECT 
            Naz_GIDLp, 
            Naz_Nazwa1, 
            CASE 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' THEN 'ZW' 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 'NP' 
                WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
            END AS StandardizedNazwa1_ForJoin, 
            CASE 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' OR LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 0.00 
                WHEN ISNUMERIC( 
                    CASE 
                        WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                        ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                    END 
                ) = 1 THEN CAST( 
                    CASE 
                        WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                        ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                    END 
                AS DECIMAL(5, 2)) / 100.0 
                ELSE 0.00 
            END AS CalculatedVATRate, 
            /* Numerujemy rekordy dla tego samego klucza łączenia. */ 
            ROW_NUMBER() OVER (PARTITION BY 
                CASE 
                    WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' THEN 'ZW' 
                    WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 'NP' 
                    WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                    ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                END 
            ORDER BY n.Naz_GIDLp ASC) as RN 
        FROM 
            CDN.Nazwy AS n 
        WHERE Naz_GIDTyp = 624  
    ), 
    ProcessedNazwy AS ( 
        /* CTE 3: Finalne, unikalne stawki */ 
        SELECT 
            Naz_GIDLp, 
            StandardizedNazwa1_ForJoin, 
            CalculatedVATRate 
        FROM 
            ProcessedNazwyRanked 
        WHERE RN = 1 /* Wybieramy tylko jeden (pierwszy) rekord dla każdej unikalnej stawki */ 
    ) 
    /* Końcowy SELECT: Zwraca żądany zestaw kolumn */ 
    SELECT 
         NULL AS 'Towar', 
        pi.KSI_ElementNazwa, 
        pi.KSI_ElementCenaNetto, 
        pi.KSI_ElementIlosc, 
        pi.KSI_ElementWartoscNetto, 
        pn.Naz_GIDLp AS 'stawka VAT', /* ID stawki z drugiej tabeli */ 
        pi.KSI_ElementWartoscNetto * (1 + pn.CalculatedVATRate) AS 'Wartość brutto' 
      
    FROM 
        ProcessedDocumentItems AS pi 
    JOIN 
        ProcessedNazwy AS pn 
    ON 
        pi.StandardizedStawkaVAT = pn.StandardizedNazwa1_ForJoin; 

END

Ta sekcja jest wywoływana przy każdej modyfikacji danych w kontrolce „Elementy” i wymaga użycia ELSE po sekcji KSeF:

ELSE 
IF @^SenderControlName@ = 'Elementy'  /*Identyfikator kontrolki Dane tabelaryczne*/ 
BEGIN 
    /* Tryb 2: Automatyczne przeliczanie wartości w trybie edycji */ 
     
    /* Kolumny 3-Cena, 4-Ilość, 6-Stawka VAT */ 
    IF @Elementy_Column@=3 OR @Elementy_Column@=4 OR @Elementy_Column@=6 
    BEGIN 
         
        DECLARE @VAT as decimal (4,2) 
           
         
        /* Pobranie stawki VAT  */ 
        SELECT @VAT=CAST(SUBSTRING (Naz_Nazwa1, 0, CHARINDEX (' ', Naz_Nazwa1)) as decimal (4,2))/100  
        FROM CDN.Nazwy  
        WHERE Naz_GIDTyp=624 AND Naz_GIDLp= 
            (SELECT [Stawka VAT]  
            FROM @Elementy@  
            WHERE POS=@Elementy_Row@) 

             
        UPDATE @Elementy@  
        /* Aktualizacja wartości Netto */ 
        SET [Netto] = (Ilosc * Cena), 
         
        /* Aktualizacja wartości Brutto */ 
        [Brutto] = (Ilosc * Cena) * (@VAT + 1)  
        WHERE POS=@Elementy_Row@ 

        /* Zwrócenie zaktualizowanej tabeli - Obowiązkowy select */ 
        SELECT * FROM @Elementy@  

    END 
     
END

Zapytanie SQL w kontrolce Dane tabelaryczne na zakładce Inicjowanie wartości

Kolumna Netto i Brutto w trybie „Do odczytu”

  1. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscNetto, w której dodano powiązanie do kontrolki Elementy i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Netto z kontrolki tabelarycznej:
select sum (Netto) from  @Elementy@

Kontrolka Liczbowa Wartość Netto

  1. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscBrutto, w której dodano powiązanie do kontrolki Elementy i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Brutto z kontrolki tabelarycznej:
select sum (Brutto) from  @Elementy@

Kontrolka Liczbowa Wartość Brutto

  1. Punkt ACD: W punkcie konfiguracyjnym ACD (Współpraca z KSeF), na zakładce Kontrolki, dodano kontrolkę ID_KSeF i przypisano jej zapytanie, które pobiera ID dokumentu KSeF: select @Id1@

Zdefiniowano również odpowiednie zapytania SQL do poszczególnych kontrolek, do których będą pobierane dane z KSeF.

Kontrolka ID_KSeF w punkcie ACD

Uzupełnione dane w punkcie ACD

Po pomyślnym pobraniu dokumentu z KSeF w punkcie ACD (Import dokumentów zakupu z KSeF), dane nagłówkowe oraz identyfikator dokumentu uzupełniły się automatycznie w kontrolkach na podstawie danych odczytanych z pliku XML.

Dane pobrane z KSeF w punkcie ACD

Uzupełniona Kontrolka Dane Tabelaryczne

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, kontrolka Dane Tabelaryczne została automatycznie wypełniona pozycjami odczytanymi z KSeF. Dla każdej pozycji, system automatycznie przeliczył i uzupełnił wartości w kolumnach Netto i Brutto w tym samym wierszu. W przypadku nieprawidłowości w kwotach możliwe jest przeliczanie wartości Netto/Brutto poprzez zmianę Ceny/Ilości lub Stawki VAT. Kolumna Netto oraz Brutto jest zablokowana do ręcznej edycji (tryb „Do odczytu”), co gwarantuje poprawność danych. Kontrolka Wartość Netto wyświetla poprawną sumę końcową z kolumny Netto kontrolki Dane tabelaryczne. Kontrolka Wartość Brutto wyświetla poprawną sumę końcową z kolumny Brutto kontrolki Dane tabelaryczne.

Uwaga

Kolumna „Towar” w kontrolce dane tabelaryczne jest inicjowana wartością null , ponieważ nazewnictwo na fakturach dostawców w KSeF często odbiega od kartotek w systemie ERP, co wymaga od użytkownika świadomego, ręcznego dopasowania pozycji do odpowiedniego indeksu towarowego przed zaksięgowaniem.

Kontrolka Dane tabelaryczne uzupełniona pozycjami odczytanymi z KSeF oraz podsumowanie kwot

Pozostałe dane uzupełnione na karcie obiegu

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, pozostałe dane na karcie obiegu zostały prawidłowo uzupełnione.

Uzupełnione dane na karcie obiegu pobrane z KSeF

Rozpoczynasz pracę z Comarch BPM (dawniej DMS) i chcesz dowiedzieć się, jak korzystać z programu? A może masz już podstawową wiedzę o Comarch BPM (dawniej DMS) i chcesz dowiedzieć się więcej?

Sprawdź Szkolenia Comarch BPM!

Powrót do początku artykułu

+ Mam problem z tym tematem Otwórz w portalu bazy wiedzy »