İT sistemlərini dizayn edərkən, proqram memarları tez-tez bir məhsulun bir neçə ölçü vahidindən istifadə edə biləcəyini təmin etməlidirlər.
Burada mümkün ssenarilər hansılardır? Təsəvvür edin ki, taxılla məşğul olan qida qablaşdırma biznesimiz var. Biz təchizatçılardan mal alırıq, onları rahat qablaşdırmaya qoyuruq və bağlamaları pərakəndə satış şəbəkələrinə çatdırırıq. Təbii ki, tədarükçülər çəki tonla hesablayır, biz isə kiloqramla məşğul olmaq istəyirik. Hansı ölçü vahidlərindən istifadə edəcəyimizə qərar verməliyik. Ton, kiloqram, yoxsa başqa bir şey olmalıdır?
Burada tapşırığın mümkün həllini təklif etmək istərdik.
1C konfiqurasiyasını yaratmaqla başlayın. Biz mallarla işlədiyimiz üçün kataloqsuz gedə bilmərik. Gəlin onu yaradaq.
Bu mərhələdə "Products" (Məhsullar) kataloquna heç bir atribut lazım deyil.
"Unit of Measurement"(Ölçü vahidi) adlı bir hissə olduğundan, onu saxlamaq üçün kataloqa ehtiyacımız olduğu aydındır. "UOMClassifier" adlı ikinci kataloqu yaratmağın vaxtı gəldi.
Bu kataloqda kiloqram, ton, litr, vahid və başqaları kimi standart ölçü vahidləri saxlanılır.
Növbəti addımımız "Products" və "UOMClassifier" kataloqlarını əlaqələndirməkdir. Davam etməzdən əvvəl burada mühasibatlıq nəzəriyyəsinə ehtiyacımız var.
Beləliklə, ton və kiloqram kimi bir neçə ölçü vahidindən istifadə edə bilən bir mal var. Aydındır ki, biz eyni anda hər iki vahiddən istifadə edə bilmərik.
Düzünü desəm, biz faktiki olaraq müxtəlif vahidlərdə səhm balansını qeyd edə bilərik, lakin bu, proqramı daha da mürəkkəbləşdirəcək. Və memarın əsas vəzifələrindən biri arxitekturanı mümkün qədər sadə etmək və ya sözlə desək, məlumatların saxlanması prosesini "normallaşdırmaq"-dır. Bu o deməkdir ki, heç kim real həyatda bir mal üçün bir neçə ölçü vahidindən istifadə etməyəcək.
Beləliklə, hər bir element vahid əsas ölçü vahidi tələb edir. Yəni balansı hesablamaq üçün bu bir ölçü vahidindən istifadə etmək istəyirik. Satış və ya alqı-satqı əməliyyatlarında digər vahidləri tətbiq etməmiz lazım gələrsə, proqram avtomatik olaraq dönüşüm nisbəti vasitəsilə dəyəri hesablayır.
"MeasurementUnit" atributunu əlavə edin, "Products" kataloquna "CatalogRef.UOMClassifier" yazın:
Atributda göstərilən ölçü vahidi balanslar (reyestrlərdə qeydlər) üçün əsas vahid hesab olunur.
Bu da bir vacib şeyi diqqətimizə çatdırır. Tətbiqdə artıq qalıqlar varsa (yəni reyestrlərdə malların miqdarı haqqında qeydlər var), istifadəçilər ölçü vahidlərini dəyişə bilməməlidirlər.
Nümunə: Anbarımızda 150 metrlik kağız rulonu var. Əməkdaşımız “Products” kataloqunu açır və ölçü vahidlərini metrdən kilometrə dəyişir. Bu vəziyyətdə ədədi dəyər eyni qalır. Nəticədə sistem anbarda 150 kilometrlik (!) kağız rulonu bildirir. Təsəvvür edə bilərsiniz ki, belə bir dəyişiklik şirkət rəhbərliyini xoşbəxt etməyəcək.
Beləliklə, qızıl qayda elementin əsas vahidində hər hansı dəyişikliyin qarşısını almaqdır. İşçi yalnız yeni mal əlavə edərkən ölçü vahidini təyin edə bilər. Bundan sonra ölçü vahidi dəyişdirilə bilməz. Nəzərə alın ki, 1C platforması bu cür yoxlamaları həyata keçirmir və tətbiqə müvafiq kodu əlavə etmək tərtibatçının məsuliyyətidir.
İşimiz bitdi? Əslində yox. Gəlin bir az vaxt ayırıb bunu nəzərdən keçirək. Ölçü vahidləri üçün təsnifatçıdan (kataloqdan) istifadə etmək istəyirik, lakin bunlar çox fərqli ola bilər. Onların arasında kiloqramlar, kilometrlər, millər və funtlar var. Ona ölçü vahidləri olan qutuları və qutuları da əlavə edin. İndi təsəvvür edin ki, hesab-fakturalar üzərində işləyən işçilər vahidlərin bu çılğın siyahısında hərəkət etməlidirlər. Nə qədər xoşbəxt və səmərəli olacaqlar? Tez bir zamanda səhvsiz sənəd əldə etmək şansları nə qədərdir?
Hər dəfə yeni sənəd yaradılanda ölçü vahidlərinin götürülməsi iş prosesini açıq şəkildə ləngidər və çox güman ki, çoxsaylı xətalara səbəb ola bilər. Bununla bağlı nə edə bilərik? Mümkün variantlardan biri "Products" və "UOMClassifier" kataloqları arasında əlaqə qura bilən üçüncü bir qurumun təqdim edilməsidir. Onu həyata keçirməyin bir neçə yolu var. Beləliklə, tapşırıq üçün məlumat reyestrindən istifadə edə bilərik. Amma bizim vəziyyətimizdə üçüncü varlıq kimi başqa kataloqdan istifadə etmək kifayətdir.
"UOM" kataloqu yaradın və "Number" tipli "Ratio" atributunu və "CatalogRef.UOMClassifier" tipli "UOMClassifier" atributunu əlavə edin:
Çox vacib bir şeyin vaxtı gəldi: yeni yaradılmış kataloq üçün sahibi təyin etmək. Burada sahib "Products" kataloqu olmalıdır:
Bu, birdən çox əlaqə yaratmağa imkan verir ki, bu da bir elementin bir neçə ölçü vahidinə malik ola biləcəyini bildirir. "Ratio" atributu ilə vahidləri çevirə bilirik.
Biz “UOM” kataloqundan əlavə ölçü vahidlərini saxlamaq üçün istifadə etmək istəyirik, halbuki elementin əsas vahidi birbaşa “Products” kataloqunda (“MeasurementUnit” atributu) müəyyən edilir.
Ölçü emalı vahidləri konsepsiyasını nümayiş etdirmək üçün çox sadə bir "SupplierInvoice" sənədi yaradaq. Konfiqurasiyamız daxilində sənəd yaradın və ona "İnventory" cədvəl bölməsini əlavə edin. İndi "Product" və "Quantity" olan iki atribut əlavə etməliyik:
Əsas vahid kimi "pieces" seçdiyimiz halda (verilənlər bazasında istifadə ediləcək vahid) və təchizatçı malları qutularda, hər biri 10 ədəd təqdim edərsə, "SupplierInvoice" qutuların sayını deyil, qutuların sayını göstərməlidir.
Bu zaman balans reyestrində kəmiyyət hissə-hissə qeyd edilməlidir. Bunu etmək üçün bizə "MeasurementUnit" adlı daha bir atribut lazımdır.
Onun rolu sənədi yerləşdirərkən müvafiq ölçü vahidlərindən istifadəni mümkün etmək üçün müəyyən bir sənəd növü üçün ölçü vahidlərini saxlamaqdır.
Beləliklə, əgər bizim əsas ölçü vahidimiz parçalara ayrılıbsa (məlumat bazası balanslar üçün bu vahiddən istifadə edir) və "SupplierInvoice" 10 ədədi müəyyən edirsə, verilənlər bazası onu 10 kimi qeyd edir. "Ratio" 5 (yəni, hər qutuda 5 ədəd) və elan edilmiş miqdar 10-dur, verilənlər bazası onu 50 ədəd (5 x 10) kimi qeyd edir.
"MeasurementUnit" atributu belə işləyir. Bəs bu atribut üçün hansı növü təyin etməliyik? Xatırladığınız kimi, bizdə iki kataloq var: ölçü vahidləri üçün vahid təsnifatçı kimi "UOMClassifier" və hər bir mal üçün ölçü vahidlərinin saxlanması üçün yer kimi "UOM". Yenidən. "MeasurementUnit" atributuna hansı növü təyin etməliyik?
Cavab odur ki, biz kompozit məlumat növündən istifadə etməliyik. Bu, "MeasurementUnit" atributuna hər iki kataloqun dəyərlərini saxlamağa imkan verir: "UOMClassifier" və "UOM":
Belə bir yanaşmanın faydası nədən ibarətdir? Təsəvvür edin ki, bizdə kq-la hesablanmış mal var. Belə elementə tətbiq edilən atribut "UOMClassifier" kataloqudur. Yuxarıda göstərilən malların sənədimizə əlavə edilməsi üçün müvafiq kataloqa “MeasurementUnit” aid edilməlidir.
Sonra, əlavə ölçü vahidindən, məsələn, qramdan istifadə etmək istəsək, bizə "UOM" kataloqu lazımdır. Əgər malın miqdarını qramla göstərmək istəyiriksə, "MeasurementUnit" müvafiq kataloq növünə aid edilməlidir. İndi aydın olur ki, "SupplierInvoice" sənədi üçün "MeasurementUnit" atributu kompozit tipli olmalıdır.
Və son toxunuş. "UOM" kataloqu "Products" kataloquna tabe olduğundan, "UOM" kataloqunu seçərkən istifadəçilər yalnız müəyyən mallara aid ölçü vahidlərini görə bilməlidirlər. Biz bunu necə təşkil edirik? Mümkün variantlardan biri müvafiq hadisələr üçün işləyicilər yaratmaqdır. Yenə də daha asan bir yol var.
"MeasurementUnit" atributunda "Choice parameters links" xassəsindən istifadə edin:
"Choice parameters links" xassəsini təyin etməklə biz mallar və ölçü vahidləri arasında əlaqə qururuq. İndi istifadəçilər yalnız müəyyən bir məhsula aid ölçü vahidlərini görə bilərlər.
Əsasən, bu, həll arxitekturası ilə əlaqəli olan hər şeydir və biz kodlaşdırma ilə davam etməyə demək olar ki, hazırıq.
Tətbiqə başlayın və kataloqları doldurun. Konfiqurasiyanı işə salın, "UOMClassifier" kataloquna keçin və onu doldurun:
"Products" kataloqunu seçin və bir mal əlavə edin. Əsas ölçü vahidi kimi kiloqramı seçin:
Bu mal üçün əlavə ölçü vahidləri kimi qram və ton əlavə edin.
"Ratio" və "UOMClassifier" dəyərlərinin düzgün olduğundan əmin olun.
Dizaynerə qayıdın və "SupplierInvoice" formasını yaradın:
İndi biz seçilmiş malların hesabı ilə "MeasurementUnit" atributu üçün məlumatları seçə bilən kod yazmalıyıq. Bu məqsədlə, sənədin cədvəl bölməsindəki "Product" atributu üçün "OnChange" hadisəsindən istifadə edə bilərsiniz:
Hadisəni aşağıdakı kodla emal etmək olar:
Fikir sadədir. Sənədin cədvəl bölməsindəki mal elementi dəyişdirildikdə, "MeasurementUnit" atributu müəyyən bir element üçün standart ölçü vahidi alır.
Bunun necə işlədiyini yoxlamaq vaxtıdır. 1C-ni dialoq rejimində işə salın, yeni "SupplierInvoice" sənədi yaradın və sənədə mal elementi əlavə edin. Tətbiq avtomatik olaraq ölçü vahidi əlavə edir:
Əla! Biz yolun yarısındayıq. Başqa ölçü vahidi seçməyə çalışsaq, proqram məlumat növünü tələb edir və yalnız bundan sonra mövcud vahidlərin siyahısını göstərir:
Beləliklə, növbəti addımımız istifadəçilərə ölçü vahidlərini rahatlıqla seçmək imkanı verən kod yaratmaqdır.
Dizaynerə qayıdın və sənəd cədvəli bölməsində "OnChange" hadisəsi üçün "SupplierInvoice" formasında işləyici yaradın:
Kod budur.
Kodun düzgün işlədiyini yoxlamaq vaxtıdır. 1C-ni işə salın, yeni "SupplierInvoice" sənədi yaradın, mal əlavə edin və ölçü vahidini seçməyə cəhd edin:
Siz avtomatik olaraq müvafiq ölçü vahidlərinin siyahısını əldə edirsiniz və sizə lazım olanı seçə bilərsiniz. Yekun sənəd belə görünə bilər:
Yəni tədarükçü 1500 qram məhsul təqdim edib. Amma biz razılaşdıq ki, kiloqram əsas ölçü vahidi olsun. Beləliklə, məlumat bazası (balans reyestri) 1.5-dən ibarət olmalıdır. Kiloqramı ölçü vahidi kimi əlavə etməyə ehtiyac yoxdur, çünki o, malın obyekti ilə əlaqələndirilir və malın bütün ömrü boyu dəyişməz qalır.
İndi biz bu məqalənin ən maraqlı hissəsinə keçirik: reyestrdə sənəd məlumatlarının yazılması.
Gəlin “İnventory” yığım reyestrini yaradaq. Bu bizim balansımız üçün bir yerdir. Beləliklə, reyestr növü "Balanslar"dır:
İndi "CatalogRef.Products" növü ilə "Products" ölçüsünü yaradın:
və malların miqdarına dair məlumatları saxlamaq üçün lazım olan "Quantity" resursu:
Reyestrimizə qeydiyyatçı da daxil etməliyik. Qeydiyyatçılar dedikdə, reyestrdə qeydləri başladan sənədlər nəzərdə tutulur.
İndi "SupplierInvoice" sənədi üçün kod yaratmaq vaxtıdır. Bu kod indicə yaratdığımız reyestrə məlumatları yazmalıdır. Sənədimizi Dizaynerdə açın, "Records" bölməsinə keçin və "Record wizard" işə salın:
Siz artıq "Receipt" olaraq təyin edilmiş reyestr qeydi növü ilə sehrbaz formasını alırsınız. Cədvəl bölməsini seçin:
Bundan sonra, "Fill Expressions" düyməsini və ya aşağı formanı doldurmaq üçün sağdakı "Document attributes"-da bütün tələb olunan atributları iki dəfə klikləyə bilərsiniz:
"OK" düyməsini basın. Sehrbaz kodu yaradır və nəzərdən keçirmək üçün onu açır. Bu belə görünməlidir:
Bəzi düzəlişlər edək. "İnventory" reyestrində "Include in the command interface" bayrağının seçildiyinə əmin olun:
"DocumentForm" a gedin və "Command interface" bölməsində "İnventory" reyestrini görünən vəziyyətə qoyun.
Bu bayraq bütün sənəd reyestrinin qeydlərini birbaşa formada görmək imkanı verir.
1C-ni yenidən dialoq rejimində işə salın və əvvəllər yaradılmış "SupplierInvoice" sənədini yerləşdirin. "İnventory" hissəsinə keçin:
Gördüyünüz kimi, sehrbazın yaratdığı kod yaxşı işlədi və "İnventory" reyestrinə malların məbləği haqqında qeyd daxil oldu.
Yenə də burada 1,5 əvəzinə 1500 göstərilir, tətbiq isə 1500 qramı 1,5 kiloqrama çevirməli idi, çünki burada kiloqram əsas ölçü vahididir.
Onun yaxşı görünməsi üçün sənədin yerləşdirilməsi zamanı malların miqdarını çevirən kiçik bir əlavəyə ehtiyacımız var. İcazə verin, bir daha xatırlatım. Bütün məbləğlər kiloqramla göstərilməlidir. Beləliklə, "SupplierInvoice" moduluna daxil olun və sehrbaz tərəfindən əvvəllər yaradılmış kodu aşağıdakı kimi dəyişdirin:
Gördüyünüz kimi dəyişikliklər o qədər də böyük deyil. Tətbiq göndərilərkən cari "MeasurementUnit"i yoxlayır. Əgər onun "CatalogRef.UOMClassifier" növü varsa, biz əsas vahiddən istifadə edirik və heç bir çevrilmə tələb olunmur. Əgər ölçü vahidi “UOM” kataloqundan götürülərsə, həmin məbləğ “Ratio” hesabı ilə yenidən hesablanır.
Proqramı dialoq rejimində işə salaq və kodu işlək vəziyyətdə yoxlayaq. Əvvəllər yaradılmış sənədi yenidən yerləşdirin və “İnventory” reyestrində qeydi yoxlayın.
Göründüyü kimi, qramla göstərilən sənəd dəyəri reyestrə əlavə edildikdə kiloqrama çevrilmişdir.
Eyni mal üçün daha bir sətir əlavə etməklə əlavə yoxlama apara bilərik, lakin ölçü vahidi kimi bir ton seçə bilərik. Bunu edin:
Yaxşı, kod mükəmməl işləyir: bir ton min kiloqrama çevrildi.
Əsasən budur. 1C platformasının standart mexanizmlərindən istifadə edərək, bir mal üçün bir neçə ölçü vahidini idarə etmək üsulunu öyrəndik.