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 X Talarin Idar Edilm Si

1C-də “Попытка… Исключение”

1C:EnterpriseXətaların idarə edilməsiEtibarlı kodOxuma müddəti: ≈ 14 dəq

Sıfıra bölmə, tapılmayan fayl, qəfil kəsilən şəbəkə bağlantısı: real proqramda xətalar qaçılmazdır. Problem xətanın baş verməsində deyil, ona hazır olmamaqdadır. 1C:Enterprise dilində istisnaların (exceptions) idarə edilməsi Попытка ... Исключение ... КонецПопытки konstruksiyası ilə aparılır. Bu məqalədə onun işləmə məntiqini, tipik səhvləri, ВызватьИсключение, ИнформацияОбОшибке() və tranzaksiyalarla düzgün birgə istifadəni araşdırırıq.

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

Konstruksiyanın icra ardıcıllığını, xətanı “udmağın” niyə təhlükəli olduğunu, xətanı necə qəsdən yaratmaq və yuxarı ötürmək lazım olduğunu, xəta haqqında tam məlumatı necə əldə etməyi, tranzaksiya və Hadisələr jurnalı ilə düzgün sxemi.

№MövzuQısa nəticə
1Попытка ... ИсключениеXəta baş verən sətirdən sonrakı kod atılır, idarəetmə Исключение blokuna keçir
2Xətanı “udmaq”Boş Исключение bloku gizli və izlənməz xətalara yol açır
3ВызватьИсключениеXətanı qəsdən yaradır; blok daxilində parametrsiz yazılsa, xətanı yuxarı ötürür
4ИнформацияОбОшибке()Xətanın təsviri, modulu, sətri və səbəb zənciri
5TranzaksiyaXətada dəyişiklikləri özünüz geri qaytarmalısınız (ОтменитьТранзакцию)
6Nə vaxt istifadə etməliGözlənilən hallar yoxlamayla, gözlənilməzlər Попытка ilə idarə olunur

1. Konstruksiya necə işləyir?

Xəta riski olan kod Попытка blokuna yazılır. İcra ardıcıllığı belədir:

  1. Təhlükəli kod Попытка blokunda icra olunur.
  2. Hər hansı sətirdə xəta baş verərsə, blokun qalan sətirləri icra olunmur.
  3. İdarəetmə dərhal Исключение blokuna keçir.
  4. Xəta olmasa, Исключение bloku ümumiyyətlə işləmir.
Sifir = 0;

Попытка
    Netice = 10 / Sifir;                 // burada xəta baş verir
    Сообщить("Nəticə: " + Netice);       // bu sətir icra OLUNMUR
Исключение
    Сообщить("Xəta baş verdi: " + ОписаниеОшибки());
КонецПопытки;
Попытка başlayır Sətir 1 icra olunur Xəta var? Növbəti sətirlər Qalan sətirlər atılır(Xətadan sonrakı kod işləmir) Исключение bloku КонецПопытки → davam XeyrBəli
Şəkil 1. Попытка ... Исключение blokunun icra axını

Eyni kodun icra izi

Sifir = 0;icra olundu Попыткаicra olundu Netice = 10 / Sifir;XƏTA Сообщить("Nəticə: " + Netice);atlandı Сообщить("Xəta baş verdi: " + ОписаниеОшибки());Исключение bloku icra olundu
Şəkil 2. Xətadan sonrakı sətir atlanır, idarəetmə Исключение blokuna keçir
Vacib məhdudiyyətlər

1. Попытка yalnız icra zamanı (runtime) yaranan xətaları tutur. Sintaksis xətaları kod icra olunmamış kompilyasiya və ya konfiqurasiya yoxlaması mərhələsində aşkarlanır.

2. BSL dilində Finally (həmişə icra olunan blok) yoxdur. Resursu (fayl, bağlantı) bağlamaq lazımdırsa, bunu КонецПопытки-dən sonra ayrıca yazmaq lazımdır (2-ci hissədəki nümunəyə baxın).

3. Попытка xətanı tutur, amma verilənlər bazasında artıq edilmiş dəyişiklikləri geri qaytarmır. Bu barədə 5-ci bölmədə danışırıq.

Bənzətmə: təhlükəsizlik kəməri

Попытка təhlükəsizlik kəmərinə bənzəyir: qəza olsa da, sürücünü qoruyur. Lakin kəmər maşının zədələnməsini aradan qaldırmır. Eynilə, Попытка proqramın çökməsinin qarşısını alır, amma xətadan sonra məlumatın düzgün vəziyyətdə qalması üçün özünüz tədbir görməlisiniz.

2. Xətanı “udmaq” ən böyük günahdır

Yeni başlayanların ən tipik səhvi Исключение blokunu boş buraxmaqdır. Proqram çökmür, amma xəta da heç yerdə görünmür.

// PİS: xəta gizlədilir
Попытка
    SenediYaz(Sened);
Исключение
КонецПопытки;

Bu yanaşma gələcəkdə səbəbini tapmaq çətin olan “kabus” xətalara gətirir: məlumat natamam yazılır, hesablamalar sürüşür, istifadəçi isə əməliyyatın uğursuz olduğunu bilmir. Xəta ilə bağlı üç mümkün strategiya var:

StrategiyaXəta görünür?Jurnalda qalır?İstifadəçi məlumatlanır?Qiymətləndirmə
Boş Исключение (udmaq)XeyrXeyrXeyrYolverilməzdir
Tutmaq və istifadəçiyə mesaj verməkBəliİstəyə görəBəliDoğrudur (xətanı həll etmək mümkündürsə)
Jurnala yazmaq və yuxarı ötürməkBəliBəliYuxarı səviyyə qərar verirDoğrudur (xətanı bu səviyyədə həll etmək olmursa)
Qayda

Xəta ya burada tam idarə olunmalı və istifadəçiyə başa düşülən mesaj verilməlidir, ya da yuxarıya ötürülməlidir. Üçüncü variant (səssizcə udmaq) yoxdur.

Resursun bağlanması nümunəsi (Finally olmadığı üçün)

Oxuyucu = Неопределено;
Metn    = "";

Попытка
    Oxuyucu = Новый ЧтениеТекста(FaylinYolu, КодировкаТекста.UTF8);
    Metn = Oxuyucu.Прочитать();
Исключение
    Сообщить("Fayl oxuna bilmədi: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

// Bu hissə həm uğurlu, həm xətalı halda icra olunur
Если Oxuyucu <> Неопределено Тогда
    Oxuyucu.Закрыть();
КонецЕсли;
Xətabaş verdi BoşИсключение Xətagizlənir Natamam yazı Hesablama sürüşməsi İzlənməz “kabus” xəta
Şəkil 3. Boş Исключение blokunun nəticələri

3. ВызватьИсключение: xətanı qəsdən yaratmaq və ötürmək

Funksiyaya yanlış və ya təhlükəli məlumat daxil olubsa, kod səssizcə işləməməlidir. ВызватьИсключение komandası məqsədli şəkildə istisna yaradır. Nəticə xətanı çağıran koda ötürülür.

Функция Bol(A, B)

    Если B = 0 Тогда
        ВызватьИсключение "Sıfıra bölmək olmaz!";
    КонецЕсли;

    Возврат A / B;

КонецФункции

Попытка
    Netice = Bol(10, 0);
Исключение
    Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Xətanı yuxarı ötürmək (re-throw)

Исключение bloku daxilində ВызватьИсключение; parametrsiz yazılsa, tutulmuş xəta olduğu kimi yuxarıya ötürülür. Bu halda əvvəlcə lazımi əməliyyat (məsələn, jurnala yazmaq) aparılır, qərarı isə çağıran səviyyə verir.

Попытка
    ServerdeEmal(Parametr);
Исключение
    // 1. Hadisələr jurnalına yazırıq
    ЗаписьЖурналаРегистрации("Emal.Xeta", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

    // 2. Xətanı yuxarı ötürürük
    ВызватьИсключение;
КонецПопытки;
Diqqət

Parametrsiz ВызватьИсключение; yalnız Исключение bloku daxilində yazıla bilər. Həmin blokdan kənarda belə yazılış düzgün deyil. Əgər ВызватьИсключение bir Попытка blokunun içindədirsə, xəta həmin blokun özü tərəfindən tutulur.

Düymə işləyicisi EmalEt() Bol(10, 0) → ВызватьИсключение Burada tutuluristifadəçiyə mesaj Jurnala yazırВызватьИсключение; (yuxarı) Xəta çağırış zənciri ilə yuxarı qalxır; ilk uyğun Исключение bloku onu tutur
Şəkil 4. Xəta çağırış zənciri boyunca yuxarı qalxır

4. Xətanın “pasportu”: ИнформацияОбОшибке()

ИнформацияОбОшибке() cari xəta haqqında bütün texniki məlumatı özündə saxlayan xüsusi obyekt qaytarır (Структура deyil). Əsas xassələri:

XassəNəyi göstərir
ОписаниеXətanın mətni
ИмяМодуляXətanın baş verdiyi modulun adı
НомерСтрокиModuldakı sətir nömrəsi
ИсходнаяСтрокаXətalı sətrin mətni (bəzi hallarda boş ola bilər)
ПричинаBu xətanı yaradan daha dərin xəta (başqa ИнформацияОбОшибке obyekti) və ya Неопределено
Попытка
    Netice = 10 / 0;
Исключение
    Info = ИнформацияОбОшибке();

    Сообщить("Xətanın mətni: " + Info.Описание);
    Сообщить("Modul: " + Info.ИмяМодуля);
    Сообщить("Sətir: " + Info.НомерСтроки);
КонецПопытки;

Səbəb zənciri: əsl ilkin səbəbi necə tapmalı?

Xəta bir neçə çağırış səviyyəsindən keçəndə Причина xassəsi zəncir yaradır. Info.Причина yalnız növbəti səviyyəni göstərir, ilkin səbəb isə zəncirin sonundadır. Ona çatmaq üçün dövr lazımdır:

Info  = ИнформацияОбОшибке();
Koken = Info;

Пока Koken.Причина <> Неопределено Цикл
    Koken = Koken.Причина;
КонецЦикла;

Сообщить("İlkin səbəb: " + Koken.Описание);
InfoÜst səviyyə xətasıОписание Info.ПричинаAralıq səviyyə Info.Причина.Причинаİlkin səbəbПричина = Неопределено Dövr: Пока Koken.Причина <> Неопределено
Şəkil 5. Причина zənciri: dövrlə sona qədər enmək lazımdır

Üç “təqdimat” funksiyası

FunksiyaNə üçün
ОписаниеОшибки()Cari xətanın təsviri (Исключение bloku daxilində)
КраткоеПредставлениеОшибки(Info)İstifadəçiyə göstərmək üçün qısa, texniki detalsız mətn
ПодробноеПредставлениеОшибки(Info)Jurnal üçün tam məlumat: modul, sətir, səbəb zənciri
Qeyd

Funksiyaların qaytardığı mətnin dəqiq görünüşü platformanın versiyasından və xətanın tipindən asılı ola bilər. Mətnin formatını öz mühitinizdə yoxlayın.

İstifadəçi nəyi görməlidir?

İstifadəçiyə texniki sistem xətasını deyil, aydın və istiqamətləndirici mesajı göstərin. Texniki detalları isə Hadisələr jurnalına yazın.

Ошибка Sistem xətası (istifadəçiyə) {ОбщийМодуль.Emal.Модуль(142)}: Ошибка при вызове метода контекста (Записать) по причине: Деление на ноль OK Xəbərdarlıq Dost mesaj (istifadəçiyə) Qaimə yazıla bilmədi. Miqdar sıfır ola bilməz. Zəhmət olmasa, sahəni düzəldib yenidən cəhd edin. OK
Şəkil 6. Sistem xətası ilə istiqamətləndirici mesaj (illustrativ sxem, real ekran şəkli deyil)

5. Попытка və tranzaksiya: dəyişiklikləri geri qaytarmaq

Bir neçə obyekt ardıcıl yazılırsa (sənəd, hərəkətlər, qeydlər), ortada xəta baş verəndə bəziləri yazılmış, bəziləri yazılmamış qala bilər. Bunun qarşısını almaq üçün əməliyyatları tranzaksiyaya salın. Попытка özü bazadakı dəyişiklikləri geri qaytarmır, bunu ОтменитьТранзакцию() ilə siz etməlisiniz.

НачатьТранзакцию();

Попытка
    // bir neçə əlaqəli yazı əməliyyatı (obyekt adı nümunə üçündür)
    Sened = Документы.Realizasiya.СоздатьДокумент();
    Sened.Дата = ТекущаяДата();
    Sened.Записать(РежимЗаписиДокумента.Проведение);

    ZiyadeYazi(Sened.Ссылка);

    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();

    ЗаписьЖурналаРегистрации("Realizasiya.Yazma", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

    ВызватьИсключение;
КонецПопытки;
Начать-Транзакцию Попытка:yazı əməliyyatları ЗафиксироватьТранзакциюxəta yoxdur Исключение1. ОтменитьТранзакцию2. Jurnal 3. ВызватьИсключение UğurXəta
Şəkil 7. Tranzaksiya ilə xəta idarəsi sxemi
Qeyd

Tranzaksiya blokunda xətanı tutub davam etmək (tranzaksiyanı ləğv etmədən) təhlükəlidir. Tranzaksiya içində xəta olduqda, onu həmişə ləğv edin, sonra isə nə edəcəyinizə qərar verin.

6. Попытка nə vaxt lazımdır?

Попытка hər sətri bükmək üçün deyil, yoxlamaqla qarşısı alınmayan gözlənilməz hallar üçündür. Gözlənilən vəziyyəti isə sadə şərtlə yoxlamaq daha aydın və daha sürətlidir.

VəziyyətYaxşı yanaşma
Bölən sıfırdırЕсли B = 0 Тогда ... yoxlaması
Dəyər doldurulmayıbЗначениеЗаполнено() və ya Неопределено yoxlaması
Mətn ədədə çevrilməlidirОписаниеТипов("Число").ПривестиЗначение()
Fayl, şəbəkə, xarici sistem, COM, veb-xidmətПопытка + jurnal + mesaj
Bir neçə əlaqəli yazı əməliyyatıПопытка + tranzaksiya
Xəta gözlənilir vəyoxlana bilər? Şərtlə yoxlaЕсли ... Тогда Xarici amil və yaəlaqəli yazı var? Попытка+ log + mesaj / tranzaksiya BəliXeyrBəli
Şəkil 8. Попытка ilə şərt yoxlamasının seçimi

Etibarlılıq pilləkəni (konseptual)

Aşağıdakı diaqram konseptualdır, real ölçmə deyil: xətaya yanaşmanın keyfiyyət səviyyələrini göstərir.

Попытка yoxdur
1
Boş Исключение
0
Mesaj göstərir
2
Mesaj + jurnal
3
Jurnal + tranzaksiya + ötürmə
4
Şəkil 9. Xəta idarəsinin keyfiyyət səviyyələri (şərti, 0-dan 4-ə qədər)

7. Hadisələr jurnalı: xətanın izi

ЗаписьЖурналаРегистрации() funksiyası hadisəni 1C Hadisələr jurnalına (Журнал регистрации) yazır. Bu, istifadəçi mesajından fərqli olaraq, sonradan analiz üçün qalan izdir.

ParametrMənası
ИмяСобытияHadisənin adı (məsələn, "Realizasiya.Yazma"), jurnalda filtr üçün istifadə olunur
УровеньИнформация, Предупреждение, Ошибка, Примечание
ОбъектМетаданных, Данныеİstəyə görə: əlaqəli konfiqurasiya obyekti və məlumat
КомментарийMətn, xətalar üçün ПодробноеПредставлениеОшибки() nəticəsi
Журнал регистрации — Hadisələr jurnalı TarixSəviyyəHadisəŞərh 20.10 19:12InfoGirişİstifadəçi daxil oldu 20.10 19:15Xəbər.Import.FaylFayl boşdur 20.10 19:18XətaRealizasiya.YazmaДеление на ноль Texniki detallar (modul, sətir, səbəb) xəta sətrində saxlanılır. Proqramçı bu qeydə baxaraq xətanı istifadəçini narahat etmədən təhlil edə bilər.
Şəkil 10. Hadisələr jurnalı: xətanın texniki izi (illustrativ sxem, real ekran şəkli deyil)

Yekun: 6 qayda yadda saxlayın

  1. Попытка yalnız icra zamanı xətalarını tutur və xətadan sonrakı kodu atır.
  2. Boş Исключение yazmayın. Xətanı ya idarə edin, ya da yuxarı ötürün.
  3. ВызватьИсключение ilə yanlış vəziyyəti dərhal bildirin; blokda parametrsiz yazılışı xətanı yuxarı ötürür.
  4. ИнформацияОбОшибке() ilə sətir, modul və səbəb zəncirini toplayın; ilkin səbəb üçün dövrdən istifadə edin.
  5. Tranzaksiyada xətada həmişə ОтменитьТранзакцию() çağırın.
  6. Gözlənilən halı şərtlə, gözlənilməz halı Попытка ilə idarə edin; istifadəçiyə dost mesaj, jurnala texniki detal verin.

Tez-tez verilən suallar

Попытка proqramın sürətinə təsir edirmi?

Xəta baş vermədikdə təsiri adətən nəzərə çarpmır. Yenə də onu dövr daxilində lazımsız yerə və hər sətirdə işlətməyin, çünki kodun oxunaqlılığını azaldır.

Попытка bazadakı dəyişiklikləri geri qaytarırmı?

Xeyr. Dəyişiklikləri geri qaytarmaq üçün tranzaksiya istifadə edin və xətada ОтменитьТранзакцию() çağırın.

ОписаниеОшибки() yoxsa ИнформацияОбОшибке()?

Sadə mətn üçün ОписаниеОшибки() kifayətdir. Modul, sətir və səbəb zənciri lazımdırsa, ИнформацияОбОшибке() istifadə edin.

Finally kimi blok varmı?

BSL dilində ayrıca Finally bloku yoxdur. Resursları bağlamaq üçün КонецПопытки-dən sonra yoxlamalı kod yazın.

1C proqramınızın xətalara qarşı dayanıqlığını artırmaq istəyirsiniz?

KodYaz komandası 1C proqramlaşdırması, kodun auditi, inteqrasiya və fərdi həllə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