1'lerde olay işleyicisi nedir? Tüm etkinlik abonelikleri. Bir belgeyi "Gönderirken" etkinliğine abonelikler

Bu makale yeni işlevlere ilişkin bir duyurudur.
Yeni işlevler öğrenmek için bu makalenin içeriğinin kullanılması önerilmez.
Yeni işlevselliğin tam açıklaması ilgili sürümün belgelerinde sağlanacaktır.
Yeni sürümdeki değişikliklerin tam listesi v8Update.htm dosyasında sağlanmaktadır.

EDT 1.7.0.567 sürümünde uygulanmıştır.

1C:Enterprise Development Tools'da (EDT) yeni bir aracın prototipini uyguladık. Bu aracın çalışma adı editördür Tüm etkinlik abonelikleri. Uygulama çözümünde mevcut olan tüm etkinliklere yönelik abonelikleri rahatlıkla analiz etmenize yardımcı olacaktır.

Etkinlik abonelikleri

1C:Enterprise platformu, uygulama çözümündeki yapılandırma nesnelerinin olaylarına abonelikler oluşturmanıza olanak tanır. Abonelik, orijinal olay işleyicisinin yürütülmesinden sonra yürütülecek bir prosedürdür. Aboneliklerin kolaylığı, bir prosedürün farklı konfigürasyon nesnelerine ait bir olaya "abone olabilmesi" gerçeğinde yatmaktadır. Böylece, hem bir organizasyonu kaydederken hem de bir departmanı kaydederken yürütülmesi gereken bir algoritma varsa, bu abonelikte bulunabilir ve daha sonra nesnelerin kendilerinde bu olay için işleyicileri değiştirmenize bile gerek kalmaz.

Aboneliğin kullanışlı ve evrensel bir mekanizma olduğu ortaya çıktı. Ancak büyük uygulama çözümlerinde etkinlik aboneliklerinin sayısı birkaç yüze ulaşabilir. Bunları konfigürasyon ağacında, doğrusal bir listede analiz etmek sakıncalı hale gelir. Örneğin, bir uygulama çözümünde 1C:Kurumsal yönetim (ERP) 340'tan fazla etkinlik aboneliği.

EDT, abonelikleri panelde göstererek onlarla çalışmayı biraz kolaylaştırır Şema, bazı uygulama nesnelerinin bir modülü açıldığında.


Aboneliklerin bu gösterimi, bir modülün düzenlenmesiyle ilgili bir dizi görev için kullanışlıdır. Ancak belirli bir olay meydana geldiğinde aboneliklerde yürütülen tüm algoritmaları hızlı bir şekilde bulup analiz etmeniz gerektiğinde yine de uygun değildir.

Tüm etkinlik abonelikleri

Yukarıda listelenen rahatsızlıklardan kurtulmak için abonelik algoritmalarının uygulandığı abonelikleri, olayları, yapılandırma nesnelerini ve prosedürleri temsil etmenin evrensel bir yolunu uyguladık.


Sonuç olarak editörü arayabilirsiniz Tüm etkinlik abonelikleri tüm konfigürasyon için veya yalnızca bir nesne için - fark yalnızca bir şekilde filtrelenen verilerin bileşiminde olacaktır.


Sol tarafta editör tüm etkinlikleri ve her etkinlikte tüm abonelikleri gösterir. Belirli bir aboneliği seçtiğinizde, aboneliğin "abone olduğu" olaylara ait yapılandırma nesnelerinin bir listesi sağ üstte görüntülenir. Abonelik algoritmasının yer aldığı modül ve prosedür ise sağ altta gösterilmektedir. Bir prosedüre çift tıklayarak onu yerleşik dil düzenleyicide açabilirsiniz.

Editördeyken yalnızca bireysel abonelikleri değil aynı zamanda bir etkinlikle ilgili tüm abonelikleri de analiz edebilirsiniz. Bir etkinlik seçerseniz editör, bu etkinliği işlemek için imzalanan tüm modülleri ve tüm prosedürleri gösterecektir.


Düzenleyiciyi bir yapılandırma nesnesi için çağırırsanız, yalnızca o nesnenin olayları ve abonelikleri gösterilecek ve nesnenin kendisi kaynak listesinde her zaman kırmızı renkle vurgulanacaktır. Bu şekilde, örneğin seçtiğiniz aboneliğin, ihtiyaç duyulan tüm yapılandırma nesneleri için çalışıp çalışmadığını hızlı bir şekilde kontrol edebilirsiniz.


Düzenleyiciyi bir bağlam komutu (bir yapılandırma nesnesi üzerinde) kullanarak çağırmak, düzenleyicide görüntülenen abonelik sayısını anında azaltmanıza olanak tanır. Örneğin, yalnızca nesne modülünde veya yönetici modülünde işlenen olaylara ilişkin abonelikleri görüntüleyebilirsiniz.


Ek olarak editör, nesnelerin, olayların ve prosedürlerin kompozisyonunu istediğiniz şekilde özelleştirebileceğiniz evrensel bir filtre içerir.


Bu filtreyle yalnızca olayların kaynağı olan belirli nesneleri değil aynı zamanda aşağıdaki gibi tür kümelerini de seçebileceğinizi unutmayın. DizinNesnesi, BelgeNesnesi ve diğerleri. Bu tür kümeler, yapılandırmadaki tüm dizinleri veya tüm belgeleri içerir.

Dize göre arama yaparak yalnızca ilgilendiğiniz mekanizmayla ilgili abonelikleri hızlı bir şekilde bulabilirsiniz.


İstediğiniz zaman içeriği düzenleyicide gösterilen olaya veya kaynağa göre hızlı bir şekilde filtreleyebilirsiniz. Örneğin bir abonelik buldunuz Hesaplama Formülünü Kontrol Edin. Kaynağı hesaplama türlerinin planıdır Tutar.


Hesaplama türleri planındaki bağlam komutunu kullanarak yalnızca olaylarıyla ilişkili abonelikleri hızlı bir şekilde görebilirsiniz.


Kesme noktalarını otomatik olarak ekleme

Olay aboneliklerini analiz etmenin yaygın bir yolu, hata ayıklayıcıda çağrılan tüm prosedürleri yürütüldükleri sıraya göre sırayla görüntülemektir. Bunu yapmak için düzenleyici, işleyicilere otomatik olarak kesme noktaları eklemek için kullanışlı bir araç sağlar.

Öncelikle bu aracı doğrudan editörden çağırabilirsiniz.


İlgilendiğiniz nesneyi bulup seçebilir, olaylarından birini seçebilir ve örneğin tüm işleyicileri işaretleyebilirsiniz. Tıkladıktan sonra TAMAM kontrol edilen her işleyicinin ilk çalıştırılabilir satırına kesme noktaları eklenecek ve tüm bu kesme noktaları panelde görünecek Kesme noktaları perspektifte Hata ayıklama.


Kesme noktaları eklemenin başka bir yolu, ilgilendiğiniz nesneyi veya olayı düzenleyicide zaten bulduğunuzda kullanışlıdır. Bu durumda içerik menüsünden size uygun komutu çağırabilirsiniz.


Ve son olarak kullanabileceğiniz üçüncü yol, hata ayıklama sırasında otomatik olarak kesme noktaları eklemektir. Bu durumda, ekle komutu doğrudan panelde olduğundan düzenleyiciyi açmanıza gerek yoktur. Kesme noktaları.


Yani editör Tüm etkinlik abonelikleriçeşitli analiz senaryolarını kullanmanıza olanak tanıyan evrensel bir araçtır. Yalnızca uygulama çözümünü iyi bilen geliştiriciler için değil, aynı zamanda alışılmadık işlevleri anlaması gereken uygulama uzmanları veya BT uzmanları için de faydalı olacaktır.

Kullanıcı herhangi bir işlem gerçekleştirdiğinde 1C platformu program etkinlikleri oluşturur. Kural olarak, tek bir olay değil, bütün bir olaylar zinciri üretilir. Programcının görevi, programdan beklenen davranışı elde etmek için program kodunu olaylara doğru şekilde yerleştirmektir. Ancak aşağıda listelenen nedenlerden dolayı acemi bir 1C programcısının bunu yapması kolay olmayacaktır.

Olaylar kontrollü bir biçimde oluşturulabilir: On ReadingOnServer, OnCreatingOnServer, OnOpening vb.

Olaylar istemcide ve sunucuda kontrollü bir biçimde oluşturulur: BeforeRecord, BeforeRecordOnServer.

Olaylar farklı modüllerde çağrılır: ElementForm, ObjectModule, ManagerModule.

Listede birden fazla dizin öğesi varsa bazı olaylar birkaç kez çağrılabilir; örneğin: ProcessingGetView.

Yönetilen bir form, farklı kullanıcı eylemlerinin bir sonucu olarak açılabilir ve olay çağrılarının zincirleri farklı olacaktır. Dizinle ilgili aşağıdaki kullanıcı eylemlerinden herhangi biri kontrollü bir form açacaktır: yeni bir öğe oluşturmak, bir öğeyi kopyalamak, mevcut bir dizin öğesini değiştirmek.

Etkinlikler ayrıca form öğeleri tarafından da oluşturulur: tablolu bölüme bir satır eklerken, tablolu bölümde bir satırı düzenlerken, bir satırı veya alanı etkinleştirirken, giriş alanında bir arama öğesi seçerken vb.

Tetiklenen olayların mantığını ve sırasını daha iyi anlamak için bu makaleye eklenen “Olayların İncelenmesi” geliştirmesinden yararlanabilirsiniz. Olay çağrısının bağlamını, olayların sırasını ve kullanıcının gerçekleştireceği eylemleri bilerek, program kodunuzu hangi olay işleyicisine yerleştirmenin en iyi olduğunu anlamak daha kolay olacaktır.

Olay Çalışması programını kullanma talimatları

Olay Çalışması programı, 1C platformunun etkileşimli kullanıcı eylemleri sırasında oluşturduğu olayları gösterir. Çalışma prensibi şu şekildedir: Kullanıcı dizini açar, program olaylar zincirini gösterir. Kullanıcı bir dizin öğesini silinmek üzere işaretler ve program, meydana gelen olayların sırasını görüntüler. Olaylar varsayılan olarak 3 saniyelik hafif bir gecikmeyle görüntülenir; bu, bir olay zincirini diğer bir olay zincirinden ayırmak için gereklidir. Bu nedenle etkileşimli eylemleri “yavaş yavaş” gerçekleştirmeniz gerekiyor.

Tüm olaylar özel bir “Son Olaylar” penceresinde görüntülenir. Burada olay kaydını etkinleştirebilir veya devre dışı bırakabilirsiniz. Varsayılan olarak olay kaydı ilk açıldığında etkindir. Olayların rahat görüntülenmesi için programı başlattığınızda hemen ekranın altına “Son Etkinlikler” penceresini sabitlemenizi tavsiye ederim.

Program, olaylar zincirine hangi eylemin neden olduğunu belirleyemez; "Eylem Nedeni" alanına son eylemlerinizin adlarını yazmanızı tavsiye ederim, örneğin, "Dizin listesi formu açık", "Dizindeki bir öğe" liste silinmek üzere işaretlendi” vb. Bu daha sonra eylemleri ve olayları analiz etmeyi kolaylaştıracaktır.

Olay kaydının Son Olaylar formunda etkinleştirilmesi koşuluyla, Olay İzleme bölümüne yerleştirilen nesneler için olaylar kaydedilir ve görüntülenir.

Kaydedilen tüm olaylar “Servis” bölümünde bulunan “Olay Raporu” aracılığıyla görüntülenebilir.

Kaydedilen tüm eylemleri ve olayları hızlı bir şekilde temizlemek için "Servis" bölümünde "Olayları ve eylemleri temizle" seçeneğini seçin.

Bir olaya abonelik 1C 8.3 ve 8.2, belirli bir nesne olayına bir işleyici atamanıza olanak tanıyan bir yapılandırma nesnesidir. Böyle bir işleyici aynı anda birden fazla konfigürasyon nesnesine, örneğin tüm belgelere aynı anda atanabilir.

Bu meta veri nesnesine daha yakından bakalım.

  • Yeni Bir Numara Yüklerken
  • Kopyalarken
  • İşlemeDolgu
  • Kayıttan Önce
  • Kayıt Sırasında
  • Silmeden Önce
  • İşlemeİletkenlik
  • İşlemeKaldırmaGerçekleştirme
  • İşlemeKontrolDoldurma

Bir etkinliğe abone olabilirsiniz yalnızca nesnede, formda değil.

1C 8'deki işleyicilerin çağrı sırası

Olay aboneliği işleyicileri, nesne işleyicisinden sonra çağrılır; olay aboneliği "ProcessingProcessing" olayına ayarlanmışsa, önce nesne modülündeki işleyici, ardından abonelikteki işleyici çalışacaktır.

1C'de 267 video dersini ücretsiz alın:

Bir etkinliğe birden fazla abonelik varsa, deneyime göre, yapılandırma ağacında daha yüksek olan abonelik ilk olarak çağrılır. Her ne kadar 1C şirketinin kendisi bu önceliğin belirlenmediğini bildirse de.

1C'de etkinlik aboneliklerini kullanma

Abonelikleri kullanmak, örneğin değişiklikleri kaydetmek için çok kullanışlıdır. Veya farklı yapılandırma nesneleri için aynı olan başka bir eylem.

Standardı değiştirmemek için sıklıkla etkinlik aboneliklerini kullanıyorum. Bu çok kullanışlıdır; örneğin bir abonelikte, yapılandırmayı değiştirmeden belge hareketlerini ayarlayabilir veya yeni kayıtlara hareketler ekleyebiliriz.

Etkinlik aboneliği ayarlama

Abonelik ayarlamak çok basittir:

  • Kaynak— işleyicinin kurulu olduğu veri türleri;
  • Etkinlik— işleyicinin kurulu olduğu olay;
  • İşleyici— olay işleyicisinin yerleştirileceği prosedürü belirtir.

1C:Enterprise 8.x platformunda uygulama çözümleri geliştirirken veya değiştirirken, çoğu zaman bir grup yapılandırma nesnesi (örneğin, dizinler) için bazı standart eylemlerin gerçekleştirilmesi gerekir. Geliştirici, her nesnenin modülünde gerçekleştirilen eylemleri açıklamamak için standart platform mekanizması olan olay aboneliğini kullanabilir.

Olay abonelikleri, dizinler, belgeler, karakteristik türdeki planlar ve diğerleri gibi yapılandırma nesnelerinin olaylarını yakalamanıza olanak tanır. Bugün makalede, olay aboneliği işleyicilerinin yürütme sırası konusunu ele alacağız ve ayrıca bir eylem için (örneğin, kayıt sırasında) birden fazla etkinlik aboneliği olan platformun davranışını analiz edeceğiz.

Standart davranış

Örneğimizde belirli bir "SimpleDirectory" dizini kullanalım. Geliştiricinin müdahale edebileceği her olay için oluşturulan etkinlik abonelikleri vardır. Olay işleyici prosedürleri ilgili sunucu ortak modülünde bulunur.

Abonelik işleyicilerini çağırma sırası, bu nesneyle çalışırken platformun standart davranışıyla aynıdır. Örneğimizde bir dizinle çalışmayı düşündüğümüz için, bir nesneyle yapılan eylemlere bağlı olarak işleyicileri çağırma şemasını düşünmeyi öneriyorum (sonraki ekran görüntüsüne bakın).

Gördüğümüz gibi, ilk aşamada "ProcessingFill" (yeni bir öğe oluşturmak için) veya "On Copying" (mevcut olanı temel alan bir öğe oluşturmak için) olay işleyicileri çağrılır. Her iki durumda da, adlandırılmış işleyiciler çağrıldıktan sonra, geliştiricinin kodda bir önek ayarlayabileceği veya yeni bir kod atarken platformun davranışını geçersiz kılabileceği "OnInstallNewCode" prosedürü yürütülür.

Yeni bir öğe veya mevcut bir dizin öğesi yazarken, üç işleyici çağrılır: “ProcessingFillCheck” (bu aşamada işleyici girilen verilerin doğruluğunu kontrol edebilir ve hatalar varsa yazmayı reddedebilir), “BeforeWrite” (nesne veritabanına yazılana kadar detayların değerlerini ayarlayabilir ve ek koşulları kontrol edebilirsiniz) ve ardından “OnRecord” (veritabanına kayıt yapıldı ancak işlem kapatılmadı) geliştirici, kayıttan sonra verileri kontrol edebilir ve gerekirse işlemi iptal edebilir).

"BeforeDelete" olayı yalnızca bir nesnenin bilgi tabanından doğrudan silinmesi durumunda gerçekleşir. Genellikle hiçbir kullanıcının referans bütünlüğünü kontrol etmeden doğrudan silme izni yoktur. Silme işlemi her zaman "İşaretli nesnelerin silinmesi" işlemi kullanılarak gerçekleştirilmelidir. İkinci durumda, "BeforeDelete" işleyicisi de çağrılır.

Bu nedenle, bir dizin öğesi oluşturup onu bilgi tabanına yazarsak, platform aşağıdaki olay işleyicilerini belirtilen sırayla çağıracaktır:

Diğer yapılandırma nesnelerine ilişkin olarak olay aboneliği mekanizmasının işleyişi benzer olacaktır; yalnızca olaylar ve bunların sırası farklılık gösterebilir. Daha fazla ayrıntı için sözdizimi yardımcısına bakın.

Belgelenmeyen taraf

Şimdi ilginç bir duruma bakalım. Diyelim ki "SimpleDirectory" dizinimiz için "BeforeRecord" olayına üç abonelik tanımlandı:

Bu aboneliklerin işleyicilerinin hangi sırayla çağrılacağını düşünüyorsunuz? Tahmin etmeyelim. Her abonelik için işleyicinin, çağrılan aboneliğin adını içeren bir mesaj görüntülediği bir öğeyi kaydetmenin sonucunu vereceğim (aşağıdaki ekran görüntüsüne bakın).

Ekran görüntüsünden, olay aboneliği işleyici prosedürlerinin çağrılma sırasının, "Etkinlik Abonelikleri" dalındaki meta veri nesnelerinin sırasına karşılık geldiğini tahmin etmek zor değildir. Bu özellik 1C:Enterprise platformundaki herhangi bir referans literatüründe açıklanmamıştır, dolayısıyla belgelenmemiş özellikler sürümden sürüme değişebileceğinden ve aynı zamanda 1C:Enterprise platformunda bulunmayabileceğinden, onu yapılandırmada kullanırken dikkatli olmalısınız. program değişikliklerinin listesi.

Geri çekilmek

Şunu sorabilirsiniz: "Bir yapılandırma nesnesi olayı için neden birden fazla abonelik oluşturulsun?" Cevap basit. Birkaç kişi geliştirme sürecine katılıyorsa, birbirlerinin yarattığı mekanizmalara müdahale, programın yanlış çalışmasına yol açabilir. Bu gibi durumlarda yapılacak en mantıklı şey, her geliştirici için yapılacak göreve uygun olarak ayrı etkinlik abonelikleri oluşturmak olacaktır. Elbette gelecekte bunların tek bir işleyici prosedüründe birleştirilmesi mümkündür.

Kullanıcı bir düğmeye tıkladığında bir form açılır veya kapanır, bir belge yazılır, bir olay meydana gelir.

Her belgeyi kaydetmeden önce bu detayın doldurulduğunu kontrol etmek istiyoruz.

Nasıl yapılır?

1C etkinliklerine abonelikler

1C etkinliklerine abonelik, Genel/1C etkinliklerine abonelikler yapılandırma dalında bulunur.

Bir 1C olayına abone olmak, herhangi birkaç nesne (dizinler, belgeler) için bir olay meydana geldiğinde bir işleyici atamanıza olanak tanır.

1C etkinliğine yeni bir abonelik ekleyelim ve adını belirleyelim.

1C olay aboneliği özelliğinde Kaynak - işleyiciyi yerleştirdiğimiz bir veya daha fazla belge, dizin - nesne seçmeniz gerekir.

1C Etkinliği aboneliği özelliğinde, seçilen belge ve dizinlerde meydana gelebilecek standart olaylara ilişkin seçeneklerden birini seçmeniz gerekir.

“Belgeler ve referans kitapları” diyerek basitleştiriyoruz - aslında birçok 1C nesnesini kullanabilirsiniz. Ne yazık ki, 1C form etkinliklerine abone olamazsınız - örneğin, birçok programcının pişmanlık duyduğu bir durum olan bir formu açarken.

Olası olayların kümesi nesneye bağlıdır. Dikkatli olun, çünkü birden fazla (birden fazla) nesne seçerseniz, olay listesi yalnızca seçilen nesnelerin her birinin sahip olabileceği olayları (yani, seçilen tüm nesneler için ortak olan olayları) içerecektir.

Bundan sonra geriye sadece bir handler fonksiyonu oluşturmak kalıyor. Bunu yapmak için yapılandırmanın özelliklerde Sunucu onay kutusunun işaretlenmiş olması gerekir. "Büyüteç" düğmesine tıkladığınızda, bir işlev oluşturulacaktır - bir işleyici.

Tüm! Tüm belgeler için 1C BeforeRecording etkinliğine yeni abone olduk. Artık herhangi bir belgeyi kaydederken, kontrolü de içeren işlevimiz yürütülecektir.

Kontrolün olumsuz olması durumunda belge yazmayı reddetmek için işlev parametresini ayarlamanız gerekir.