在存在OOP的情况下1C中的寄存器可能看起来像

图片

在1C中,寄存器是系统的关键要素之一。 该术语的对等形式为英语-分类帐。 它最初出现在会计实践中,但随着时间的流逝,它的逻辑开始在其他领域使用。

与1C不同,其中寄存器是内置类型之一,而lsFusion平台本身没有这种概念。 但是其中包含继承,多态性和聚合,尤其是允许您实现类似的寄存器逻辑。 在本文中,我将通过示例演示如何实现。

寄存器是一组记录,每个记录反映了一组特定主题(或维度)的状态变化。

在1C中,有四种类型的寄存器:

  1. 会计登记册
  2. 帐单记录
  3. 储蓄登记册
  4. 信息登记册

前两个是高度专业的,仅用于会计和薪资。 由于lsFusion是用于开发业务应用程序的通用平台,尽管实现起来非常简单,但我不会考虑它们。 让我们只讨论最后两种类型的寄存器。

储蓄登记册


寄存器中的任何条目都可以视为某个抽象类的对象。 假设您要实现一个简单的寄存器,该寄存器可以计算库存产品的余额。

为此,请声明一个抽象的SkuLedger类:
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/zh-CN465221/


All Articles