Platform "1C: Enterprise" - kaputun altında ne var?

Ey Habr!
Bu yazıda içeride nasıl çalıştığına dair hikayeye başlayacağız. platform "1C:İşletme 8" ve geliştirilmesinde hangi teknolojilerin kullanıldığı.

Platform "1C: Enterprise" - kaputun altında ne var?

Bunun neden ilginç olduğunu düşünüyoruz? Birincisi, 1C:Enterprise 8 platformunun C++ (istemci, sunucu vb.), JavaScript (web istemcisi) ve son zamanlarda And'ta büyük (10 milyon satırdan fazla kod) bir uygulama olması nedeniyle Java. Büyük projeler en azından ölçekleri nedeniyle ilgi çekici olabilir, çünkü küçük bir kod tabanında görülmeyen sorunlar bu tür projelerde tüm gücüyle ortaya çıkar. İkincisi, "1C:Enterprise" kopyalanabilir, "kutulu" bir üründür ve Habré'de bu tür gelişmeler hakkında çok az makale bulunmaktadır. Diğer ekiplerde ve şirketlerde hayatın nasıl olduğunu bilmek de her zaman ilginçtir.

Öyleyse başlayalım. Bu makalede, uygulamaya derinlemesine dalmadan, platformda kullanılan bazı teknolojilere genel bir bakış sunacağız ve ortamın ana hatlarını çizeceğiz. Aslında birçok mekanizma için ayrıntılı bir hikaye ayrı bir makale, bazıları için ise bütün bir kitap gerektirir!
Başlamak için temel şeylere karar vermeye değer: 1C:Enterprise platformunun ne olduğu ve hangi bileşenlerden oluştuğu. Bu sorunun cevabı o kadar basit değil, çünkü "Platform" terimi (kısaca biz buna bu şekilde diyeceğiz) iş uygulamaları geliştirme araçlarını, çalışma ortamını ve yönetim araçlarını ifade eder. Aşağıdaki bileşenler kabaca ayırt edilebilir:

  • sunucu kümesi
  • Sunucuya http ve kendi ikili protokolü aracılığıyla bağlanabilen “ince” istemci
  • sabit sürücüde veya ağ klasöründe bulunan bir veritabanıyla iki katmanlı bir mimaride çalışmak için istemci
  • web istemcisi
  • uygulama sunucusu yönetim araçları
  • geliştirme ortamı (Yapılandırıcı olarak bilinir)
  • iOS, Android ve Windows Phone için çalışma zamanı ortamı (mobil platform 1C)

Web istemcisi dışındaki tüm bu parçalar C++ ile yazılmıştır. Ayrıca yakın zamanda açıklanan Yeni nesil yapılandırıcı, Java'da yazılmıştır.

Yerel uygulamalar

C++03 yerel uygulamalar geliştirmek için kullanılır. Windows için derleyici olarak Microsoft Visual C++ 12 (Windows XP ile uyumlu bir profil) kullanılır ve Linux ve Android için - gcc 4.8, iOS için - clang 5.0 kullanılır. Kullanılan standart kütüphane tüm işletim sistemleri ve derleyiciler için aynıdır - STLPort. Bu çözüm, STL uygulamasına özgü hataların olasılığını azaltır. STLPort artık üretilmediği ve gcc'nin C++11 etkin moduyla uyumlu olmadığı için şu anda CLang ile birlikte gelen STL uygulamasına geçmeyi planlıyoruz.
Sunucunun kod tabanı %99, istemcininki ise %95 oranında ortaktır. Üstelik mobil platform bile "büyük" kodla aynı C++ kodunu kullanıyor, ancak oradaki birleştirme yüzdesi biraz daha düşük.
Çoğu C++ kullanıcısı gibi biz de dilin ve kütüphanelerinin yeteneklerinin %100'ünü kullandığımızı iddia etmiyoruz. Yani pratikte Boost kullanmıyoruz ve dil özelliklerinden biri de dinamik tip dökümdür. Aynı zamanda aktif olarak şunları kullanıyoruz:

  • STL (özellikle dizeler, kapsayıcılar ve algoritmalar)
  • çoklu miras, dahil. çoklu uygulama mirası
  • Desenler
  • ve kesintiler
  • akıllı işaretçiler (özel uygulama)

Çoklu arayüz kalıtımı (tamamen soyut sınıflar) kullanılarak, aşağıda tartışılacak olan bir bileşen modeli mümkün hale gelir.

Bileşenleri

Modülerliği sağlamak için tüm işlevler dinamik kitaplıklar olan bileşenlere bölünmüştür (Windows için *.dll, Linux için *.so). Toplamda yüz elliden fazla bileşen vardır; bunlardan bazılarının açıklamaları aşağıda verilmiştir:

arka uç
Platform meta veri motorunu içerir

hesap
Uygulama geliştiricilerinin muhasebe kayıtları oluşturmak için kullandığı nesneler (hesap planları ve muhasebe kayıtları)

bsl
Gömülü dil yürütme motoru

atom bombası
Bellek ayırıcının özel uygulaması

dbeng8
Dosya veritabanı motoru. Basit bir SQL işlemcisini de içeren, ISAM'ı temel alan basit bir dosya sunucusu veritabanı motoru

wbase
Windows kullanıcı arayüzünü (pencere sınıfları, GDI erişimi vb.) uygulamaya yönelik temel sınıfları ve işlevleri içerir.

Birden çok bileşene bölmek çeşitli bakış açılarından faydalıdır:

  • Ayırma, daha iyi tasarımı, özellikle de daha iyi kod izolasyonunu teşvik eder
  • Bir dizi bileşenden farklı teslimat seçeneklerini esnek bir şekilde bir araya getirebilirsiniz:
    • Örneğin, ince istemci kurulumunda wbase bulunur ancak arka uç bulunmaz
    • ancak wbase sunucusunda tam tersine olmayacak
    • her iki seçenek de elbette nuke ve bsl içerecektir

Bu başlatma seçeneği için gereken tüm bileşenler, program başlatıldığında yüklenir. Bu, özellikle aşağıda tartışılacak olan SCOM sınıflarının kaydedilmesi için gereklidir.

SCOM

Daha düşük düzeyde ayrıştırma için, ideolojik olarak ATL'ye benzer bir kütüphane olan SCOM sistemi kullanılır. ATL ile çalışmamış olanlar için ana yetenekleri ve özellikleri kısaca listeliyoruz.
Özel olarak tasarlanmış bir SCOM sınıfı için:

  • Başka bir bileşenden yalnızca adını bilerek (uygulamayı açıklamadan) bir sınıf oluşturmanıza olanak tanıyan fabrika yöntemleri sağlar.
  • Referans sayan akıllı işaretçi altyapısı sağlar. SCOM sınıfı ömrünün manuel olarak izlenmesine gerek yoktur
  • Bir nesnenin belirli bir arayüzü uygulayıp uygulamadığını öğrenmenize ve nesneye yönelik bir işaretçiyi otomatik olarak arayüze yönelik bir işaretçiye dönüştürmenize olanak tanır
  • Get_service yöntemi vb. aracılığıyla her zaman erişilebilen bir hizmet nesnesi oluşturun.

Örneğin, json.dll bileşeninde JSON okumaya yönelik bir sınıf (örneğin, JSONStreamReader) tanımlayabilirsiniz.
Sınıflar ve örnekler diğer bileşenlerden oluşturulabilir; bunların SCOM makinesine kaydedilmesi gerekir:

SCOM_CLASS_ENTRY(JSONStreamReader)

Bu makro, bileşen belleğe yüklendiğinde yapıcısı çağrılacak olan özel bir statik kayıt cihazı sınıfını tanımlayacaktır.
Bundan sonra başka bir bileşende bunun bir örneğini oluşturabilirsiniz:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Hizmetleri desteklemek için SCOM ek ve oldukça karmaşık bir altyapı sunar. Bunun merkezinde, hizmetleri çalıştırmak için bir kapsayıcı görevi gören (yani Hizmet Bulucu rolünü oynayan) ve aynı zamanda yerelleştirilmiş kaynaklara bağlanma içeren bir SCOM süreci kavramı yer alır. SCOM süreci işletim sistemi iş parçacığına bağlıdır. Bu sayede uygulama içerisinde şu şekilde hizmetler alabilirsiniz:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

Üstelik, bir iş parçacığına bağlı mantıksal (SCOM) süreçleri değiştirerek, aynı iş parçacığı içinde çalışan, bilgi alanının bakış açısından pratik olarak bağımsız uygulamalar elde edebilirsiniz. İnce istemcimiz bir dosya veritabanıyla bu şekilde çalışır - bir işletim sistemi işleminin içinde biri istemciyle, ikincisi sunucuyla ilişkili iki SCOM işlemi vardır. Bu yaklaşım, hem yerel dosya veritabanında hem de "gerçek" istemci-sunucu sürümünde çalışacak kod yazımını birleştirmemize olanak tanır. Böyle bir tekdüzeliğin bedeli ağırdır, ancak uygulamalar buna değdiğini göstermektedir.

SCOM bileşen modeline dayanarak, 1C: Enterprise'ın hem iş mantığı hem de arayüz kısmı uygulanır.

Kullanıcı arayüzü

Bu arada, arayüzler hakkında. Standart Windows kontrollerini kullanmıyoruz; kontrollerimiz doğrudan Windows API üzerinde uygulanmaktadır. Linux sürümü için wxWidgets kütüphanesi üzerinden çalışan bir katman yapılmıştır.
Kontrol kütüphanesi 1C:Enterprise'ın diğer bölümlerine bağlı değildir ve tarafımızdan diğer birçok küçük dahili yardımcı programda kullanılmaktadır.

1C:Enterprise'ın yıllar süren gelişimi boyunca, kontrollerin görünümü değişti, ancak ilkelerde ciddi bir değişiklik yalnızca bir kez, 2009'da 8.2 sürümünün piyasaya sürülmesi ve "yönetilen formların" ortaya çıkmasıyla meydana geldi. Görünümü değiştirmenin yanı sıra, form düzeni ilkesi de temelden değişti - öğelerin akış düzeni lehine piksel piksel konumlandırılması reddedildi. Ayrıca yeni modelde kontroller doğrudan etki alanı nesneleri ile değil, özel DTO'lar (Veri Aktarım Nesneleri).
Bu değişiklikler, JavaScript kontrollerinin C++ mantığını kopyalayan bir 1C:Enterprise web istemcisi oluşturmayı mümkün kıldı. İnce istemciler ile web istemcileri arasındaki işlevsel eşitliği korumaya çalışıyoruz. Bunun mümkün olmadığı durumlarda, örneğin mevcut JavaScript API'sinin sınırlamaları nedeniyle (örneğin, dosyalarla çalışma yeteneği çok sınırlıdır), genellikle C++ ile yazılmış tarayıcı uzantılarını kullanarak gerekli işlevselliği uygularız. Şu anda Internet Explorer ve Microsoft Edge'i (Windows), Google Chrome'u (Windows), Firefox'u (Windows ve Linux) ve Safari'yi (MacOS) destekliyoruz.

Ayrıca, 1C platformunda mobil uygulamalar için bir arayüz oluşturmak amacıyla yönetilen formlar teknolojisi kullanılmaktadır. Mobil cihazlarda, kontrollerin oluşturulması işletim sistemine özgü teknolojiler kullanılarak gerçekleştirilir, ancak form düzeni mantığı ve arayüz yanıtı için "büyük" 1C:Enterprise platformundakiyle aynı kod kullanılır.

Platform "1C: Enterprise" - kaputun altında ne var?
Linux işletim sisteminde 1C arayüzü

Platform "1C: Enterprise" - kaputun altında ne var?
Mobil cihazda 1C arayüzü

Diğer platformlarda 1C arayüzü Platform "1C: Enterprise" - kaputun altında ne var?
Windows işletim sisteminde 1C arayüzü

Platform "1C: Enterprise" - kaputun altında ne var?
Arayüz 1C - web istemcisi

Açık kaynak

Her ne kadar Windows altında C++ geliştiricileri için standart kütüphaneler (MFC, WinAPI kontrolleri) kullanmasak da, tüm bileşenleri kendimiz yazmıyoruz. Kütüphaneden daha önce bahsedilmişti wxWidget'larve şunu da kullanırız:

  • cURL HTTP ve FTP ile çalışmak için.
  • OpenSSL kriptografiyle çalışmak ve TLS bağlantıları kurmak için
  • libxml2 ve libxslt XML ayrıştırma için
  • özgürlük posta protokolleriyle (POP3, SMTP, IMAP) çalışmak için
  • taklit eden e-posta mesajlarını ayrıştırmak için
  • SQLite kullanıcı günlüklerini saklamak için
  • YBÜ uluslararasılaşma için

Liste devam ediyor.
Ek olarak, oldukça değiştirilmiş bir versiyon kullanıyoruz Google Testi и Google Sahte Birim testleri geliştirirken.
Kütüphanelerin SCOM bileşen organizasyon modeliyle uyumlu olması için uyarlama yapılması gerekiyordu.
1C'nin yaygınlığı, platformu, içinde kullanılan kütüphaneler için mükemmel bir güç testi haline getiriyor. Çeşitli kullanıcılar ve senaryolar, kodun en nadir kullanılan alanlarında bile hataları hızla ortaya çıkarır. Bunları kendimiz düzeltip kütüphane yazarlarına geri vermeye çalışıyoruz. Etkileşim deneyiminin çok farklı olduğu ortaya çıkıyor.
Geliştiriciler cURL и özgürlük çekme isteklerine hızlı bir şekilde yanıt verir, ancak yama örneğin OpenSSL Onu asla geri vermeyi başaramadık.

Sonuç

Makalede 1C: Enterprise platformunun geliştirilmesinin birkaç ana yönüne değindik. Makalenin sınırlı kapsamı içinde, bizce sadece bazı ilginç yönlere değindik.
Çeşitli platform mekanizmalarının genel bir açıklaması burada bulunabilir. burada.
Gelecek makalelerde hangi konular ilginizi çekecek?

1C mobil platformu nasıl uygulanır?
Web istemcisinin iç yapısının açıklaması?
Ya da belki yeni sürümler için özelliklerin seçilmesi, geliştirilmesi ve test edilmesi süreciyle ilgileniyorsunuz?

Yorumlara yazın!

Kaynak: habr.com

Yorum ekle