Dahili hatlara ve harici bileşenlere eşzamansız çağrılar. "İstemcide eşzamanlı yöntemlerin kullanılması yasaktır" hatası neden oluşuyor?

8.3.5.1383, 8.3.6.1977 sürümünde uygulanmıştır.

Modern eğilimler

Tarayıcı geliştirme eğilimleri, platformda giderek artan bir "asenkronizasyon" yüzdesine yol açmaktadır. İlk adım şuydu. Artık kriptografi uzantılarıyla çalışmak, dosyalar ve harici bileşenlerle çalışmak için eşzamansız çağrılar var.

Eşzamansızlığa doğru bir sonraki adımın nedeni, Google Chrome tarayıcısının geliştiricilerinin önceki NPAPI (Netscape Eklentisi Uygulama Programlama Arayüzü) teknolojisine yönelik desteği bırakmasıydı. Bu teknoloji, harici modülleri (uzantıları) tarayıcıya bağlamak için kullanıldı.

1C:Enterprise bu tür uzantıları kriptografiyle çalışmak, dosyalarla çalışmak ve harici bileşenleri bağlamak için kullanır. Bu oldukça önemli bir işlevselliktir. Kriptografi, elektronik belge yönetiminde kullanılır ve harici bileşenler sayesinde uygulamalar, barkod tarayıcılar ve diğer perakende ekipmanlarıyla çalışabilir.

Ve şimdi, Google Chrome geliştiricileri önceki senkronize NPAPI teknolojisi yerine yeni bir Yerel Mesajlaşma teknolojisi oluşturdu. Aynı zamanda, desteklenmeyeceği için tüm uzantı geliştiricilerinin eski teknolojiyi kullanmamalarını şiddetle tavsiye ettiler.

Ayrıntılara girmeden yeni teknolojinin daha iyi ve daha güvenli olduğunu söyleyebiliriz. Bu iyi. Ancak önemli farklarından biri, tarayıcı uzantılarıyla yalnızca eşzamansız etkileşim sağlamasıdır. Bu da 1C:Enterprise'daki uzantılar ve harici bileşenlerle çalışma konusunda mevcut tüm yöntemlerde radikal bir değişiklik gerektiriyor. Çünkü hepsi senkron etkileşime dayanıyor.

Eşzamansız Yöntemler

Bu sorunu, modal çağırma problemini çözdüğümüz gibi çözdük. NPAPI teknolojisini kullanan tüm senkron yöntemlerin asenkron karşılıklarını oluşturduk. Esas olarak önekin varlığında farklılık gösterirler Başlamak ve onlara ilk parametrenin iletilmesi AçıklamaUyarılar, çağrılan eylemin tamamlanmasından sonra program kodunun yürütülmesine devam edilecektir.

Örneğin yöntem yerine Şifrele()Şimdi bu yöntemi kullanmanızı öneririz StartEncrypt():

Şifreleme Yöneticisi.Şifreleme(<ИсходныеДанные>, <Получатели>) Şifreleme Yöneticisi.Şifrelemeyi Başlat(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

Bir yöntem yerine GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Dosyaları Almaya Başla ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Yerine SetExternalComponent()- StartInstallingExternalComponents():

SetExternalComponent(<Местоположение>) Harici Bileşenleri Kurmaya Başlayın (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Aslında her şey, daha önce modaliteden kurtulduğumuzda yaptığımıza çok benziyor. Ancak yeni asenkron yöntemlerin işleyişi, kipli olmayan diyaloglara neden olan yöntemlerin sahip olmadığı temel bir özelliğe sahiptir.

Modelsiz bir iletişim kutusunu eşzamansız olarak çağırırken, yalnızca bir miktar kullanıcı tepkisi bekleriz, daha fazlasını değil. Beklenmedik hiçbir şeyin olamayacağı anlamında.

Ve uzantılar ve bileşenlerle eşzamansız çalışma yöntemlerinin çağrılması sürecinde istisnai durumlar ortaya çıkabilir. Uzantı yüklenmedi, bileşen yüklenmedi vb.

Genellikle bu tür istisnaların ele alınmasını uygulama kodunuzda sağlarsınız. Operatör kullanma Deniyorum... İstisna. Ancak artık bu imkansız hale geliyor çünkü asenkron çağrı sırasında uygulama kodu yürütülmüyor. Buna göre operatör çalışmıyor Deniyorum... İstisna.

  • AdProsedürİşlemeHataları;
  • ErrorProcessingModule.

Eşzamansız çağrı sırasında bir şeyler ters giderse ve bir istisna meydana gelirse, bu özelliklerin işaret ettiği prosedür yürütülecektir. Bu iki özelliği yalnızca uzantılarla eşzamansız çalışma yöntemlerinde kullanmak mantıklıdır. Modelsiz diyalogları çağırırken bu özelliklere ihtiyacınız yoktur.

Yapılandırma özelliği

Modalite reddi durumunda olduğu gibi, uygulama çözümünün tamamı bir bütün olarak "ne olduğunu" bilmelidir. Ya modaldır ya da mod dışıdır. Ya senkron ya da asenkrondur.

Daha önce sorunu modaliteyle çözmek için özel bir yapılandırma özelliği ekledik Modaliteyi kullanma modu. Şimdi senkronizasyonla ilgili sorunu çözmek için buna benzer bir özellik ekledik. Dahili hatlara ve harici bileşenlere senkronize çağrı kullanma modu.

Kullanımının özü aşağıdaki gibidir:

  • Kullanmayın- bu yeni, eşzamansız bir çalışma modudur. Yeni konfigürasyonlar için bu standart moddur. Eski, senkronize yöntemlerin kullanılması yasaktır. Sözdizimsel kontrolü geçemezler, bağlam ipucunda yer almazlar. Eşzamanlı bir yöntemi yürütmeye çalışmak bir istisna oluşturur.
  • Uyarı ile kullanın- bu mod geliştiriciye yöneliktir. Daha eski, senkronize yöntemlerin kullanımını engellemez. Ancak istemcide senkronize bir yöntem her çağrıldığında bir uyarı mesajı üretir. Bu modun “geri dönüşüm” konfigürasyonlarında kullanılmasını öneririz. Senkron çağrıların görsel olarak aranması ve revizyon işlemi sırasında izlenmesi uygundur.
  • Kullanmak- Platformun yeni sürümünün, uzantılar ve harici bileşenlerle çalışmak için eşzamanlı yöntemler kullanan eski yapılandırmalarla uyumluluğunu sağlayan bir mod.

Şu ana kadar bahsettiğimiz tüm yöntem ve özellikler sürümde uygulanmıştır. 8.3.5.1383 . Bunları uygulama çözümlerinizde kullanabilirsiniz. Örneğin geliştiriciler, kriptografi araçlarını kullanan, dosyalar ve harici bileşenlerle çalışan eşzamansız işlem alt sistemlerine geçiş yapacak.

Doğal olarak, modal çağrılarda olduğu gibi muhtemelen bir sorunuz var. Uygulama çözümümü yeniden yapmam gerekiyor mu? Ve genel olarak yeni uygulama çözümümde bu eşzamansız yöntemleri kullanmam gerekiyor mu?

Ne zaman ihtiyaç duyulur?

Bu sorunun cevabı aslında daha önce verdiğimiz cevapla aynı. Modaliteyi terk etmekten bahsettiklerinde.

İlk olarak, teknoloji platformunun her sürümü, dahili hatlara ve harici bileşenlere yapılan eşzamansız çağrı modunu desteklemez. Bu çalışma modu 8.3.5.1383 sürümünden itibaren mevcuttur. Bu nedenle eğer platformun daha alt versiyonları üzerinde çalışıyorsanız, senkron yöntemlerden vazgeçme konusunda şimdilik endişelenmenize gerek yok.

İkinci olarak, tüm uygulama çözümlerinin mutlaka bu modu kullanması gerekmemektedir. Kritik uygulamalar, Google Chrome tarayıcısındaki web istemcisi kullanılarak üzerinde çalışılacak uygulamalardır. Bu tür uygulamalar büyük ölçüde çalışan uygulamalardır. Eğer uygulama çözümünüz kesinlikle bu modda kullanılmayacaksa senkron yöntemlerden şimdilik vazgeçemezsiniz.

Ancak birinci ve ikinci noktalara rağmen planlarınızı etkileyebilecek küresel eğilimler var. Biz, 1C şirketi olarak, tüm standart çözümleri, mevcut yollardan herhangi birinde kullanılabilecekleri gerçeğine dayanarak geliştiriyoruz. Bu nedenle yeni uygulama çözümlerini ve bunlarda kullanılan tüm kütüphaneleri senkronize çağrıların kullanılmadığı bir modda uygulayacağız.

Bu, bu çalışma moduna şimdi hakim olmaya başlamanızın daha iyi olduğu anlamına gelir. Uygulamanız henüz kullanmıyor olsa bile mümkünse çeviriye şimdi başlamanızı öneririz. Ancak bu sürece yaratıcı bir şekilde yaklaşmanızı öneririz. Modaliteyi terk ederken olduğu gibi. Yani senkron yöntemlerin asenkron yöntemlerle mekanik olarak değiştirilmesine gerek yoktur. İlk olarak, bu noktada senkronize yöntemlerin kullanımını tamamen terk edecek şekilde algoritmayı veya komut dosyasını değiştirmenin mümkün olup olmadığını düşünmek faydalı olacaktır.

Yeniden Düzenleme

Bir yandan, konfigürasyon büyükse ve çok sayıda eşzamanlı çağrı varsa, bu tür bir konfigürasyonun "manuel" olarak yeniden işlenmesi çok zaman alan bir iş olabilir.

Öte yandan platform 8.3.5.1068 sürümünden itibaren senkron çağrıları asenkron çağrılara dönüştürmenize olanak tanıyan özelliklere sahiptir.

Bu nedenle, halihazırda var olan bu araçları aldık, genişlettik ve onları "modaliteden uzaklaşma" yerine "eşzamansızlığa geçiş" olarak yeniden yönlendirdik. Özünde, asenkron yöntemlere geçiş, modaliteden vazgeçildiğinde gerçekleştirilen eylemlere benzer. Eski, "modası geçmiş", eşzamanlı (modal) çağrıların, yeni, "modaya uygun", eşzamansız çağrılarla değiştirilmesi gerekir. Uyarılar İşleniyor.

Bu güncellenmiş formda, sürümde yeniden düzenleme araçları kullanımınıza sunuldu 8.3.6.1977 .

Bu araçların "vurgu" eşzamansızlığa doğru kaydığı için bazı komutları yeniden adlandırdık. "Kipsiz" yerine artık "kullanımdan kaldırılmış eşzamanlı" ifadesi kullanılıyor:

Ayrıca yapılandırıcı ayarlarına yeni bir sekme ekledik Yeniden Düzenleme. Varsayılan olarak her iki dönüşüm de etkindir. Ancak ihtiyacınız varsa, otomatik yeniden düzenleme sırasında onun yardımıyla dönüşüm türlerinden yalnızca birini gerçekleştirebilirsiniz.

05.12.2014

8.3.5.1383, 8.3.6.1977 sürümünde uygulanmıştır.

Modern eğilimler

Tarayıcı geliştirme eğilimleri, platformda giderek artan bir "asenkronizasyon" yüzdesine yol açmaktadır. İlk adım bu yöntemi terk etmekti. Artık kriptografi uzantılarıyla çalışmak, dosyalar ve harici bileşenlerle çalışmak için eşzamansız çağrılar var.

Eşzamansızlığa doğru bir sonraki adımın nedeni, Google Chrome tarayıcısının geliştiricilerinin önceki NPAPI (Netscape Eklentisi Uygulama Programlama Arayüzü) teknolojisine yönelik desteği bırakmasıydı. Bu teknoloji, harici modülleri (uzantıları) tarayıcıya bağlamak için kullanıldı.

1C:Enterprise bu tür uzantıları kriptografiyle çalışmak, dosyalarla çalışmak ve harici bileşenleri bağlamak için kullanır. Bu oldukça önemli bir işlevselliktir. Kriptografi, elektronik belge yönetiminde kullanılır ve harici bileşenler sayesinde uygulamalar, barkod tarayıcılar ve diğer perakende ekipmanlarıyla çalışabilir.

Ve şimdi, Google Chrome geliştiricileri önceki senkronize NPAPI teknolojisi yerine yeni bir Yerel Mesajlaşma teknolojisi oluşturdu. Aynı zamanda, desteklenmeyeceği için tüm uzantı geliştiricilerinin eski teknolojiyi kullanmamalarını şiddetle tavsiye ettiler.

Ayrıntılara girmeden yeni teknolojinin daha iyi ve daha güvenli olduğunu söyleyebiliriz. Bu iyi. Ancak önemli farklarından biri, tarayıcı uzantılarıyla yalnızca eşzamansız etkileşim sağlamasıdır. Bu da 1C:Enterprise'daki uzantılar ve harici bileşenlerle çalışma konusunda mevcut tüm yöntemlerde radikal bir değişiklik gerektiriyor. Çünkü hepsi senkron etkileşime dayanıyor.

Eşzamansız Yöntemler

Bu sorunu modal çağrı problemiyle aynı şekilde çözdük. NPAPI teknolojisini kullanan tüm senkron yöntemlerin asenkron karşılıklarını oluşturduk. Bunlar esas olarak Başlat önekinin varlığında ve ilk parametrenin, çağrılan eylemin tamamlanmasından sonra program kodunun yürütülmesine devam edeceği Uyarı Açıklaması olması gerçeğinde farklılık gösterir.

Örneğin, Encrypt() yöntemi yerine artık StartEncrypt() yöntemini kullanmanızı öneririz:

Şifreleme Yöneticisi.Şifreleme(<ИсходныеДанные>, <Получатели>) Şifreleme Yöneticisi.Şifrelemeyi Başlat(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

GetFiles() yöntemi yerine - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Dosyaları Almaya Başla ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

InstallExternalComponent() - StartInstallingExternalComponent() yerine:

SetExternalComponent(<Местоположение>) Harici Bileşenleri Kurmaya Başlayın (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Aslında her şey, daha önce modaliteden kurtulduğumuzda yaptığımıza çok benziyor. Ancak yeni asenkron yöntemlerin işleyişi, kipli olmayan diyaloglara neden olan yöntemlerin sahip olmadığı temel bir özelliğe sahiptir.

Modelsiz bir iletişim kutusunu eşzamansız olarak çağırırken, yalnızca bir miktar kullanıcı tepkisi bekleriz, daha fazlasını değil. Beklenmedik hiçbir şeyin olamayacağı anlamında.

Ve uzantılar ve bileşenlerle eşzamansız çalışma yöntemlerinin çağrılması sürecinde istisnai durumlar ortaya çıkabilir. Uzantı yüklenmedi, bileşen yüklenmedi vb.

Genellikle bu tür istisnaların ele alınmasını uygulama kodunuzda sağlarsınız. Dene... İstisna operatörünü kullanma. Ancak artık bu imkansız hale geliyor çünkü asenkron çağrı sırasında uygulama kodu yürütülmüyor. Buna göre Deneme... İstisna operatörü çalışmıyor.

  • HataProsedürAdı;
  • Hata İşleme Modülü.

Eşzamansız çağrı sırasında bir şeyler ters giderse ve bir istisna meydana gelirse, bu özelliklerin işaret ettiği prosedür yürütülecektir. Bu iki özelliği yalnızca uzantılarla eşzamansız çalışma yöntemlerinde kullanmak mantıklıdır. Modelsiz diyalogları çağırırken bu özelliklere ihtiyacınız yoktur.

Yapılandırma özelliği

Modalite reddi durumunda olduğu gibi, uygulama çözümünün tamamı bir bütün olarak "ne olduğunu" bilmelidir. Ya modaldır ya da mod dışıdır. Ya senkron ya da asenkrondur.

Daha önce modaliteyle ilgili sorunu çözmek için konfigürasyona özel bir özellik ekledik: Modalite kullanma modu. Şimdi, senkronizasyonla ilgili sorunu çözmek için, anlam olarak buna benzer bir özellik ekledik: Uzantıların ve harici bileşenlerin senkronize çağrılarını kullanma modu.

Kullanımının özü aşağıdaki gibidir:

  • Kullanmayın, yeni, eşzamansız bir çalışma modudur. Yeni konfigürasyonlar için bu standart moddur. Eski, senkronize yöntemlerin kullanılması yasaktır. Sözdizimsel kontrolü geçemezler, bağlam ipucunda yer almazlar. Eşzamanlı bir yöntemi yürütmeye çalışmak bir istisna oluşturur.
  • Uyarıyla kullanın - bu mod geliştiriciye yöneliktir. Daha eski, senkronize yöntemlerin kullanımını engellemez. Ancak istemcide senkronize bir yöntem her çağrıldığında bir uyarı mesajı üretir. Bu modun “geri dönüşüm” konfigürasyonlarında kullanılmasını öneririz. Senkron çağrıların görsel olarak aranması ve revizyon işlemi sırasında izlenmesi uygundur.
  • Kullanım - Platformun yeni sürümünün, uzantılar ve harici bileşenlerle çalışmak için eşzamanlı yöntemler kullanan eski yapılandırmalarla uyumluluğunu sağlayan bir mod.

Şu ana kadar bahsettiğimiz tüm yöntem ve özellikler 8.3.5.1383 versiyonunda hayata geçirilmiştir. Bunları uygulama çözümlerinizde kullanabilirsiniz. Ve örneğin BSP geliştiricileri, kriptografi araçlarını kullanan, dosyalarla ve harici bileşenlerle çalışan alt sistemleri eşzamansız çalışmaya aktaracak.

Doğal olarak, modal çağrılarda olduğu gibi muhtemelen bir sorunuz var. Uygulama çözümümü yeniden yapmam gerekiyor mu? Ve genel olarak yeni uygulama çözümümde bu eşzamansız yöntemleri kullanmam gerekiyor mu?

Ne zaman ihtiyaç duyulur?

Bu sorunun cevabı aslında daha önce verdiğimiz cevapla aynı. Modaliteyi terk etmekten bahsettiklerinde.

İlk olarak, teknoloji platformunun her sürümü, dahili hatlara ve harici bileşenlere yapılan eşzamansız çağrı modunu desteklemez. Bu çalışma modu 8.3.5.1383 sürümünden itibaren mevcuttur. Bu nedenle eğer platformun daha alt versiyonları üzerinde çalışıyorsanız, senkron yöntemlerden vazgeçme konusunda şimdilik endişelenmenize gerek yok.

İkinci olarak, tüm uygulama çözümlerinin mutlaka bu modu kullanması gerekmez. Kritik uygulamalar, Google Chrome tarayıcısındaki web istemcisi kullanılarak üzerinde çalışılacak uygulamalardır. Bu tür uygulamalar büyük oranda hizmet modelinde çalışan uygulamalardır. Eğer uygulama çözümünüz kesinlikle bu modda kullanılmayacaksa senkron yöntemlerden şimdilik vazgeçemezsiniz.

Ancak birinci ve ikinci noktalara rağmen planlarınızı etkileyebilecek küresel eğilimler var. Biz, 1C şirketi olarak, tüm standart çözümleri, mevcut yollardan herhangi birinde kullanılabilecekleri gerçeğine dayanarak geliştiriyoruz. Bu nedenle yeni uygulama çözümlerini ve bunlarda kullanılan tüm kütüphaneleri senkronize çağrıların kullanılmadığı bir modda uygulayacağız.

Bu, bu çalışma moduna şimdi hakim olmaya başlamanızın daha iyi olduğu anlamına gelir. Uygulamanız henüz kullanmıyor olsa bile mümkünse çeviriye şimdi başlamanızı öneririz. Ancak bu sürece yaratıcı bir şekilde yaklaşmanızı öneririz. Modaliteyi terk ederken olduğu gibi. Yani senkron yöntemlerin asenkron yöntemlerle mekanik olarak değiştirilmesine gerek yoktur. İlk olarak, bu noktada senkronize yöntemlerin kullanımını tamamen terk edecek şekilde algoritmayı veya komut dosyasını değiştirmenin mümkün olup olmadığını düşünmek faydalı olacaktır.

Yeniden Düzenleme

Bir yandan, konfigürasyon büyükse ve çok sayıda eşzamanlı çağrı varsa, bu tür bir konfigürasyonun "manuel" olarak yeniden işlenmesi çok zaman alan bir iş olabilir.

Öte yandan platform 8.3.5.1068 sürümünden itibaren senkron çağrıları asenkron çağrılara dönüştürmenize olanak tanıyan araçlara sahiptir.

Bu nedenle, halihazırda var olan bu araçları aldık, genişlettik ve onları "modaliteden uzaklaşma" yerine "eşzamansızlığa geçiş" olarak yeniden yönlendirdik. Özünde, asenkron yöntemlere geçiş, modaliteden vazgeçildiğinde gerçekleştirilen eylemlere benzer. Eski, "modası geçmiş", eşzamanlı (modal) çağrıların, Bildirim İşleme'yi kullanan yeni, "modaya uygun", eşzamansız çağrılarla değiştirilmesi gerekir.

Bu güncellenmiş formda, yeniden düzenleme araçları 8.3.6.1977 sürümünde kullanımınıza sunuldu.

Bu araçların "vurgu" eşzamansızlığa doğru kaydığı için bazı komutları yeniden adlandırdık. "Kipsiz" yerine artık "kullanımdan kaldırılmış eşzamanlı" ifadesi kullanılıyor:

Ayrıca yapılandırıcı ayarlarına yeni bir Yeniden Düzenleme sekmesi ekledik. Varsayılan olarak her iki dönüşüm de etkindir. Ancak ihtiyacınız varsa, otomatik yeniden düzenleme sırasında onun yardımıyla dönüşüm türlerinden yalnızca birini gerçekleştirebilirsiniz:

Makale, 1C:Enterprise platformunda modaliteyi terk etmenin ana nedenlerini ve kod bölümlerini yeni bir eşzamansız modele dönüştürmenin ana yöntemlerini tartışacaktır.

Uygulanabilirlik

Makale, iş mantığı oluşturmak için eşzamansız modeli, eklenen platform "1C:Enterprise" sürüm 8.3'ü tartışıyor. Sunulan bilgiler mevcut platform sürümleriyle ilgilidir.

1C:Enterprise 8.3 platformunda kalıcı pencerelerin kullanılmasının reddedilmesi

1C:Enterprise 8 platformunda bir konfigürasyon geliştirirken, kullanıcı bir karar verene veya bir eylem gerçekleştirene kadar programı periyodik olarak duraklatma ihtiyacı ortaya çıkar.

Örneğin tablo bölümünü doldur butonuna tıklandığında kullanıcıya daha önce girilen verilerin kaybolmaması için tablo bölümünün temizlenmesinin gerekip gerekmediği sorulmalıdır.

Bu davranışa örneğin aşağıdaki kodla ulaşılabilir:

&İstemcide
Prosedür Ürünleri Doldurun(Takım )
Cevap = Soru (“Tablo kısmı temizlenecektir. Devam Edilsin mi?”, Diyalog ModuSoru.EvetHayır);
Cevap = ise Diyalog Dönüş Kodu.Evet Daha sonra
//doldurma algoritması
EndIf ;
Prosedürü Sonlandır

Bu kod parçasının sonucunda program kodunun yürütülmesi durdurulacak, ekranda bir soru görüntülenecek, soruyla diyalog dışındaki uygulama arayüzü kullanılamaz hale gelecek, sistem kullanıcının bir soru yapmasını bekleyecektir. Karar verilecek ve kodun yürütülmesi ancak soru yanıtlandıktan sonra devam edecektir.

OpenModal() yöntemini çağırarak kalıcı pencerelerin açılması, kod yürütmede duraklamalara ve arayüzün engellenmesine de neden olur.

Yapılandırmayla bir tarayıcı aracılığıyla web istemcisi modunda çalışırken, bu durumda yeni bir pencere açılacaktır - yalnızca geçerli sekmeyi değil, aynı zamanda diğer açık pencereler ve sekmeler dahil tüm tarayıcı arayüzünü de engelleyen bir açılır pencere.

İnternetteki açılır pencereler genellikle istenmeyen reklamları kötü niyetli olarak dağıtmak için kullanılır; bu nedenle tarayıcılar açılır pencereleri engelleme özellikleri içerir.

Bu durumda, 1C:Enterprise 8 yapılandırmalarıyla tarayıcı aracılığıyla çalışmak için açılır pencere engellemeyi devre dışı bırakmalısınız.

Mobil cihazlarda çalışırken de sorunlar ortaya çıkıyor. Örneğin kalıcı pencereler iPad'de desteklenmez.

Bu sorunları çözmek için kalıcı pencereler yerine engelleme pencereleri kullanmalısınız. Kullanıcı için görsel olarak her şey aynı görünüyor: pencere web istemcisi arayüzünü engelliyor.

Ancak engelleme penceresi ana pencerenin üstüne “çizilir” ve kalıcı tarayıcı pencereleri kullanılmadığından yalnızca yapılandırmanın açık olduğu geçerli tarayıcı sekmesi engellenerek diğer sekmelere geçiş yapmanıza olanak sağlanır.

Böylece tarayıcıda açılır pencereler açılmaz ve mobil cihazlarda web istemcisi üzerinden çalışma sağlanır.

Yapılandırmanın kök öğesi, yapılandırmada kalıcı pencerelerin açılıp açılamayacağını belirleyen bir "Modalite modu" özelliğine sahiptir.

“Kullan” seçeneği seçilirse kalıcı pencereler açılabilir. “Kullanma” seçeneği seçilirse kalıcı pencerelere izin verilmez. Kalıcı pencere açan bir yöntemi çağırmaya çalıştığınızda sistem bir hata mesajı görüntüler:

“Modalite kullanım modu” özelliğinin bu değeri ile yalnızca engelleme pencerelerine izin verilir.

“Uyarılarla birlikte kullan” seçeneği seçilirse kalıcı pencereler açıldığında mesaj penceresinde aşağıdaki metin görüntülenir:

Bu çalışma seçeneği, kalıcı pencerelerin kullanımından vazgeçmek amacıyla konfigürasyon yeniden çalışılırken ara seçenek olarak kullanılabilir.

Engelleme pencereleri ile kalıcı pencereler arasındaki temel fark, engelleme penceresinin açılmasının kod yürütmeyi duraklatmamasıdır.

Bu nedenle geliştiricilerin, bu özelliği hesaba katmak için kalıcı pencereleri kullanan program kodunu yeniden yazması gerekecektir.

Kodun iki bölüme ayrılması gerekir:

  • bir engelleme penceresinin açılması;
  • Kullanıcı seçimi işleniyor.

Yazının başında verilen kod parçasının şu şekilde yeniden yazılması gerekiyor:

&İstemcide
Prosedür Ürünleri Doldurun(Takım )
Uyarı = Yeni AçıklamaUyarılar(, ThisObject);

Diyalog ModuSoru.EvetHayır);
Prosedürü Sonlandır
&İstemcide
Prosedür (Sonuç, Ekstra seçenekler) İhracat
Sonuç = Diyalog Dönüş Kodu.Evet Daha sonra
//doldurma algoritması
EndIf ;
Prosedürü Sonlandır

ShowQuestion() prosedürünü yürüttükten sonra sistem durmaz, kullanıcının yanıtını bekler, kod yürütmeye devam eder.

Kullanıcı ancak tüm prosedür tamamlandıktan sonra seçim yapabilecektir. Bu durumda, dışa aktarma prosedürü FillItemsQuestionComplete() çağrılacaktır. Adını AçıklamaAlerts nesnesinin yapıcısına aktardık.

Seçim yapıldıktan sonra çağrılacak prosedür bir form modülünde, bir komut modülünde veya genel olmayan bir modülde bulunabilir.

Ele alınan örnekte, çağrılan prosedür yönetilen form modülünde yer aldığından ThisObject parametresini aktardık.

Ortak bir modülde bulunan bir prosedürü çağırmayı düşünelim. Bunu yapmak için, yeni bir ortak modül Bildirim İşleme ekleyin, bunun için "İstemci (yönetilen uygulama)" bayrağını ayarlayın ve "Genel" bayrağını ayarlamayın. Bu modüle Ürün Doldurma Soru Tamamlama () prosedürünü yerleştirelim.

Daha sonra doldurma komutu işleyicisi şöyle görünecektir:

&İstemcide
Prosedür Ürünleri Doldurun(Takım )
Uyarı = Yeni AçıklamaUyarılar(“Ürünleri Doldur Soru Tamamlama”,
Uyarılar İşleniyor);
Soru Metni = “Tablo kısmı temizlenecektir. Devam etmek?" ;
ShowQuestion (Uyarı, Soru Metni, Diyalog ModuSoru.EvetHayır);
Prosedürü Sonlandır

Engelleme penceresi açan herhangi bir yöntem çağrıldıktan sonra prosedürden çıkılmalı ve daha sonra çalışacak kod, pencere kapatıldıktan sonra çağrılacak prosedüre yerleştirilmelidir.

İçeriği (yardımcı veriler, belirli parametreler, değişken değerler) modal pencereyi açan prosedürden, kapatıldığında çağrılan prosedüre aktarmak için, nesne yapıcısının isteğe bağlı üçüncü bir parametresi sağlanır: AçıklamaUyarılar – Ek Parametreler.

Bu nesne (herhangi bir türden), Uyarı Açıklaması'nda açıklanan prosedüre son parametre olarak aktarılacaktır.

Yukarıda tartışılan kod bölümü örneğini kullanarak bu şu şekilde yapılabilir:

&İstemcide
Prosedür Ürünleri Doldurun(Takım )
Parametre1 = 0;
Parametre2 = 0;
Parametre Listesi= Yeni Yapı (“Parametre1, Parametre2″, Parametre1, Parametre2);
Uyarı = Yeni AçıklamaUyarılar(“Ürünleri Doldur Soru Tamamlama”, BuNesne ,
Parametre Listesi);
ShowQuestion (Uyarı, “Tablo kısmı temizlenecek. Devam edilsin mi?”,
Diyalog ModuSoru.EvetHayır);
Prosedürü Sonlandır
&İstemcide
Prosedür DoldurunÜrünlerSoruTamamlama(Sonuç , Ekstra seçenekler) İhracat
Sonuç = Diyalog Dönüş Kodu.Evet Daha sonra
//Ek Parametreleri analiz ediyoruz.Parametre1
//Ek Parametreleri analiz ediyoruz.Parameter2
EndIf ;
Prosedürü Sonlandır

Yalnızca bir değer iletmeniz gerekiyorsa yapıyı kullanamazsınız ancak bu değeri, AçıklamaAlerts nesnesinin yapıcısının Ek Parametreler parametresine atayabilirsiniz.

Pencereleri engellemeyle çalışmanın birkaç örneğine bakalım.

Görev 1: Başka bir form açın

Belge formundan “Parametreleri aç” düğmesine tıklayarak, kullanıcının ayarlaması gereken Parametre1 ve Parametre2 olmak üzere iki onay kutusunun bulunduğu bir form açmanız gerekir. Formu kapattıktan sonra parametre değerlerini mesaj satırında görüntüleyin.

Parameter1 ve Parameter2 ayrıntılarını ve CloseForm komutunu yerleştirdiğimiz genel bir “ParametersForm” formu oluşturuyoruz:

Komut işleyicisi şuna benzer:

Komut işleyicisi şuna benzer: &OnClient
Prosedür CloseForm (Komut)
Parametre Listesi= Yeni Yapı ( “Parametre1, Parametre2”, Parametre1 , Parametre2 );
Kapalı ( Parametre Listesi); Prosedürü Sonlandır

Form için WindowOpenMode özelliğini "Arayüzün tamamını engelle" olarak ayarlayın:

Belge formuna, işleyicisi aşağıda açıklanan OpenParameters komutunu yerleştiriyoruz:

&İstemcide
Prosedür OpenOptions(Takım )
Uyarı = Yeni AçıklamaUyarılar(“Seçenekleri Aç Sonlandır”, ThisObject);
AçıkForm ( “GenelForm.FormParametreleri”, , , , , , Bildiri);
Prosedürü Sonlandır
&İstemcide
Prosedür OpenOptionsComplete(Sonuç , Ekstra seçenekler) İhracat
TypeValue (Sonuç) = Type (“Yapı”) ise O zaman
Sonuç Döngüsünden her KeyValue için
Mesaj = Yeni Kullanıcıya Mesaj;
Mesaj.Text = “Anahtar: “” ” + AnahtarDeğeri.Anahtar + “””, değer = ”
+ AnahtarDeğeri.Değer;
Mesaj.Rapor();
EndCycle;
EndIf ;
Prosedürü Sonlandır

Kullanıcı modunda, yapılandırmayı web istemcisi altında çalıştırarak aşağıdaki sonuçları elde ederiz:

Büyütmek için görselin üzerine tıklayın.

Pencere açma modu OpenForm prosedürünün son parametresinde de belirtilebilir.

&İstemcide
Prosedür OpenOptions(Takım )
Uyarı = Yeni AçıklamaUyarılar(“Seçenekleri Aç Sonlandır”, ThisObject);
AçıkForm ( “GenelForm.FormParametreleri”, , , , , , Uyarı
FormWindowOpenMode.LockEntireInterface
);
Prosedürü Sonlandır

Görev 2. Formu kapatırken soru

Bir işleme penceresini kapatırken kullanıcıya pencereyi gerçekten kapatmak isteyip istemediğini sorun.

Bu sorun, işleme formu modülünde bulunan aşağıdaki kod kullanılarak çözülebilir:

&İstemcide
Perem Formu Kapatmanız Gerekiyor;
&İstemcide
Kapatma Öncesi Prosedür (Arıza, Standart İşleme)
Değilse Formu Kapatmanız Gerekiyor= Doğru O halde
Reddet = Doğru;
Uyarı = Yeni AçıklamaUyarılar(“Kapanış Tamamlanmadan Önce”, ThisObject);
ShowQuestion (Uyarı, “Pencereyi kapatmak istediğinizden emin misiniz?”,
Diyalog ModuSoru.EvetHayır
);
EndIf ;
Prosedürü Sonlandır
&İstemcide
Prosedür Tamamlanmayı Kapatmadan Önce(Sonuç , Ekstra seçenekler) İhracat
Sonuç = Diyalog Dönüş Kodu.Evet Daha sonra
Formu Kapatmanız Gerekiyor= Doğru;
kapalı();
Aksi takdirde
Formu Kapatmanız Gerekiyor= Tanımsız;
EndIf ;
Prosedürü Sonlandır

BeforeClosing form prosedüründe kullanıcıya bir soru sorulur, Reddetme bayrağı True olarak ayarlanır ve formun kapatılması iptal edilir.

Soruya verilen olumlu yanıtın ardından Need toCloseForm değişkeni True olarak ayarlanır ve form tekrar kapatılır.

Görev 3: Sayısal Değer Girme

İşleme formundaki düğmeye tıkladığınızda standart bir numara girişi iletişim kutusu açın.

Bunu yapmak için, kalıcı bir pencere yerine bir engelleme penceresi açan EnterNumber() yerine ShowNumberInput() yöntemini kullanmanız gerekir.

&İstemcide
Prosedür Sayıları Girme (Komut)
Uyarı = Yeni AçıklamaUyarılar(“Numarayı Girin Tamamlandı”, ThisObject);
ShowEnterNumbers(Uyarı, 0, “Miktar girin”, 15, 3);
Prosedürü Sonlandır
&İstemcide
Prosedür Sayıları GirmeTamamlanıyor(Sonuç , Ekstra seçenekler) İhracat

Mesaj = Yeni Kullanıcıya Mesaj;
Mesaj.Text = “Bir miktar girdiniz” + Sonuç;
Mesaj.Rapor();
EndIf ;
Prosedürü Sonlandır

Numara giriş penceresini kapattıktan sonra, ilk parametresi girilen numara veya kullanıcı girmeyi reddederse Tanımsız değer olacak bir prosedür çağrılacaktır.

Görev 4. Renk seçme

İşleme formundaki düğmeye tıkladığınızda, standart renk seçimi iletişim kutusunu kullanarak kullanıcı gerekli rengi belirtir. Basılan düğmenin arka planı için bu rengi ayarlayın.

SelectColor komutunu aşağıdaki işleyiciyle forma ekleyin:

&İstemcide
Prosedür Renk Seçimi (Komut)
Renk Seçimi İletişim Kutusu= Yeni Renk Seçimi İletişim Kutusu;
Uyarı = Yeni AçıklamaUyarılar(“Renk Seçimi Tamamlandı”, ThisObject);
Renk Seçimi İletişim Kutusu. Göster(Uyarı);
Prosedürü Sonlandır
&İstemcide
Prosedür SeçimRenklerTamamlama(Sonuç , Ekstra seçenekler) İhracat
Eğer DEĞİLSE Sonuç = Tanımsız O halde
Öğeler.Renk Seçimi.Arka Plan Rengi= Sonuç;
EndIf ;
Prosedürü Sonlandır

Renk Seçimi İletişim Kutusu nesneleri için (Standart Dönem Düzenleme İletişim Kutusu, Format Çizgisi Oluşturucusu, Düzenli Görev Takvimi İletişim Kutusu, Yazı Tipi Seçimi İletişim Kutusu'nun yanı sıra), Show() yöntemi bir engelleme penceresi açar.

Pencereyi kapattıktan sonra, ilk parametresi seçilen değerin (renk, yazı tipi vb.) veya kullanıcı seçimi reddettiyse Tanımsız değerin iletileceği bir prosedür çağrılacaktır.

Bu diyalogların uygulanması önemli ölçüde farklı olduğundan, FileSelectionDialog nesnesinin, renk veya yazı tipi seçimi diyaloglarının aksine bir Show() yöntemine sahip olmadığı unutulmamalıdır.

Web istemcisinde dosya seçimi iletişim kutusunu kullanmak için öncelikle dosya uzantısını etkinleştirmeniz gerekir.

Dosya uzantısı aracılığıyla uygulanan iletişim kutuları, kalıcı tarayıcı pencereleriyle aynı operasyonel sorunları yaratmadığından, FileSelectionDialog nesnesi için engelleme pencerelerinin açılması uygulanmadı.

Sonuç olarak, 8.3.10 sürümünden itibaren web istemcisinde kalıcı pencerelere yönelik desteğin sonlandırıldığını belirtmek isteriz. Bu durumda konfigürasyonda modal bir yöntem çağrılırsa bir istisna oluşturulur. Ayrıca web istemcisinde arayüz modu desteği durduruldu Ayrı pencerelerde. Ayrıca, hem ince istemcilerde hem de web istemcilerinde bir formu ayrı bir pencerede açmak artık mümkün değildir (Yer İmleri arayüz modunda çalışırken). Bu tür sert adımlar, artık tüm modern tarayıcılar tarafından desteklenmeyen arayüz modundan vazgeçmeyi mümkün kıldı.

Bu bilgilerden hangi pratik sonuç çıkarılabilir? Ve sonuç oldukça basit - eğer bir nedenden dolayı konfigürasyonunuzda hala kalıcı çağrılar varsa, o zaman web istemcisindeki bu yerlerde hata mesajı içeren bir pencere görüntülenecektir. Bu soruna hızlı bir çözüm bulmak için "Google" denemeye karşı sizi uyarmak isterim, çünkü... Tavsiyelerin çoğu bu tarife dayanmaktadır: konfigürasyon düzeyindeki yapılandırıcıda, "Modalite kullanım modu" özelliğini "Kullan" olarak ayarlayın. Doğal olarak şu anda bu işe yaramayacak çünkü modern tarayıcılar artık kalıcı çağrıları desteklemiyor.

Yukarıda açıklanan sorunu çözmenin yalnızca iki yolu var:

  1. Platformu 8.3.10+ (8.3.11) sürümünü yayınlayacak şekilde güncelleyin, "Uyumluluk Modu" yapılandırma özelliğini "Kullanmayın" olarak ayarlayın ve modal yöntemler kullanan kod parçalarını eşzamansız bir iş mantığı modeline yeniden yazın
  2. Müşterilerinize, modal çağrıları hâlâ destekleyen eski tarayıcıları (Mozilla Firefox 37 ve altı sürümler, Chrome 37'nin altındaki sürümler vb.) kullanmalarını önerin.

Bu arada, 8.3.11 sürümünden itibaren Microsoft Internet Explorer web tarayıcılarının 8 ve 9 sürümleri artık desteklenmemektedir.

Web tarayıcılarını modalite ışığında ele aldık, şimdi diğer istemcilerle durumu netleştirmenin zamanı geldi.

Sürüm 8.3.5'ten başlayarak, ince ve kalın istemcilerdeki Modalite Kullanım Modu özelliğine yalnızca /EnableCheckModal komut satırı seçeneğinin belirtilmesi durumunda saygı gösterilir. Bu parametre, yalnızca uygulama yapılandırıcıdan başlatıldığında komut satırına otomatik olarak eklenir. Bu parametre belirtilmezse hiçbir istisna oluşturulmaz ve ilgili uyarılar gösterilmez. Onlar. pratikte, kalın ve ince istemci kullanıldığında, modal mod kullanıldığında operasyonda temel bir değişiklik gözlemlenmez - modal çağrılar, web istemcisinde olduğu gibi herhangi bir uyarı vermeden, daha önce çalıştıkları gibi çalışacaktır.

İ'leri noktalamak için, sürüm 8.3.9'dan başlayarak kalın istemcinin "Platform uzantılarına ve harici bileşenlere senkronize çağrı kullanma modu" yapılandırma özelliğini yok saydığını, buna karşılık karşılık gelen senkronize yöntemlerin istisnalar oluşturmadan ve uyarılar görüntülemeden çalıştığını unutmayın. Belirtilen yoksayılan özellik, Google Chrome web tarayıcısındaki dosyalarla çalışmak için harici bileşenler, şifreleme ve uzantılarla eşzamansız çalışmayı desteklemek üzere 8.3.5 sürümüne eklenmiştir. Bunun kalın istemciyle hiçbir ilgisi olmadığı açıktır ve bu nedenle bu özelliğin "sessizce" göz ardı edilmesi, yapılandırmayı kullanırken eşzamanlı yöntemlerin kullanımına yönelik gereksiz kontrolleri ortadan kaldırmıştır.

Bu arada! Platformun güvenle web'e doğru ilerlemesi nedeniyle, 8.3.8 sürümüyle geliştiriciler, kalın ve ince istemcilerde yürütülen bir form veya uygulamayı kapatma mantığıyla ilişkili program koduna belirli kısıtlamalar getirdiler. Bu nüansı ayrıntılı olarak ele alan makalemizi mutlaka okuyun. Ek olarak, "1C: Enterprise 8.3'te arayüzlerin ve formların profesyonel gelişimi" kursunda, modalitenin terk edilmesine ayrılmış bir bölüm bulunmaktadır ve bu konuyla ilgili birçok yararlı ve alakalı bilgi toplayabilirsiniz.

Meslektaşlarım, sonsuza kadar okuyabileceğiniz iki şey var: VKontakte yayını ve platformun bir sonraki sürümündeki değişikliklerin listesi, o halde nihai sonuçları özetleyelim;)

Senkronize bir modelin öğelerinden asenkron modele geçmenize izin veren örnekleri değerlendirme sürecinde, muhtemelen genel durumda daha fazla program kodunun olduğunu fark etmişsinizdir. Ne kadar çok kod varsa, daha fazla bakım ve hata ayıklamanın karmaşıklığı da o kadar artar.

Ayrıca geliştirme sürecinde daha fazla diyalog kullanırsak kod miktarı daha da artacaktır. Bu nedenle, bir web istemcisinde çalışmaya odaklanan uygulama çözümleri geliştirme sürecinde, şu anda modern web uygulamalarında kullanılan çalışma paradigmasını hatırlamanız gerekir. Bu nedenle, yapılandırmanızda kullanıcıyla çok sayıda etkileşimli diyalog ve uyarı varsa, bu işlevselliği, kullanıcı etkileşimini düzenlemeye yönelik diğer bazı yaklaşımlar lehine yeniden düşünmek mantıklı olacaktır.

Bir sonuç yerine

“1C geliştirmede ilk adımlar” döngümüz sona erdi. Tamamını okursanız, büyük olasılıkla platformun son zamanlarda nasıl büyük bir hızla geliştiğini fark etmişsinizdir. Bu serideki materyaller nispeten yakın zamanda yazıldı, ancak onu ciddi şekilde güncellemek zorunda kaldık çünkü... Bu kadar kısa sürede bile pek çok yeni önemli işlevsellik ve değişiklik ortaya çıktı. Bu kadar büyük değişiklikler, bir 1C programcısı için bunca zamandır platformda profesyonel olarak büyüyüp gelişmemişse biraz kafa karıştırıcı olabilir.

Özel İnternet kaynaklarında, acemi programcıların ve onların daha olgun meslektaşlarının, 1C platformunun kapsamlı ve bazen görünüşte sonsuz yeteneklerini anlamalarına yardımcı olacak materyaller önerme isteklerini sıklıkla okuyabilirsiniz. Geleneksel olarak programlama derslerimize dikkat etmenizi öneririz.

"İstemcide eşzamanlı yöntemlerin kullanılması yasaktır" hatası neden oluşuyor?

Dersleri tamamlarken böyle bir hatayla karşılaşırsanız düzeltmeniz çok kolaydır.

Yapılandırıcıya dönün ve "Konfigürasyon" -> "Konfigürasyonu aç" menü öğesini seçin:

Açılan pencerede “Yapılandırma” öğesine sağ tıklayın ve açılan menüden “Özellikler” seçeneğini seçin:

Yapılandırma özelliklerine sahip bir pencere açılacaktır (sağda):

En aşağıya doğru kaydırın ve orada “Modalite modu” öğesini bulun:

Değerini şu şekilde ayarlayın: "Kullanmak":

Dikkat!İlk derste (sonraki sürüm) indirdiğimizden farklı bir 1C platformu kullanıyorsanız, o zaman "Senkronize çağrıları kullanma modu..." alanına da sahip olacağınızı lütfen unutmayın. Ayrıca "Kullan" olarak ayarlanması gerekir.

Son olarak, "Konfigürasyon" -> "Konfigürasyonu kaydet" menü öğesini seçin:

Hazır! Artık hata artık oluşmayacak.

Aşağıdaki açıklamalar - ne yaptığımızla ilgilenenler için.

Yapılandırmamızda modalite modunu etkinleştirdik. Varsayılan olarak bu mod devre dışıdır ve bu durum EnterNumber, EnterString, EnterDate, OpenValue gibi komutları kullanmamıza izin vermez.

Gerçek şu ki bu komutlar kalıcıdır. Bunları çağırmak, kullanıcının önünde (örneğin bilgi girmek için) bir pencerenin açılmasına neden olur ve bu pencere kapatılıncaya kadar programla çalışma olanağını engeller.

Ve bir web tarayıcısı aracılığıyla 1C ile çalışırken bu tür pencerelerin varlığı son derece istenmeyen bir durum olduğundan, yeni konfigürasyonlar geliştirilirken modalite modu varsayılan olarak kapalıdır.