İ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üş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övzu | Qı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 |
| 5 | Server çağırışının qiyməti | Az çağırış, çox iş: dövr daxilində server çağırışı etməyin |
| 6 | Tipik xətalar | Direktivsiz 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.
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.
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ər | Edə 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ək | Verilə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əri | Serverin daxili resurslarına birbaşa müdaxilə edə bilməz |
| İstifadəçi hadisələrini (klik, seçim) ilk qarşılayan işləyici olmaq | Obyektlə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ə) |
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.
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.
Ö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ən | Forma məlumatları + parametrlər | Yalnız parametrlər |
| Serverdən müştəriyə qayıdan | Də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əli | Bəli |
| Ötürülən məlumat həcmi | Böyük ola bilər | Minimaldır |
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 yeri | Forma konteksti | Baza ilə iş | Qeyd |
|---|---|---|---|---|
&НаКлиенте | Müştəri | Bəli (Элементы, rekvizitlər) | Yoxdur | İnterfeys məntiqi |
&НаСервере | Server | Bəli (məlumatlar ötürülür) | Bəli | Direktivsiz proseduranın standart rejimi |
&НаСервереБезКонтекста | Server | Xeyr | Bəli | Yalnı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ə) | Yoxdur | Hər iki tərəfdə lazım olan ortaq məntiq üçün |
&НаКлиентеНаСервереБезКонтекста | Həm müştəri, həm server | Xeyr | Yoxdur | Kontekstdən asılı olmayan ortaq funksiyalar |
&НаКлиентеНаСервере 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əli | Bəli (server çağırışı) | Bəli (server çağırışı) |
&НаСервере | Xeyr | Bəli | Bəli |
&НаСервереБезКонтекста | Xeyr | Xeyr (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ı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?
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.
// 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.
| Mal sayı (N) | Dövr: N × 51 ms | Toplu: 50 + N ms | Nisbət |
|---|---|---|---|
| 10 | 510 ms | 60 ms | ≈ 8,5× |
| 100 | 5 100 ms | 150 ms | ≈ 34× |
| 1 000 | 51 000 ms | 1 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.
İ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.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
КонецПроцедуры
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
- Kod iki mühitdə işləyir. İnterfeys müştəridə, verilənlər bazası serverdədir.
- Hər prosedurun direktivini açıq yazın. Direktivsiz forma prosedurları server kontekstində icra olunur.
- Forma konteksti lazımdırsa
&НаСервере, lazım deyilsə&НаСервереБезКонтекстаseçin. - Server çağırışlarının sayını azaldın. Dövr daxilində server çağırışı etməyin, kolleksiya ötürün.
- Dialoqları müştəridə, qeyri-modal şəkildə aparın (
ПоказатьВопросvəОписаниеОповещения). - 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.







