Baza wiedzy LINKSPOT › Wskazówki

Pobieranie danych z KSeF do kontrolki tabelarycznej Elementy na Fakturze zakupu przy współpracy z Comarch ERP Optima

Wskazówki · Opublikowano 2026-04-10

Zastosowanie

Głównym celem konfiguracji jest automatyzacja procesu wprowadzania pozycji faktur zakupu pobranych z Krajowego Systemu e-Faktur (KSeF) bezpośrednio do systemu Comarch BPM zintegrowanego z Comarch ERP Optima. Dzięki zastosowaniu zaawansowanej logiki SQL, proces ten:

Przykład jest oparty o definicję typu obiegu dostępną na stronach walidowanych w sekcji ERP 5.0->Comarch BPM (dawniej DMS)->Przykłady->ERP Optima

Zawartość przykładu

W przypadku kontrolki Kontrahent w zapytaniu przed nazwą tabeli CDN.Kontrahenci należy wskazać właściwą nazwę bazy Comarch Optima.

Kliknij tutaj, aby pobrać przykład

Zasada działania

Mechanizm opiera się na dwóch trybach pracy zintegrowanych w kontrolce Dane Tabelaryczne (Elementy):

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 Twr_TwrId, Twr_Kod from cdn.Towary

Kod towaru 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ę Kod Towaru i Towar jako wartość NULL, którą użytkownik powinien uzupełnić ręcznie.

Uwaga

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

IF @^SenderControlName@ = 'ID_KSeF'
BEGIN
    WITH ProcessedDocumentItems AS (
        SELECT
            di.KSI_DocumentId,
            di.KSI_ElementIlosc,
            di.KSI_ElementJm,
            di.KSI_ElementCenaNetto,
            di.KSI_ElementCenaBrutto,
            di.KSI_ElementWartoscNetto,  
            di.KSI_ElementWartoscBrutto,  
            di.KSI_ElementStawkaVAT,
            CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS INT) AS RowLP,
           CASE
                WHEN di.KSI_ElementStawkaVAT LIKE 'Stawka%' THEN LTRIM(RTRIM(SUBSTRING(di.KSI_ElementStawkaVAT, 7, LEN(di.KSI_ElementStawkaVAT))))
                WHEN di.KSI_ElementStawkaVAT IN ('zw', 'np', 'oo') THEN UPPER(di.KSI_ElementStawkaVAT)
                ELSE di.KSI_ElementStawkaVAT
            END AS StandardizedKSeFVAT_Text
        FROM
            [BPM_OPT].do.KS_DocumentItems AS di   /* Nazwa bazy BPM */
        WHERE 
            di.KSI_DocumentId = @ID_KSeF@
    ),

    OptimaVATRates AS (
        SELECT
            Kon_Wartosc,
            CASE 
                WHEN Kon_Wartosc LIKE '%ZW%' OR Kon_Wartosc LIKE '%NP%' OR Kon_Wartosc LIKE '%OO%' THEN 0.00
                ELSE ISNULL(TRY_CAST(REPLACE(RTRIM(SUBSTRING(Kon_Wartosc, 1, CHARINDEX(' ', Kon_Wartosc + ' ', 2))), ',', '.') AS REAL), 0) 
            END AS StawkaVatValue,

            CASE
                WHEN Kon_Wartosc LIKE '%ZW%' THEN 'ZW'
                WHEN Kon_Wartosc LIKE '%NP%' THEN 'NP'
                WHEN Kon_Wartosc LIKE '%OO%' THEN 'OO'
                ELSE CAST(ISNULL(TRY_CAST(REPLACE(RTRIM(SUBSTRING(Kon_Wartosc, 1, CHARINDEX(' ', Kon_Wartosc + ' ', 2))), ',', '.') AS REAL), 0) AS VARCHAR(10))
            END AS StandardizedOptimaVAT_Text
        FROM
            [CDN_KNF_Konfiguracja].cdn.Konfig   /* Nazwa bazy konfiguracyjnej Comarch ERP Optima*/
        WHERE 
            Kon_Numer = 301 AND Kon_Wartosc LIKE '%PL'
    ),

    CalculatedBase AS (
        SELECT 
            pi.*,
            ISNULL(ovr.StawkaVatValue, 0) AS vStawka,
            ISNULL(pi.KSI_ElementCenaNetto, 0) AS vCenaNetto_In,
            ISNULL(pi.KSI_ElementCenaBrutto, 0) AS vCenaBrutto_In,
            ISNULL(pi.KSI_ElementWartoscNetto, 0) AS vWartoscNetto_In,
            ISNULL(pi.KSI_ElementWartoscBrutto, 0) AS vWartoscBrutto_In
        FROM ProcessedDocumentItems AS pi
        LEFT JOIN OptimaVATRates AS ovr ON pi.StandardizedKSeFVAT_Text = ovr.StandardizedOptimaVAT_Text
    )

    SELECT
        CAST(NULL AS VARCHAR(50)) AS [Towar],
        CAST(NULL AS VARCHAR(50)) AS [Kod Towaru], 
        CAST(KSI_ElementIlosc AS DECIMAL(18, 4)) AS [Ilość],
        CAST(KSI_ElementJm AS VARCHAR(10)) AS [Jednostka],
        CAST(vStawka AS DECIMAL(18, 2)) AS [Stawka],

        /* Cena Netto: Priorytet Netto, jeśli brak -> wylicz z Brutto */
        CAST(CASE 
            WHEN vCenaNetto_In <> 0 THEN vCenaNetto_In 
            ELSE vCenaBrutto_In / (1.0 + vStawka / 100.0) 
        END AS DECIMAL(18, 2)) AS [Cena Netto],

        /* Cena Brutto: Priorytet Brutto, jeśli brak -> wylicz z Netto */
        CAST(CASE 
            WHEN vCenaBrutto_In <> 0 THEN vCenaBrutto_In 
            ELSE vCenaNetto_In * (1.0 + vStawka / 100.0) 
        END AS DECIMAL(18, 2)) AS [Cena Brutto],

        /* Wartość Netto */
        CAST(CASE 
            WHEN vWartoscNetto_In <> 0 THEN vWartoscNetto_In
            ELSE vWartoscBrutto_In / (1.0 + vStawka / 100.0)
        END AS DECIMAL(18, 2)) AS [Wartość Netto],

        /* Wartość Brutto */
        CAST(CASE 
            WHEN vWartoscBrutto_In <> 0 THEN vWartoscBrutto_In
            ELSE vWartoscNetto_In * (1.0 + vStawka / 100.0)
        END AS DECIMAL(18, 2)) AS [Wartość Brutto]
    FROM
        CalculatedBase;

END;
ELSE
IF @^SenderControlName@ ='Elementy'
Begin

IF @Elementy_Column@=3 or @Elementy_Column@=6 /* Przeliczanie ceny brutto i wartości netto i brutto po wskazaniu ilości i ceny netto*/
BEGIN
UPDATE @Elementy@ 
set 
[Cena_Brutto]=(Cena_netto + (Cena_Netto*(Stawka/100))),
[Wartosc_Netto]=(Cena_Netto * ilosc),
[Wartosc_Brutto]=((Cena_Netto * ilosc)+(Cena_Netto * ilosc)*(Stawka/100))
where POS=@Elementy_Row@

END

IF @Elementy_Column@=3 or @Elementy_Column@=7 /* Przeliczanie ceny netto i wartości netto i brutto po wskazaniu ilości i ceny brutto*/
BEGIN
UPDATE @Elementy@ 
set 
[Cena_Netto]=Cena_Brutto / ((Stawka/100)+1),
[Wartosc_Netto]=(Cena_Brutto / ((Stawka/100)+1) * ilosc),
[Wartosc_Brutto]=(((Cena_Brutto / ((Stawka/100)+1)) * ilosc)+((Cena_Brutto / ((Stawka/100)+1)) * ilosc)*(Stawka/100))
where POS=@Elementy_Row@

END

IF @Elementy_Column@=3 or @Elementy_Column@=8 /* Przeliczanie wartości brutto oraz ceny netto i brutto po wskazaniu ilości i wartości netto*/
BEGIN
UPDATE @Elementy@ 
set 
[Cena_Netto]=Wartosc_Netto / ilosc, 
[Cena_Brutto]=((Wartosc_Netto / ilosc) + ((Wartosc_Netto / ilosc)*(Stawka/100))),
[Wartosc_Brutto]=Wartosc_Netto + (Wartosc_Netto*(Stawka/100))
where POS=@Elementy_Row@

END

IF @Elementy_Column@=3 or @Elementy_Column@=9 /* Przeliczanie wartości netto oraz ceny netto i brutto po wskazaniu ilości i wartości brutto*/
BEGIN
UPDATE @Elementy@ 
set 
[Cena_Netto]=(Wartosc_brutto / ((Stawka/100)+1)) / ilosc, 
[Cena_Brutto]=Wartosc_brutto / ilosc,
[Wartosc_netto]=Wartosc_brutto / ((Stawka/100)+1)
where POS=@Elementy_Row@

END
SELECT * FROM @Elementy@

END

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

Kolumna Jm i Stawka w trybie „Do odczytu”

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

Kontrolka Liczbowa Razem netto

  1. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze Razem_brutto, 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 (Wartosc_Brutto) from  @Elementy@

Kontrolka Liczbowa Razem 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@
  1. 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 tabelaryczna Elementy zostaje automatycznie wypełniona pozycjami odczytanymi bezpośrednio z systemu KSeF. Mechanizm ten zapewnia pełną zgodność danych z fakturą źródłową. System automatycznie przenosi dane dotyczące ilości, jednostki miary, stawek oraz wartości dla każdego wiersza faktury. Kolumna Jm oraz Stawka jest zablokowana do ręcznej edycji (tryb „Do odczytu”), co gwarantuje poprawność danych. Kontrolka Razem netto wyświetla poprawną sumę końcową z kolumny Wartość netto kontrolki Dane tabelaryczne. Kontrolka Razem brutto wyświetla poprawną sumę końcową z kolumny Wartość brutto kontrolki Dane tabelaryczne.

Uwaga

Kolumna „Kod Towaru” oraz „Towar” w kontrolce dane tabelaryczne są inicjowane 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 »