ما السجلات في 1C يمكن أن تبدو في وجود OOP

صورة

في 1C ، تعد السجلات أحد العناصر الرئيسية للنظام. هذا المصطلح له نظيره في اللغة الإنجليزية - دفتر الأستاذ. بدا أصلاً في الممارسة المحاسبية ، ولكن مع مرور الوقت ، بدأ استخدام منطقه في مجالات أخرى.

بخلاف 1C ، حيث السجلات هي واحدة من الأنواع المضمنة ، فإن منصة lsFusion نفسها ليس لديها مثل هذا المفهوم. ولكن في ذلك هناك الميراث ، تعدد الأشكال والتجميع ، والذي ، على وجه الخصوص ، يسمح لك بتنفيذ منطق سجل مماثل. في هذه المقالة سأبين كيف بالضبط بالأمثلة.

السجل عبارة عن مجموعة من السجلات ، يعكس كل منها تغيير الحالة لمجموعة معينة من الموضوعات (أو الأبعاد).

في 1C هناك 4 أنواع من السجلات:

  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/ar465221/


All Articles