Seperti apa register dalam 1C di hadapan OOP

gambar

Dalam 1C, register adalah salah satu elemen kunci dari sistem. Istilah ini memiliki padanannya dalam buku besar berbahasa Inggris. Awalnya muncul dalam praktik akuntansi, tetapi seiring waktu, logikanya mulai digunakan di bidang lain.

Tidak seperti 1C, di mana register adalah salah satu tipe bawaan , tidak ada konsep seperti itu di platform lsFusion itu sendiri . Tetapi di dalamnya ada warisan, polimorfisme dan agregasi, yang, khususnya, memungkinkan Anda untuk menerapkan logika register yang serupa. Pada artikel ini saya akan menunjukkan bagaimana tepatnya dengan contoh.

Register adalah serangkaian catatan, yang masing-masing mencerminkan perubahan keadaan untuk serangkaian subjek (atau dimensi) tertentu.

Di 1C ada 4 jenis register:

  1. Daftar akuntansi
  2. Daftar penagihan
  3. Daftar Tabungan
  4. Daftar Informasi

Dua yang pertama sangat terspesialisasi dan hanya digunakan untuk akuntansi dan penggajian. Karena lsFusion adalah platform universal untuk mengembangkan aplikasi bisnis, saya tidak akan mempertimbangkannya, walaupun sangat sederhana untuk mengimplementasikannya. Mari kita membahas dua jenis register terakhir.

Register tabungan


Setiap entri dalam register dapat dianggap sebagai objek dari beberapa kelas abstrak. Misalkan Anda ingin menerapkan register sederhana yang menghitung saldo suatu produk dalam persediaan.

Untuk melakukan ini, deklarasikan kelas SkuLedger abstrak:
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/id465221/


All Articles