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 Proqramlasdirmada Icra Kontekstl Ri

&НаКлиенте, &НаСервере və &НаСервереБезКонтекста Arasındakı Fərq

1C:Enterpriseİdarə olunan tətbiqArxitektura və performansOxuma müddəti: ≈ 14 dəq

İdarə olunan formalarda düyməyə basanda gözləmə yaranırsa və ya forma gec açılırsa, səbəb çox vaxt alqoritmin özündə yox, kodun harada icra olunmasındadır. 1C:Enterprise kodu iki ayrı mühitdə, müştəridə və serverdə işlədir. Prosedurun başındakı &НаКлиенте, &НаСервере və &НаСервереБезКонтекста kimi direktivlər kodun hansı mühitdə icra olunacağını müəyyən edir. Bu məqalədə direktivlərin məntiqini, aralarındakı fərqləri və düzgün seçim strategiyasını araşdırırıq.

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

Müştəri və server mühitlərinin rolunu, forma kontekstinin nə olduğunu, direktivlərin müqayisəsini, hansı direktivin hansını çağıra biləcəyini, server çağırışlarının “qiymətini”, dövr daxilində server çağırışı səhvini və modal dialoqlarla bağlı düzgün yanaşmanı.

№MövzuQısa nəticə
1İki mühitİnterfeys müştərinin, verilənlər bazası serverin məsuliyyətidir
2&НаКлиентеİnterfeys məntiqi; bazaya birbaşa giriş yoxdur
3&НаСервереBaza ilə iş və forma konteksti; hər çağırışda forma məlumatları ötürülür
4&НаСервереБезКонтекстаYalnız parametrlər ötürülür; forma kontekstinə ehtiyac yoxdursa üstün seçimdir
5Server çağırışının qiymətiAz çağırış, çox iş: dövr daxilində server çağırışı etməyin
6Tipik xətalarDirektivsiz prosedur, modal dialoqlar, müştəridən bazaya yazı

1. Kod harada icra olunur?

İdarə olunan tətbiqdə kod vahid mühitdə deyil, iki məntiqi tərəfdə işləyir:

  • Müştəri (qalın müştəri, nazik müştəri və ya veb-brauzer): forma, düymələr, daxiletmə sahələri və istifadəçi ilə qarşılıqlı əlaqə burada işləyir.
  • Server (1C:Enterprise server və ya fayl variantında eyni kompüterdə işləyən server konteksti): verilənlər bazası ilə işləmək, sorğular, obyektlərin yazılması və ağır hesablamalar burada aparılır.

Hətta bütün komponentlər bir kompüterdə işləyəndə də (məsələn, fayl variantında), bu iki kontekst arasındakı sərhəd mövcuddur. Məlumat bu sərhəddən keçərkən ötürülməli, yəni seriyalaşdırılmalıdır. Tətbiqin ləngiməsinin əsas səbəblərindən biri bu keçidlərin sayı və ya ötürülən məlumatın həcmidir.

Müştəri Forma, düymələr İstifadəçi dialoqları &НаКлиенте Sərhəd Hər keçid: şəbəkə gecikməsi + seriyalaşdırma Server &НаСервере &НаСервереБезКонтекста Verilənlər bazası,sorğular, obyektlər çağırış → ← nəticə
Şəkil 1. İki icra mühiti və aralarındakı sərhəd

Ofisiant və mətbəx bənzətməsi

Bu münasibəti restoranla müqayisə etmək olar. Müştəri tərəf ofisiantdır: qonaqlarla ünsiyyət qurur, sifarişi qəbul edir, lakin yemək bişirmir. Server tərəf mətbəxdir: yeməyi hazırlayır, lakin zala çıxıb qonaqlarla danışmır. Ofisiant hər xırda məsələ üçün mətbəxə qaçsa, xidmət yavaşlayır. Eyni qayda burada da keçərlidir: müştərinin lazımsız server çağırışları tətbiqi ləngidir.

Qonaqİstifadəçi OfisiantMüştəri tərəf&НаКлиенте MətbəxServer tərəf&НаСервере... AnbarVerilənlərbazası Hər “zaldan mətbəxə” keçid vaxt aparır, ona görə sifarişləri toplu ötürmək daha səmərəlidir
Şəkil 2. Ofisiant və mətbəx bənzətməsi
Əsas qayda

Müştəri interfeysə, server isə verilənlər bazasına və ağır hesablamalara cavabdehdir. Sərhəddən hər keçid vaxt aparır, ona görə keçidlərin sayını və ötürülən məlumatın həcmini azaltmaq lazımdır.

2. &НаКлиенте: interfeysin sahibi

&НаКлиенте direktivi ilə işarələnmiş prosedur istifadəçinin kompüterində (müştəri kontekstində) icra olunur.

Edə bilərEdə bilməz
Forma elementləri ilə işləyə bilər: sahələrin görünüşünü, əlçatanlığını idarə etmək, başlıqları dəyişməkVerilənlər bazası obyektlərinə birbaşa müraciət edib oxuya və ya yaza bilməz (məsələn, sorğu icra edə bilməz)
İstifadəçi ilə dialoq aparmaq: xəbərdarlıq və sual pəncərələriServerin daxili resurslarına birbaşa müdaxilə edə bilməz
İstifadəçi hadisələrini (klik, seçim) ilk qarşılayan işləyici olmaqObyektləri (sənəd, qeyd) birbaşa yaza bilməz
Faylla iş (müştəri tərəfdən icazə və platforma imkanları çərçivəsində)
Qeyd

Fayllarla iş müştərinin növündən asılıdır. Veb-müştəridə təhlükəsizlik məhdudiyyətləri və əlavə mexanizmlər (məsələn, genişlənmə və ya xüsusi dialoqlar) lazım ola bilər. Mühitiniz üçün imkanları sənədləşmədən yoxlayın.

Qiymətlərin yenilənməsi — 1С:Предприятие Qiymətləri yenilə Bağla №MalMiqdarQiymət 1Alma102,50 2Armud53,10 3Nar84,00 4Üzüm122,80 Düyməyə klik → &НаКлиенте işləyicisi → mal siyahısı bir parametrlə serverə göndərilir.
Şəkil 3. İdarə olunan forma nümunəsi (illustrativ sxem, real ekran şəkli deyil)

3. &НаСервере: baza ilə iş və forma konteksti

&НаСервере direktivi kodun serverdə icra olunmasını təyin edir. Verilənlər bazasından oxuma, yazma, sorğular və mürəkkəb biznes-məntiq belə prosedurlarda aparılır.

Bu direktivin özünəməxsus xüsusiyyəti forma kontekstinin (ЭтаФорма) mövcudluğudur. Server prosedurunda forma rekvizitlərinə, Объект-ə və forma ilə bağlı digər imkanlara müraciət etmək olur. Bunun üçün platforma çağırış zamanı forma məlumatlarını (rekvizitlərin dəyərləri və formanın vəziyyəti) müştəridən serverə köçürür, prosedur bitdikdən sonra dəyişmiş məlumatları müştəriyə qaytarır.

Dəqiqləşdirmə

Ötürülən şey vizual elementlərin özü deyil, forma məlumatlarıdır (rekvizitlər, cədvəl hissələri, vəziyyət). Forma elementlərinə (Элементы) server prosedurunda birbaşa müraciət etmək mümkün deyil, çünki görünüşü idarə etmək müştəri tərəfin işidir. Böyük cədvəl hissələri olan formalarda bu köçürmə nəzərəçarpacaq yük yarada bilər.

Direktivsiz prosedur: gizli tələ

Forma modulunda direktivi göstərilməyən prosedur standart olaraq serverdə forma konteksti ilə (&НаСервере kimi) icra olunur. Başqa sözlə, unudulmuş direktiv lazımsız server çağırışına və kontekst ötürməsinə səbəb ola bilər. Hər prosedurun direktivini açıq yazın.

4. &НаСервереБезКонтекста: yüngül server çağırışı

Bu direktiv də serverdə icra olunur, lakin forma konteksti ötürülmür. Müştəridən serverə yalnız prosedurun parametrləri göndərilir və yalnız nəticə geri qayıdır.

&НаСервере&НаСервереБезКонтекста
Müştəridən serverə ötürülənForma məlumatları + parametrlərYalnız parametrlər
Serverdən müştəriyə qayıdanDəyişmiş forma məlumatları + nəticəYalnız nəticə və çıxış parametrləri
Объект, rekvizitlər, ЭтаФормаƏlçatandırƏlçatan deyil
Verilənlər bazası ilə işBəliBəli
Ötürülən məlumat həcmiBöyük ola bilərMinimaldır
&НаСервере Müştəri Forma məlumatları Server Forma məlumatları &НаСервереБезКонтекста Müştəri Parametrlər Server Parametrlər çağırış: forma məlumatı + parametrlərqayıdış: dəyişmiş məlumat + nəticəçağırış: yalnız parametrlərqayıdış: yalnız nəticə Qalın ox daha çox ötürülən məlumatı simvolizə edir (sxematik)
Şəkil 4. Kontekstli və kontekstsiz server çağırışında məlumat axını
Qayda

Server prosedurunda formanın rekvizitlərinə və ya Объект-ə ehtiyac yoxdursa, &НаСервереБезКонтекста seçin. Lazım olan məlumatı parametr kimi açıq ötürün. Bu həm şəbəkə yükünü, həm də serverdə emal olunan məlumat həcmini azaldır. Parametr kimi yalnız müştəri ilə server arasında ötürülə bilən (seriyalaşdırılan) tiplər istifadə oluna bilər.

// Nümunə: forma konteksti lazım deyil, parametr kimi ötürürük
&НаСервереБезКонтекста
Функция ServerdeMalinAdiniAl(MalSilkesi)
    Возврат MalSilkesi.Наименование;
КонецФункции

5. Bütün direktivlərin müqayisəsi

Direktivİcra yeriForma kontekstiBaza ilə işQeyd
&НаКлиентеMüştəriBəli (Элементы, rekvizitlər)Yoxdurİnterfeys məntiqi
&НаСервереServerBəli (məlumatlar ötürülür)BəliDirektivsiz proseduranın standart rejimi
&НаСервереБезКонтекстаServerXeyrBəliYalnız parametrlər ötürülür
&НаКлиентеНаСервереHəm müştəri, həm server (hər iki mühitdə kompilyasiya olunur)Bəli (ortaq imkanlar çərçivəsində)YoxdurHər iki tərəfdə lazım olan ortaq məntiq üçün
&НаКлиентеНаСервереБезКонтекстаHəm müştəri, həm serverXeyrYoxdurKontekstdən asılı olmayan ortaq funksiyalar
Qeyd

&НаКлиентеНаСервере köhnəlmiş deyil. O, eyni məntiqin həm müştərinin, həm serverin tərəfindən çağırıla bilməsi üçündür. Belə prosedurun kodu hər iki mühitdə kompilyasiya olunduğu üçün yalnız hər iki mühitdə mövcud olan imkanlardan istifadə edə bilər (məsələn, baza obyektlərinə və ya dialoqlara müraciət edə bilməz). Direktivlərin dəstəklənməsi platformanın versiyasından asılıdır, konkret versiyanız üçün sənədləşməni yoxlayın.

Kim kimi çağıra bilər?

Çağıran ↓ / Çağırılan →&НаКлиенте&НаСервере&НаСервереБезКонтекста
&НаКлиентеBəliBəli (server çağırışı)Bəli (server çağırışı)
&НаСервереXeyrBəliBəli
&НаСервереБезКонтекстаXeyrXeyr (kontekst yoxdur)Bəli

Server prosedurundan müştəri prosedurunu çağırmaq mümkün deyil: server istifadəçinin ekranına birbaşa çıxış əldə edə bilməz. Cavab müştəriyə nəticə kimi qaytarılır və sonrakı addım müştəri tərəfdə atılır.

Ümumi modullar haqqında

Ümumi modulların funksiyalarını müştəridən çağırmaq üçün modulda “Вызов сервера” bayrağı qoyulmalıdır. Bu da hər belə çağırışın server çağırışı olduğunu və yuxarıdakı qaydaların ona şamil edildiyini göstərir.

Direktivi necə seçməli?

Kod interfeysətoxunurmu? &НаКлиентеSahələr, dialoqlar, hadisələr Verilənlər bazasılazımdır? Ortaq məntiq&НаКлиентеНаСервере(БезКонтекста) Forma məlumatlarılazımdır? &НаСервереkontekst lazımdır &НаСервереБезКонтекстаtövsiyə olunan BəliXeyrXeyr, ortaqBəliBəliXeyr
Şəkil 5. Direktiv seçimi üçün sadələşdirilmiş alqoritm

6. Server çağırışının qiyməti

Müştəridən serverə hər keçid şəbəkə gecikməsi (round-trip latency) və məlumatın seriyalaşdırılması deməkdir. Tək çağırış sezilməyə bilər, lakin çağırışlar çoxaldıqca ümumi gecikmə yığılır. Ən tipik səhv müştəri dövrü daxilində server çağırışı etməkdir.

// Pis yanaşma: hər mal üçün ayrıca server çağırışı
Для Каждого Mal Из MalSiyahisi Цикл
    Qiymet = ServerdeQiymetiAl(Mal);   // N dəfə sərhəd keçidi
КонецЦикла;

Düzgün yanaşma “az çağırış, çox iş” prinsipidir: bütün malları kolleksiya kimi serverə bir dəfə göndərmək və nəticəni tək paketdə qaytarmaq.

Dövr daxilində N çağırış Müştəri Server Bir toplu çağırış Müştəri Server ... və s. (hər mal üçün ayrıca keçid) Массив
Şəkil 6. Çoxlu kiçik çağırış əvəzinə bir toplu çağırış
// Müştəri: siyahını toplayıb bir dəfə göndəririk
&НаКлиенте
Процедура QiymetleriYenile(Команда)

    MalMassivi = Новый Массив;
    Для Каждого Setir Из Объект.Mallar Цикл
        MalMassivi.Добавить(Setir.Mal);
    КонецЦикла;

    Qiymetler = ServerdeQiymetleriAl(MalMassivi);   // cəmi 1 server çağırışı
    // ... nəticəni formada göstəririk

КонецПроцедуры

// Server: sorğu bir dəfə icra olunur (reyestr adı nümunə üçündür)
&НаСервереБезКонтекста
Функция ServerdeQiymetleriAl(MalMassivi)

    Sorgu = Новый Запрос;
    Sorgu.Текст =
    "ВЫБРАТЬ
    |    Цены.Номенклатура КАК Mal,
    |    Цены.Цена КАК Qiymet
    |ИЗ
    |    РегистрСведений.Цены.СрезПоследних(, Номенклатура В (&MalMassivi)) КАК Цены";
    Sorgu.УстановитьПараметр("MalMassivi", MalMassivi);

    Возврат Sorgu.Выполнить().Выгрузить();   // ТаблицаЗначений

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

Sadə hesablama modeli

Aşağıdakı diaqram fərziyyəyə əsaslanan modeldir, real ölçmə deyil. Tutaq ki, hər server çağırışının sabit gecikməsi 50 ms, hər malın serverdə emalı isə 1 ms-dir. Dövr variantında zaman N × (50 + 1), toplu variantda 50 + N × 1 ms olur. Real rəqəmlər şəbəkədən, serverdən və sorğudan asılıdır.

Dövr daxilində çağırışBir toplu çağırış
10 mal
Dövr
510 ms
Toplu
60 ms
100 mal
Dövr
5,1 san
Toplu
150 ms
1000 mal
Dövr
51 san
Toplu
1,05 san
Şəkil 7. Fərziyyə modeli: gecikmə 50 ms, hər malın emalı 1 ms (illustrativ hesablama)
Mal sayı (N)Dövr: N × 51 msToplu: 50 + N msNisbət
10510 ms60 ms≈ 8,5×
1005 100 ms150 ms≈ 34×
1 00051 000 ms1 050 ms≈ 49×

7. Tez-tez rast gəlinən xətalar

7.1. Serverdə dialoq pəncərəsi çağırmaq

İstifadəçi ilə dialoq (sual, xəbərdarlıq) yalnız müştəri tərəfin imkanıdır. Вопрос, ПоказатьВопрос kimi metodlar server prosedurunda mövcud deyil və belə koda yazılmış çağırış kompilyasiya mərhələsində aşkarlanır.

Modallıq haqqında

İdarə olunan tətbiqdə modal pəncərələr standart olaraq məhdudlaşdırılıb. Platforma modal metodların (məsələn, Вопрос()) çağırışını qadağan edən bir rejimdə işləyə bilər və bu halda “modal pəncərələrin istifadəsi qadağandır” xətası müştəri tərəfdə də alına bilər. Buna görə müasir yanaşma qeyri-modal və bildiriş əsaslı metodlardır: ПоказатьВопрос və ОписаниеОповещения.

&НаКлиенте
Процедура Sil(Команда)
    Bildiris = Новый ОписаниеОповещения("SilCavabi", ЭтотОбъект);
    ПоказатьВопрос(Bildiris, "Qeyd silinsin?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура SilCavabi(Результат, ДопПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ServerdeSil(Объект.Ссылка);          // cavabdan sonra serverə keçirik
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ServerdeSil(ObyektSilkesi)
    ObyektSilkesi.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
КонецПроцедуры
&НаКлиентеSil (klik) ПоказатьВопросQeyri-modal sual &НаКлиентеSilCavabi (bildiriş) &НаСервереБезКонтекстаServerdeSil
Şəkil 8. Dialoq müştəridə, əməliyyat serverdə

7.2. Müştəridən bazaya birbaşa yazı

Müştəri kodunda sənəd, qeyd və ya sorğu kimi verilənlər bazası obyektləri ilə birbaşa işləmək mümkün deyil. Bütün dəyişikliklər server prosedurunda aparılmalıdır. Müştəri yalnız lazımi parametrləri hazırlayıb ötürür.

7.3. Kontekstdən asılı olmayan kod üçün lazımsız kontekst

Prosedur formanın məlumatlarından istifadə etmirsə, onu &НаСервере əvəzinə &НаСервереБезКонтекста ilə işarələyin. Əgər sonradan forma rekvizitlərinə ehtiyac yaranarsa, kontekstsiz prosedurun parametrlərinə həmin dəyərləri əlavə edin.

Yekun: 6 qayda yadda saxlayın

  1. Kod iki mühitdə işləyir. İnterfeys müştəridə, verilənlər bazası serverdədir.
  2. Hər prosedurun direktivini açıq yazın. Direktivsiz forma prosedurları server kontekstində icra olunur.
  3. Forma konteksti lazımdırsa &НаСервере, lazım deyilsə &НаСервереБезКонтекста seçin.
  4. Server çağırışlarının sayını azaldın. Dövr daxilində server çağırışı etməyin, kolleksiya ötürün.
  5. Dialoqları müştəridə, qeyri-modal şəkildə aparın (ПоказатьВопрос və ОписаниеОповещения).
  6. Bazaya yazı yalnız serverdə aparılır. Müştəri yalnız parametr hazırlayır.

Tez-tez verilən suallar

Direktiv yazmasam nə olacaq?

Forma modulunda direktivi göstərilməyən prosedur serverdə, forma konteksti ilə icra olunur. Bu, lazımsız server çağırışlarına səbəb ola bilər, ona görə direktivi hər zaman açıq göstərin.

&НаСервереБезКонтекста həmişə daha yaxşıdır?

Forma konteksti lazım olmadıqda bəli, daha yüngüldür. Lakin prosedur forma rekvizitlərini oxuyub dəyişirsə, &НаСервере lazımdır. Seçimi koda uyğun edin, yalnız sürət üçün konteksti çıxartmaq düzgün deyil.

Server prosedurundan müştəri prosedurunu çağırmaq olarmı?

Xeyr. Server müştəriyə birbaşa çıxış əldə edə bilmir. Nəticəni qaytarın və sonrakı addımı müştəri tərəfdə atın.

Serverə neçə çağırış “çoxdur”?

Ümumi ədəd yoxdur, ancaq dövr daxilində çağırış demək olar ki, həmişə düzəldilməlidir. Real vəziyyəti platformanın performans ölçmə alətləri ilə yoxlayın.

1C tətbiqiniz yavaş işləyir, optimallaşdırma və ya inteqrasiya lazımdır?

KodYaz komandası 1C proqramlaşdırması, performans təhlili 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