1C proqramlaşdırmada peşəkar yanaşma – biznesiniz üçün optimal həllər

1c Proqramlasdirma Ucun F Rdi H Ll R
1C Avtomatlaşdırma

1C sisteminin fərdiləşdirilməsi, yeni modullar və mövcud funksiyaların genişləndirilməsi.

1c Il Biznesin R Q Msal Avtomatlasdirilmasi
Xidmətlərimiz

1C proqramlaşdırma, fərdi həllər, inteqrasiyalar və biznes proseslərinin avtomatlaşdırılması.

Kodyaz 1c Proqramlasdirma T Limi
Təlimlər

1C proqramlaşdırma dərsləri, praktiki tapşırıqlar və peşəkar inkişaf.

Kodyaz Il R Q Msal Inteqrasiya Ofisi
Rəqəmsal həllər

API inteqrasiyaları, avtomatlaşdırılmış iş axınları və süni intellekt əsaslı həllər.

1c D   Hesablamalar V Yuvarlaqlasdirma

1C Proqramlaşdırmada “Число”

1C:EnterpriseProqramlaşdırma əsaslarıOxuma müddəti: ≈ 10 dəq

1C-də ədədlərlə işləmək ilk baxışda çox sadə görünür. Lakin maliyyə hesablamaları, anbar qalıqları və ƏDV kimi məsələlərdə kiçik bir diqqətsizlik bazada bir neçə qəpiklik fərqə, sonra isə tapılması çətin uçot xətalarına çevrilə bilər. Bu məqalədə Число (ingiliscə Number) tipinin beş vacib xüsusiyyətini praktiki nümunələrlə izah edirik.

Məqalədə nələri öyrənəcəksiniz

Ədədlərin 1C-də necə saxlanıldığını, kodda kəsr ədədin düzgün yazılışını, yuvarlaqlaşdırmanın nə vaxt və necə aparılmalı olduğunu, ЗначениеЗаполнено() funksiyasının sıfıra münasibətini və ədəd ilə mətn arasında çevirmənin təhlükəsiz üsullarını.

№MəsələQısa nəticə
1Vahid ədəd tipiTam və kəsr ədədlər üçün ayrıca tip yoxdur; 150 / 4 = 37.5
2Onluq ayırıcıKodda yalnız nöqtə: 12.5
3YuvarlaqlaşdırmaTəsadüfi aralıq yuvarlaqlaşdırmadan çəkinin; qaydanı əvvəlcədən müəyyən edin
4Sıfır və “boş” dəyərЗначениеЗаполнено(0) nəticəsi Ложь-dur
5Ədəd ↔ mətnAçıq çevirmədən və xətaya qarşı qoruyucudan istifadə edin

1. Vahid tip: bütün ədədlər Число tipindədir

C++ və Java kimi dillərdə tam ədədlər (int) və kəsr ədədlər (float, double) ayrı tiplərdir. Bu dillərdə iki tam ədədi bir-birinə böləndə nəticə də tam ədəd olur və kəsr hissə atılır: 150 / 4 ifadəsi 37 verir.

1C-də isə müsbət, mənfi, tam və kəsr ədədlərin hamısı eyni Число tipinə aiddir. Ona görə bölmənin nəticəsi kəsr hissəni saxlayır.

C++ / Java int → 150 / 4 = 37 float double 1C:Enterprise Число (Number) 150 / 4 = 37.5 1C-də vahid tip
Şəkil 1. Ədəd tiplərinin müqayisəsi
TamEded  = 150;    // tam ədəd
KesrEded = 12.5;   // kəsr ədəd
MenfiEded = -7;    // mənfi ədəd

Cem   = TamEded + KesrEded;  // 162.5
Nisbet = TamEded / 4;        // 37.5
Vacib dəqiqləşdirmə

Tipin vahid olması hər yerdə sərbəst dəqiqlik demək deyil. Verilənlər bazasında saxlanılan rekvizitlərin, qeydiyyat sahələrinin və sütunların ədəd üçün uzunluq və dəqiqlik (onluq rəqəm sayı) göstəriciləri var. Dəyər yazılanda bu ölçülərə uyğunlaşdırılır. Məsələn, məbləğ üçün 2 onluq işarəsi olan rekvizitdə ikidən artıq kəsr rəqəm saxlanılmır.

2. Kodda onluq ayırıcı həmişə nöqtədir

İstifadəçi interfeysində ədəd regional ayarlara görə vergüllə göstərilə bilər, məsələn 12,5. Proqram kodunda isə kəsr ədəd yalnız nöqtə ilə yazılır.

// Düzgün
KesrEded = 12.5;

// Səhv: sintaksis xətası verir
// KesrEded = 12,5;

Səbəb sadədir: vergül 1C dilində ayırıcı işarədir. O, metod və funksiyaların parametrlərini bir-birindən ayırır:

Cem = Макс(12, 5);   // iki ayrı parametr: 12 və 5

Buna görə Макс(12,5) yazanda platforma 12,5 ədədini yox, 12 və 5 ədədlərini görür.

HaradaNecə yazılırNümunə
Proqram koduNöqtəQiymet = 12.5;
İstifadəçi interfeysiRegional ayarlardan asılıdır12,5 və ya 12.5
Mətndən ədədə çevirməMətnin formatına və yerli ayarlara diqqət edinЧисло("12.5")

3. Yuvarlaqlaşdırma: Окр, Цел və Формат

1C-də kəsr hissə ilə işləmək üçün iki əsas funksiya var. Onların ingilis dilli sintaksisdəki qarşılıqları da mötərizədə verilib.

FunksiyaNə edirNümunəNəticə
Окр (Round)Verilən dəqiqliyə qədər riyazi qaydada yuvarlaqlaşdırırОкр(2.567, 2)2.57
ОкрYarımı yuxarı yuvarlaqlaşdırır (standart rejim)Окр(2.5, 0)3
Цел (Int)Kəsr hissəni sadəcə atırЦел(2.9)2
ЦелMənfi ədəddə sıfıra doğru kəsirЦел(-2.9)-2
Формат (Format)Ədədi göstərmək üçün mətn qaytarırФормат(2.5, "ЧДЦ=2")"2,50" (mətn)

Окр funksiyasının üçüncü parametri yuvarlaqlaşdırma rejimidir: Окр15как10 (standart) və Окр15как20. Mühasibat qaydası fərqli rejim tələb edirsə, rejimi açıq göstərmək məsləhətdir.

Əsas qayda: yuvarlaqlaşdırma siyasəti əvvəlcədən müəyyən olunmalıdır

Çox yayılmış səhv hesablamanın hər addımında Окр çağırmaqdır. Çoxaddımlı hesablamalarda (endirim, ƏDV, gömrük rüsumu, valyuta çevirməsi) belə kiçik fərqlər toplanır və yekun məbləğ gözlənilən nəticədən sapır.

Konkret nümunə: sənəddə 3 sətir var, hər birinin məbləği endirimdən sonra 10.025-dir.

YanaşmaHesablamaYekun
Dəqiq cəm (yuvarlaqlaşdırmasız)3 × 10.02530.075
Hər sətri ayrıca yuvarlaqlaşdırmaq3 × Окр(10.025, 2) = 3 × 10.0330.09
Yalnız yekunu yuvarlaqlaşdırmaqОкр(30.075, 2)30.08

Fərq cəmi 1 qəpikdir, amma sətir sayı artdıqca böyüyür. Aşağıdakı diaqram ən pis hal üçündür: bütün sətirlərin məbləği eyni qaydada üçüncü onluq mərtəbədə 5-lə bitir.

1 sətir
0.005
10 sətir
0.05
100 sətir
0.50
1000 sətir
5.00
Şəkil 2. Hər sətirdə 10.025 → 10.03 yuvarlaqlaşdırmasından yaranan yığılmış fərq (AZN, nəzəri ən pis hal)
Mühüm istisna

Bəzi sənədlərdə (məsələn, qaimə və ya ƏDV hesablamasında) sətir üzrə yuvarlaqlaşdırma qanuni və ya biznes qaydası kimi tələb olunur. Bu halda qayda “heç vaxt yuvarlaqlaşdırma” deyil, “yuvarlaqlaşdırmanı müəyyən edilmiş yerdə və hər dəfə eyni qaydada aparın” olur. Əsas səhv bunun təsadüfi və ardıcıl olmamasıdır.

Təsadüfi yuvarlaqlaşdırma Qiymət × miqdar Окр() Endirim → Окр() ƏDV → Окр() Yekun (sürüşmə) Müəyyən edilmiş qayda Qiymət × miqdar Endirim ƏDV Окр() bir dəfə Yekun məbləğ Hesablama qaydası biznes tələbinə görə müəyyən edilir və bütün sənədlərdə eyni olur
Şəkil 3. Yuvarlaqlaşdırmanın yeri

Формат ilə Окр eyni şey deyil

Формат() ədədi mətnə çevirir və ekranda ya çap formasında göstərmək üçündür. Ondan sonra alınan nəticə ilə riyazi əməliyyat aparmaq olmaz. Bazaya yazılacaq məbləği isə Окр() ilə yuvarlaqlaşdırın.

// Məbləğin hesablanması (ədəd olaraq qalır)
Mebleg = Cemi * Faiz / 100;
Mebleg = Окр(Mebleg, 2);          // bazaya yazılacaq dəyər

// Yalnız göstərmək üçün (mətn)
Metn = Формат(Mebleg, "ЧДЦ=2");   // "125,50" (regional ayarlara görə)

4. Sıfır “boş” sayılır: ЗначениеЗаполнено(0) = Ложь

ЗначениеЗаполнено() (ValueIsFilled) dəyərin doldurulub-doldurulmadığını yoxlayır. Funksiya boş dəyər anlayışına əsaslanır: hər tipin öz “boş” dəyəri var. Ədəd üçün boş dəyər sıfırdır.

DəyərTipЗначениеЗаполнено()
0ЧислоЛожь
25ЧислоИстина
"" və ya yalnız boşluqlardan ibarət mətnСтрокаЛожь
'00010101' (boş tarix)ДатаЛожь
Неопределено, NULL—Ложь
Boş ссылкаСправочникСсылка...Ложь
Ложь / ИстинаБулевоhəmişə Истина
Praktiki təhlükə

Əgər sıfır sizin sahə üçün etibarlı dəyərdirsə (məsələn, qalıq 0, endirim 0%, qiymət 0), ЗначениеЗаполнено() ilə yoxlama bu halı “doldurulmayıb” hesab edəcək. Bu, səhv xəbərdarlıqlara və ya düzgün məlumatın rədd edilməsinə səbəb ola bilər.

// Sıfır etibarlı dəyər ola bilər: yalnız məlumatın olub-olmadığını yoxlayırıq
Если Qaliq = Неопределено Тогда
    Сообщить("Qalıq daxil edilməyib");
КонецЕсли;

// Sıfır "boş" sayılmalıdırsa, standart yoxlama işləyir
Если Не ЗначениеЗаполнено(Miqdar) Тогда
    Сообщить("Miqdar sıfırdan fərqli olmalıdır");
КонецЕсли;
Ədəd sahəsi Sıfır etibarlıdəyərdirmi? BəliQiymət <> Неопределено yoxlayın XeyrЗначениеЗаполнено(Qiymət) istifadə edin
Şəkil 4. Ədəd sahəsinin yoxlanması

5. Ədəd və mətn arasında çevirmə

1C dinamik tipləşməyə malikdir, ona görə ədəd və mətn bir ifadədə qarışa bilər. Bu zaman nəticə operandların yerinə və tipinə görə dəyişir. Belə “gizli” çevirmələrə güvənmək xətaya aparır, düzgün yol isə çevirməni açıq yazmaqdır.

MəqsədTəhlükəsiz yazılış
Ədədi mətnə birləşdirmək"Qiymət: " + Строка(25) və ya "Qiymət: " + Формат(25, "ЧДЦ=2")
Mətni ədədə çevirmək (məlumat etibarlıdır)Число("25")
Mətni ədədə çevirmək (məlumat kənardan gəlir)ОписаниеТипов("Число").ПривестиЗначение(Metn)
Dəyərin tipini yoxlamaqТипЗнч(Deyer) = Тип("Число")
Runtime xətası

Ədədə çevrilə bilməyən mətni Число() funksiyasına versəniz, məsələn Число("salam"), icra zamanı istisna yaranır və prosedur dayanır. Fayldan, API-dən və ya istifadəçidən gələn mətnləri bu funksiyaya qoruyucusuz verməyin.

// Variant 1: tip təsvirinə uyğunlaşdırma (xəta vermir, çevrilə bilmirsə 0 qaytarır)
Eded = ОписаниеТипов("Число").ПривестиЗначение(Metn);

// Variant 2: xətanı özünüz idarə etmək istəyirsinizsə
Попытка
    Eded = Число(Metn);
Исключение
    Сообщить("Mətn ədədə çevrilə bilmədi: " + ОписаниеОшибки());
    Eded = 0;
КонецПопытки;
Fərq nədədir?

Birinci variantda səhv məlumat səssizcə 0 olur. Maliyyə məlumatında bu özü də problem ola bilər, çünki yanlış sətir “0” kimi qəbul olunur. Belə hallarda ikinci variant və ya əvvəlcədən yoxlama daha doğrudur.

Yekun: 5 qayda yadda saxlayın

  1. Tip vahiddir, amma bazada saxlanılan dəyər rekvizitin uzunluq və dəqiqlik ayarlarına tabedir.
  2. Kodda onluq ayırıcı nöqtədir. Vergül parametr ayırıcısıdır.
  3. Yuvarlaqlaşdırma siyasətini əvvəlcədən seçin, Окр ilə bazaya yazın, Формат ilə yalnız göstərin.
  4. Sıfır boş dəyər sayılır (ЗначениеЗаполнено(0) = Ложь); sıfırın etibarlı olduğu yerdə Неопределено ilə yoxlayın.
  5. Mətni ədədə çevirəndə qoruyucu istifadə edin. Kənar məlumata etibar etməyin.

Tez-tez verilən suallar

1C-də Число tipi float kimi dəqiqlik itkisi yaradırmı?

Maliyyə hesablamalarında əsas risk tipin özündən çox yuvarlaqlaşdırma qaydasının səhv seçilməsindən yaranır. Bununla belə, kritik hesablamaları öz platforma versiyanızda test nümunələri ilə yoxlamaq yaxşı təcrübədir.

Окр yoxsa Формат istifadə etməliyəm?

Bazaya yazılan və sonrakı hesablamalarda iştirak edən məbləğ üçün Окр, ekranda və çap formasında göstərmək üçün Формат istifadə edin.

Sıfır məbləği necə düzgün yoxlayım?

Sıfırın etibarlı dəyər olub-olmadığını əvvəlcə müəyyən edin. Etibarlıdırsa Неопределено ilə, deyilsə ЗначениеЗаполнено() ilə yoxlayın.

Kənar mənbədən gələn mətni ədədə necə çevirim?

ОписаниеТипов("Число").ПривестиЗначение() və ya Попытка…Исключение blokundan istifadə edin; birbaşa Число() çağırışı xəta verə bilər.

1C-də maliyyə hesablamaları, inteqrasiya və avtomatlaşdırma üzrə dəstək lazımdır?

KodYaz komandası 1C proqramlaşdırması, fərdi həllər və təlimlər üzrə sizə kömək edə bilər. Bizimlə əlaqə saxlayın.

Şərh yaz

Sizin e-poçt ünvanınız dərc edilməyəcəkdir. Gərəkli sahələr * ilə işarələnmişdir