Wie Register in 1C in Gegenwart von OOP aussehen könnten

Bild

In 1C sind Register eines der Schlüsselelemente des Systems. Dieser Begriff hat sein Gegenstück im englischen Hauptbuch. Es erschien ursprünglich in der Buchhaltungspraxis, aber im Laufe der Zeit begann seine Logik, in anderen Bereichen verwendet zu werden.

Im Gegensatz zu 1C, wo Register zu den integrierten Typen gehören, gibt es in der lsFusion- Plattform selbst kein solches Konzept. Darin befinden sich jedoch Vererbung, Polymorphismus und Aggregation, die es Ihnen insbesondere ermöglichen, eine ähnliche Registerlogik zu implementieren. In diesem Artikel werde ich anhand von Beispielen zeigen, wie genau.

Ein Register ist eine Reihe von Datensätzen, von denen jede eine Zustandsänderung für eine bestimmte Reihe von Themen (oder Dimensionen) widerspiegelt.

In 1C gibt es 4 Arten von Registern:

  1. Buchhaltungsregister
  2. Abrechnungsregister
  3. Sparbuch
  4. Informationsregister

Die ersten beiden sind hochspezialisiert und werden nur für die Buchhaltung und Gehaltsabrechnung verwendet. Da lsFusion eine universelle Plattform für die Entwicklung von Geschäftsanwendungen ist, werde ich sie nicht berücksichtigen, obwohl es recht einfach ist, sie zu implementieren. Lassen Sie uns nur auf die letzten beiden Registertypen eingehen.

Sparregister


Jeder Eintrag im Register kann als Objekt einer abstrakten Klasse betrachtet werden. Angenommen, Sie möchten ein einfaches Register implementieren, das den Saldo eines vorrätigen Produkts berechnet.

Deklarieren Sie dazu eine abstrakte SkuLedger- Klasse:
CLASS ABSTRACT SkuLedger '   ';

, ( ).

Sku () Stock () . :
sku 'SKU' = ABSTRACT Sku (SkuLedger);
stock '' = ABSTRACT Stock (SkuLedger);

, :
dateTime '/' = ABSTRACT DATETIME (SkuLedger);

, , , 1 . , .
quantity '-' = ABSTRACT NUMERIC[14,2] (SkuLedger);

:
balance (Stock st, Sku sk) '' = GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk;

, . , . , MATERIALIZED. , , 1.

, :
CONSTRAINT balance(Stock st, Sku sk) < 0 
    MESSAGE '       ';

, , . , , . , , 1 , , 1 .

, , :
balance (Stock st, Sku sk, INTEGER year) = 
    GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND extractYear(dateTime(l)) = year MATERIALIZED;

. , , .

, :
balance '  ' (Stock st, Sku sk, DATETIME dt) = 
    GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND dateTime(l) <= dt;

, . . , (MATERIALIZED), :
balance '  ' (Stock st, Sku sk, DATETIME dt) =
   currentBalance(sk, st) (-) (GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND dateTime(l) > dt);

, , dateTime :
INDEX dateTime(SkuLedger l);

, .

, . :
CLASS Receipt '  ';
dateTime '/' = DATA DATETIME (Receipt);
stock '' = DATA Stock (Receipt);

CLASS ReceiptDetail '   ';
receipt '' = DATA Receipt (ReceiptDetail) NONULL DELETE;

sku 'SKU' = DATA SKU (ReceiptDetail);

quantity '-' = DATA NUMERIC[14,2] (ReceiptDetail);
price '' = DATA NUMERIC[14,2] (ReceiptDetail);

, . ReceiptDetail SkuLedger:
EXTEND CLASS ReceiptDetail : SkuLedger;

, , :
dateTime(ReceiptDetail d) += dateTime(receipt(d));

stock(ReceiptDetail d) += stock(receipt(d));

sku(ReceiptDetail d) += sku(d);
quantity(ReceiptDetail d) += quantity(d);

, .

, :

CLASS Transfer '    ';
posted '' = DATA BOOLEAN (Transfer);
dateTime '/' = DATA DATETIME (Transfer);

fromStock ' ()' = DATA Stock (Transfer);
toStock ' ()' = DATA Stock (Transfer);

CLASS TransferDetail '   ';
transfer '' = DATA Transfer (TransferDetail) NONULL DELETE;

sku 'SKU' = DATA SKU (TransferDetail);

quantity '-' = DATA NUMERIC[14,2] (TransferDetail);
price '' = DATA NUMERIC[14,2] (TransferDetail);

, . () , . , :
EXTEND CLASS TransferDetail : SkuLedger;

dateTime(TransferDetail d) += dateTime(transfer(d));

stock(TransferDetail d) += fromStock(transfer(d));

sku(TransferDetail d) += sku(d);
quantity(TransferDetail d) += -quantity(d);

, , .

, , , TransferSkuLedger, SkuLedger:
CLASS TransferSkuLedger '   ()' : SkuLedger;
transferSkuLedger = AGGR TransferSkuLedger WHERE stockTo(transfer(TransferDetail transferDetail));

AGGR , , , TransferSkuLedger, . .
:
dateTime(TransferSkuLedger d) += dateTime(transfer(transferDetail(d)));

stock(TransferSkuLedger d) += toStock(transfer(transferDetail(d)));

sku(TransferSkuLedger d) += sku(transferDetail(d));
quantity(TransferSkuLedger d) += quantity(transferDetail(d));

, , .

, 1 , :
, . , .

, , . , . , .


, , .

. :
CLASS ABSTRACT PriceLedger '   ';

dateTime '/' = ABSTRACT DATETIME (PriceLedger);

sku 'SKU' = ABSTRACT SKU (PriceLedger);
stock '' = ABSTRACT Stock (PriceLedger);

price '' = ABSTRACT NUMERIC[14,2] (PriceLedger);

:
price '' (Stock st, Sku sk, DATETIME dt) = 
    GROUP LAST price(PriceLedger l)
          ORDER dateTime(l), l
          WHERE dateTime(l) <= dt
          BY stock(l), sku(l);

, , . , , :
INDEX stock(PriceLedger l), sku(l), dateTime(l), l;

, , 1, lsFusion . , .

, :
EXTEND CLASS ReceiptDetail : PriceLedger;

dateTime(ReceiptDetail d) += dateTime(receipt(d));

stock(ReceiptDetail d) += stock(receipt(d));

sku(ReceiptDetail d) += sku(d);
price(ReceiptDetail d) += price(d);


1 , ( ). , 1 . , , , , (), .

lsFusion , . , , .

Source: https://habr.com/ru/post/de465221/


All Articles