Harici bileşenlerin teknolojisi (). Harici bileşenlerin teknolojisi () ITS'deki bileşen şablonu

Ansmirnov 22 Eylül 2013 yaklaşık 14:12

Harici bileşenler 1C 8.2

  • programlama,
  • C++
  • öğretici

Girmek

Bu makale, 1C: Enterprise sistemindeki harici bileşenlerin çalışması hakkında bilgi sağlar.
Windows işletim sisteminin kontrolü altında çalışan 1C: Enterprise sistem sürüm 8.2'nin harici bileşenlerini geliştirme süreci, çalışmanın dosya sürümüyle gösterilecektir. Bu seçenek, küçük işletmelere uygun çoğu çözümde mevcuttur. VK, C++ programlamam kullanılarak uygulanacaktır.

"1C: Enterprise"ın harici bileşenleri

“1C: Enterprise” genişleyen bir sistemdir. Sistemin işlevsel yeteneklerini genişletmek için harici bileşenler (VC) kullanılır. Perakendeci açısından VK, gücü ve yöntemleri olan ve aynı zamanda 1C: Enterprise sistemi tarafından işlenmek üzere veri üretebilen harici bir nesnedir.
"1C: Girişimcilik" programını kullanarak uygulanması zor ve imkansız olan görevlerin kilidini açmak için harici bileşenler kullanılabilir. Sokrem, bu sınıfa, örneğin belirli ekipmanlarla çalışmak için işletim sistemiyle düşük seviyeli etkileşimler gerektiren işler getirilebilir.
“1C: Enterprise” sistemi, harici bileşenler tarafından oluşturulan iki teknolojiyi kullanır:
  • Wikoristannyam Yerel API'sinden
  • vikoristannym teknolojileri COM ile
Son derece önemli iki teknoloji arasındaki sınırları tanımlarken, VK'nın Native API ile geliştirilmesinde görülebileceği gibi fark önemsizdir. Gerekirse, uygulama VK'nın farklı bir COM teknolojisiyle geliştirilmesi için derlenebilir ve ayrıca küçük değişikliklerle, dosya modunda yönetilen diğer işletim seçenekleriyle 1C:Enterprise sisteminde kullanılmak üzere kaydedilebilir.
VK yapısı
1C: Enterprise temsil sisteminin DLL kütüphanesi biçimindeki harici bir bileşeni. Kütüphane kodu IComponentBase sınıfını açıklar. Oluşturulan sınıf, harici bileşenlerin işlevine karşılık gelen belirli yöntemlere sahip olabilir. Materyali yayınladığımda aşağıda daha ayrıntılı yöntemler anlatılacaktır.

Bir demo VK'nın başlatılması

Zavdannya:
  1. Vikonati, ITS aboneliğiyle birlikte gelen ve 1C'deki harici bileşenler mekanizmasının ana yeteneklerini göstermeyi amaçlayan katlanmış harici bileşenler
  2. Demo bileşenini 1C konfigürasyonuna bağlayın
  3. Bildirilen işlevlerin doğruluğunu kontrol edin
Derleme
VK demosu, "/VNCOMP82/example/NativeAPI" dizinindeki ITS abonelik diskine yüklenir.
Bir demo VK oluşturmak için Microsoft Visual Studio 2008'i kullanacağız. Bu ürünün diğer sürümleri, kullanılan Visual Studio projesinin formatını desteklememektedir.


AddInNative projesini başlatıyoruz. Bir proje kurarken, projenin derlenmesi için gerekli başlık dosyalarının bulunduğu bir dizine yer veririz. Kokuyu yıkamak için katalozdaki ITS diskinde bulunur /VNCOMP82/include.
Koleksiyonun sonucu bir dosyadır /bind/AddInNative.dll. Buna 1C konfigürasyonuna bağlantı için derlenmiş bir kütüphane dahildir.
1C yapılandırmasından önce VK bağlantıları
Boş konfigürasyon 1C ile oluşturulabilir.
Program modülünün kodu aşağıdadır.
değişken DemoComp; Prosedür OnEarthRobotSystem() Insert HariciComponent("...\bind\AddInNative.dll", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.AddInNativeExtension"); KinetsProsedürleri
1C yapılandırmasını başlatırken sıfırlamayla ilgili herhangi bir bildirim olmadığından VK başarıyla bağlandı.
Girilen kodun girilmesi sonucunda konfigürasyonun global görünürlüğü bir nesne olarak görünür DemoComp Harici bileşenlerin kodunda tanımlanan yöntemler ne kadar güçlü?
Gömülü işlevselliğin gösterimi
VK gösterisinin fizibilitesini kontrol edelim. Bunun için kurulum yapıp yetkililerin adımlarını okumayı deneyelim, VK yönteminin adımlarına tıklayıp ayrıca VK bildirimlerini iptal edip erişmeye çalışalım.
ITS diskinde sağlanan belgeler VK demosunun işlevselliğini belirtir:
  1. Bileşen nesnesinin tesis kontrolü
    Yöntem: bir ısırık al, Vimknuti
    Yetki: Dahil
  2. Kontrollü zamanlayıcı
    Bileşenin her saniyesi “1C: Enterprise” sisteminin parametrelerle bildirilmesiyle güçlendirilir Bileşen, Zamanlayıcı ve sistemik bir yaşındaki çocuğun doktorunun yanında.
    Yöntem: Başlatma Zamanlayıcısı, Durdurma Zamanlayıcısı
    Yetki: Ä Zamanlayıcı
  3. Yöntem Satır Durumunu Göster Yöntem tarafından parametre olarak iletilen satır durumundaki metni görüntüleyen
  4. Yöntem VantageResim. Atanan dosyadan görüntüleri yakalar ve çift veri biçiminde “1C: Enterprise” sistemine aktarır.
Bu işlevlerin kullanışlılığını yeniden değerlendiriyoruz. Saldırgan kod kimin hesabına yöneliktir:
değişken DemoComp; Prosedür AtStartRobotSystem()ConnectExternalComponent(...); DemoComp = Yeni("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Wimcnuti(); Göster (DemoComp.Enabled); DemoComp.Enable(); Göster (DemoComp.Enabled); DemoComp.StartTimer(); EndProceduresProcedureProcedureProcessExternalPod(Dzherelo, Podiya,Dani) Show(Dzherelo + " " + Podiya + " " +Dani); KinetsProsedürleri
Yapılandırmayı başlatmanın sonucu resimde gösterilmektedir


Puanlama yöntemlerinin sonuçları “Rapor” panelinde görüntülenir DemoComp.Wimcnuti()і Demo.Comp.Enable(). Aynı paneldeki sonraki satırlar, VK'dan alıntıların işlenmesinin sonuçlarını gösterecektir. Dzherelo, Podiaі Dani açıkça.

Daha fazla harici bileşen

Talep: Dış parçaların adını daha fazla değiştirin.
Önceki bölümün bir vikory kimliği var AddInNativeExtension, herhangi bir açıklama olmadan. Bu videoda AddInNativeExtension- bu ad genişletildi.
VK koduna atanmış bir yöntem var Uzantıyı Farklı Kaydet VK'nın sisteme daha fazla kaydedilmesi için gerekli olan isimleri 1C: Enterprise sistemine aktaran. Harici bileşenlerin özünü açıkça ortaya koyan bir tanımlayıcının belirtilmesi önerilir.
Yönteme yeni kod ekleyin Uzantıyı Farklı Kaydet Uzantının değişen adları nedeniyle:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; ((void**)wsExtensionName, iActualSize * sizeof (WCHAR_T)))::convToShortWchar(wsExtensionName, wsExtension, iActualSize); doğruyu döndür; ) false değerini döndür;
Seçilen uygulamanın VK adı şu şekilde değiştirildi: Bazı İsimler. VK'ya bağlıysanız yeni bir ad girmelisiniz:
DemoComp = Yeni("AddIn.DemoVK.SomeName");

VK yetkililerinin listesini genişletme

Zavdannya:
  1. VK yetkililerinin uygulanmasını düşünün
  2. Okuma ve yazma için mevcut olan sıradan tipe güç katın
  3. Sıradan tipe güç ekleyen kayıt, kalan kurulu gücün veri tipini kaydeden, okumaya hazır hale gelir. Gücün yerleşik değeriyle hiçbir eylem başarısızlıkla sonuçlanmayacak

Oluşturulan bileşenin gücünü kontrol etmek için geliştiricinin AddInNative.cpp kitaplık kodunda aşağıdaki yöntemleri uygulaması gerekir:
NProps'u edinin
Bu genişletmenin güç sayısını, güç sayısı için 0 olarak döndürür
FindProp
Parametrelerde adı iletilen yetkilinin seri numarasını çevirir
GetPropName
Yetkilinin adını seri numarasına ve iletilen film tanımlayıcısına göre döndürür
GetPropVal
Güç değerlerini atanan sıra numarasından döndürür
SetPropVal
Belirlenen sıra numarasından güç değerini ayarlar
IsPropReadable
Teğmen, belirlenmiş bir seri numarasından güç okuma olasılığının işaretini döndürür
IsPropYazılabilir
Belirlenen seri numarasından güç kaydetme olasılığının sancağını döndürür


Sınıfa enjekte etme yöntemlerinin uygulanmasına bir göz atalım CADdInNative.
Gösteri VK'nın 2 gücü vardır: Dahilі Ä Zamanlayıcı (Etkinі IsTimerPresent).
Kütüphane kodunun genel kapsamına atanmış iki dizi vardır:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Devre Dışı", L"Zamanlayıcı");
yetkililerin Rusça ve İngilizce adlarını koruyanlar. Başlık dosyasında AddInNative.h aşırı sigorta belirtilir:
enum Props(ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Her zaman son);
ePropIsEtkinі ePropIsTimerPresent 0 ve 1 değerleri kesinlikle otoritelerin sıra sayılarını tanımlayıcının anlamı ile değiştirmek için kullanılabilir. 2 değerine sahip ePropLast, bir dizi otoriteyi kaldırmak için kullanılır (GetNProps yöntemini kullanarak). Bu adlar yalnızca bileşen kodunun ve kullanılamayan çağrıların ortasında listelenir.
FindProp ve GetPropName yöntemleri dizileri arar g_PropAdlarıі g_PropNamesRu.
Kütüphane modülündeki alanların değerlerini kaydetmek için CAddInNative sınıfı, bileşenlerin güç değerlerini kaydeden güç değerlerine sahiptir. Yöntemler GetPropValі SetPropVal Bu otoritelerin rotasyona tabi tutulması ve öneminin belirlenmesi açıktır.
Yöntemler IsPropReadableі IsPropYazılabilir ve döndür doğru ya da başka YANLIŞ, iletilen güç seri numarasından dikkatli bir şekilde programın mantığı ile tutarlıdır.
Yeterli gücü eklemek için şunları yapmak gerekir:

  1. Masifte mevcut olanı yetkililere ekleyin g_PropAdlarıі g_PropNamesRu(dosya AddInNative.cpp)
  2. Perelik'te Sahne donanımı(dosya AddInNative.h) önce ePropLast Yetkilileri, neyin gerekli olduğunu açıkça tanımlayan bir şey ekleyin
  3. Yetkililerin değerlerini kaydetmek için belleği düzenleyin (bileşen modülünde belirli değerleri kaydeden alanlar ekleyin)
  4. Yöntemlerde değişiklik yapın GetPropValі SetPropValön tarafta görülen hafızayla etkileşime geçmek
  5. Programın mantığını yöntemlere göre değiştirmek önemlidir IsPropReadableі IsPropYazılabilir
1, 2, 5. maddeler açıklama gerektirmez. Bu şartların uygulanmasına ilişkin ayrıntılara istatistik eki okunarak ulaşılabilir.
Damo test yetkililerini aradı Ölçekі Türü Ters Çevirme açıkça. Bu nedenle, aşağıdaki 1. paragrafın bir sonucu olarak:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Eklendi", L"Zamanlayıcı", L"Test", L"TypeCheck");
Perelik Sahne donanımı Matime Viglyad:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Her zaman son);
Kodun anlamlı basitliği için STL C++ kullanın. Zokrema, sıra halindeki robotlar için WCHAR, kütüphaneyi bağlayın ip.
Yöntemin değerini kaydetmek için Ölçek, sınıfta önemli CADdInNative görünürlük alanındaki özel alanda:
dizi testi1;
Satır parametrelerini “1C:Enterprise” ile harici bileşen arasında aktarmak için “1C:Enterprise” bellek yöneticisi kullanılır. Gelin raporuna bir göz atalım. Belleği görüntülemek ve kaydetmek için aşağıdaki işlevleri kullanın: AllocBellekі Boş hafıza, dosyaya atandı ImemoryManager.h. 1C: Girişimcilik sistemine bir satır parametresinin aktarılması gerekiyorsa, harici bileşen, fonksiyona tıklanarak altındaki hafızayı görebilir. AllocBellek. Prototip şuna benziyor:
sanal bool ADDIN_API AllocMemory (void** pMemory, imzasız uzun ulCountByte) = 0;
de pBellek- görünür bellek bloğunun adresini içerecek olan yatırıcının adresi,
ulCountByte- Görünen hafıza kutusunun boyutu.
Art arda bir hafıza görünümü örneği:
WCHAR_T * t1 = NULL, * test = L "TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Satır veri türleriyle çalışmayı kolaylaştırmak için işlevi açıklıyoruz wstring_to_p. Vaughn wstring-row parametresini kaldırır. Fonksiyonun sonucu yapıyı doldurmaktır tVaryant. İşlev kodu:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T));memcpy(t1, str.c_str(), (str.length()+1) * sizeof(WCHAR_T));val -> pstrVal = t1;val -> strLen = str.length(); doğruyu döndür;
Bu aynı zamanda yönteme ilişkin switch ifadesinin durum bölümüdür. GetPropVal Göreceğiz:
case ePropTest1: wstring_to_p(test1, pvarPropVal); kırmak;
Yöntem SetPropVal:
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) false değerini döndürürse; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); kırmak;
Diğer yetkilerin uygulanması için sınıf alanı önemlidir CaddInNative
uint8_t son_tip;
Bu durumda kalan aktarılan değerin türü kaydedilir. CaddInNative::SetPropVal yöntemini kullanmak için aşağıdaki komutu ekleyin:
son_tip = TV_VT(varPropVal);
Şimdi başka bir kuvvetin okuma değerini yazdığınızda değeri döndüreceksiniz son_tip, Amaçlanan görev neyi temsil ediyor?
Değişikliklerin uygulanabilirliğini kontrol edelim.
Bu amaçla mevcut 1C konfigürasyonunu şu şekilde gösterelim:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Show(Row(DemoComp.CheckType)); DemoComp.Test = "Vasya"; Show(Row(DemoComp.Test)); DemoComp.Test = "Petya"; Show(Row(DemoComp.Test)); Show(Row(DemoComp.CheckType)); KinetsProsedürleri
Sonuç olarak, lansmana aşağıdaki mesaj dizisi verilir:
3
Vasya
Petrol
22

Diğer üçüncü bilgi ise ilk etapta kurulan iktidar okumasının sonucudur. Yapılacak ilk şey, kalan yerleşik güç türünden intikam almaktır. 3 tam değere, 22 ise satır değerine karşılık gelir. Türlerin çeşitliliği ve kodları dosyaya yüklenir türleri.h ITS diskinde bulunan .

Genişletilmiş yöntem listesi

Zavdannya:
  1. Harici bileşenlerin işlevselliğini ek işlevlerle genişletin:
  2. Yöntemlerin harici bileşenlerde nasıl uygulanacağını öğrenin
  3. Bir işlev yöntemi ekleyin İşlev1 parametre iki satır aldığından (“Parametre1” ve “Parametre2”). Sonuç olarak satır şu şekilde olur: “Yeniden doğrulama. Parametre1, Parametre2"
  4. Bu değişikliklerin kullanışlılığına dönüştürün

Oluşturulan bileşenin yöntemlerini uygulamak için geliştiricinin bu tür yöntemleri AddInNative kitaplık kodunda uygulaması gerekir:
NMethods'u Alın, Bulma Yöntemi, GetMethodName
Yöntemin numarasını ve adını arayarak en fazla sayıda yöntemi seçmek için tasarlanmıştır. Yetkililer için benzer yöntemlere benzer
NParams'ı edinin
Yöntemin parametre sayısını atanan seri numarasından döndürür; Böyle bir sayıya sahip bir yöntem günlükse veya parametreleri yoksa 0 döndürün
GetParamDefValue
Belirtilen yöntemin girilen parametresinin değerini döndürür
HasRetVal
Döndürülecek değerin belirtilen sıra numarasına sahip bir yöntemin görünürlük sırasını döndürür: döndürülen değerlere sahip yöntemler için true YANLIŞ başka bir durumda
CallAsProc
YANLIŞ 1C modülü: İşletmeler'in uygulandığı saatin insafından kaynaklanmaktadır. Bir dizi parametrenin belleği 1C: Enterprise'da görünür ve mevcuttur.
CallAsFunc
Yöntem, atanan seri numarasıyla tanımlanır. Yöntem dönüyor YANLIŞ 1C modülü: İşletmeler'in uygulandığı saatin insafından kaynaklanmaktadır. Bir dizi otoritenin hafızası 1C: Enterprise olarak görülüyor. Döndürülen değer satır veya double veri tipi olduğundan bileşen hafıza fonksiyonunu görür. AllocBellek Bellek yöneticisi verileri buraya yazar ve bu adresi yapının özel bir alanına kaydeder. 1C: Enterprise bu belleği tıklatarak almak için Boş hafıza.
ITS diskinde sağlanan belgelerdeki parametreler listesi ve rapor açıklamaları da dahil olmak üzere yöntemlerin tam açıklaması.
Açıklanan yöntemlerin uygulanmasına bakalım.
Bileşen kodunda iki dizi vardır:
static wchar_t *g_MethodNames = (L"Etkinleştir", L"Devre Dışı Bırak", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Aç", L"Vimknuti", L"RowStatus'ta Göster", L"StartTimer", L"StopTimer", L"EnterBaby");
o aşırı tepki:
enum Yöntemleri (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Her zaman son);
Koku vikorystvuyutsya fonksiyonlarıdır NMethods'u Alın, Bulma Yöntemiі GetMethodName, Yetkililerin açıklamasına benzetilerek.
Yöntemler NParams'ı edinin, GetParamDefValue, HasRetVal Bir anahtarı uygulamak için parametrelerin ve program mantığının gerekli değerleri döndürecek şekilde aktarılması önemlidir. Yöntem HasRetVal Kodunuzda ayrıca sonucu döndürebilecek yöntemlerin bir listesi de bulunur. Onlar için şarap dönüyor doğru. Tüm çelik yöntemleri için döndürün YANLIŞ.
Yöntemler CallAsProcі CallAsFunc Yanlış kod yönteminden intikam alın.
İşlev olarak çağrılabilecek bir yöntem eklemek için harici bileşenin çıkış kodunda değişiklik yapmanız gerekir:
  1. Dizilere yöntem adları ekleme g_MethodNamesі g_MethodNamesRu(dosya AddInNative.cpp)
  2. Yöntemleri aktarmadan önce yönteme tanımlayıcı hakkındaki bilgileri ekleyin (dosya AddInNative.h)
  3. İşlev kodunda değişiklik yapma NParams'ı edinin Programın mantığına bağlı
  4. Gerekirse yöntem kodunda değişiklik yapın GetParamDefValue Yöntemin parametrelerinin arkasındaki değerleri anlamanız gerekiyorsa.
  5. İşlevde değişiklik yapma HasRetVal
  6. Robot fonksiyonlarının mantığında değişiklik yapın CallAsProc ya da başka CallAsFunc doğrudan bağlı olan yöntemin kodunu oraya yerleştirerek.
Yol Gösterici Masivi g_MethodNamesі g_MethodNamesRu ve aşırı maruz kalma Yöntemlerşunu görene kadar:
static wchar_t *g_MethodNames = (L"Etkinleştir", L"Devre Dışı Bırak", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Etkinleştir", L"Vimknuti", L"ShowInRowStatus", L"StartTimer", L"StopTimer", L"ZavantazhitiMalyunok", L"Test");

Numaralandırma Yöntemleri (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Her zaman son);
Seçilebilir fonksiyon NProps'u edinin“Test” yöntemindeki parametre sayısını değiştirmek için:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: dönüş 1; case eMethLoadPicture: dönüş 1; case eMethTest: dönüş 2; varsayılan :)
Lütfen fonksiyonda değişiklik yapın:
Bool Caddinnative :: getparamdefvalue (Consta Long Lmethodnum, Cost Long lparamnum, TVariant *pvarparamdefvalue (tv_vt (PvarparamDeFvalue) = VTYPE_EMPTY; SWITCH (LMETHODN UM) Statusline: Case EmetHstarttimer: Case EmetHstopoptimer: Case Emmethtest: / / / Parametre Değeri Yok​​ varsayılan olarak break; varsayılan: false değerini döndür;) false değerini döndür;
Verilen satıra Zavdyaki
vaka eMethTest:
Bir veya daha fazla argüman varsa karşılık gelen parametreler boş değerlere sahip olacaktır ( VTYPE_EMPTY). Parametreyi bölümde belirttikten sonra ayarlarının girilmesi gerekmektedir. eMethTest anahtar işlev bildirimi CAddInNative::GetParamDefValue.
“Test” yöntemi değerleri döndürebildiğinden fonksiyon kodunda değişiklik yapmanız gerekir. HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) return false; )
Kodu yönteme ve işleve ekliyorum CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(LoMethodNum) ( case eMeMe if (!lSizeArray || !paParams) return false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; break;) return ret;
Bileşeni derleyelim ve yapılandırma kodunu şu şekilde görünecek şekilde ayarlayalım:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); şerit = DemoComp.Test ("Merhaba," "Işık!"); Povidomite(trans); KinetsProsedürleri
Yapılandırmayı başlattıktan sonra, yöntemin başarıyla tamamlandığını onaylamak için bir bildirim görünür: "Merhaba Işık!".

Zamanlayıcı

Zavdannya:
  1. Zamanlayıcının uygulamasını VK demosundan okuyun
  2. "StartTimer" yöntemini değiştirerek parametrelere zamanlayıcı istek aralığını (milisaniye cinsinden) aktarma özelliğini ekleyin.
  3. Bu değişikliklerin kullanışlılığına dönüştürün

Robotlar için WinAPI, bir saat içinde hızlı bir şekilde bildirim almanızı sağlar WM_TIMER. Zamanlayıcı için ayarladığınız saat aralığından sonra programınızın sona ereceğini lütfen unutmayın.
Bir zamanlayıcı oluşturmak için aşağıdaki işlev kullanılır: Zamanlayıcıyı Kur:
UINT SetTimer(HWND hWnd, // pencere açıklaması UINT nIDevent, // zamanlayıcı kimliği (sayı) UINT nElapse, // gecikme TIMERPROC lpTimerFunc); // fonksiyonun göstergesi
Daha fazla bilgi için işletim sistemi WM_TIMER Programa aralıklarla bir argüman atarız nGeçme(Milisaniye cinsinden). Kalan parametrede, cilt zamanlayıcı etkinleştirildiğinde devre dışı bırakılabilecek bir işlevi belirleyebilirsiniz. Bu fonksiyonun başlığı şu şekilde görünebilir (şunun gibi bir şey olabilir):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Zamanlayıcının VK demosundaki uygulamasına bakalım.
Dolayısıyla, Windows işletim sistemi için harici bileşenlerin geliştirilmesi sürecine baktığımızda, zamanlayıcının diğer işletim sistemlerinde uygulanmasına bakmıyoruz. Kısaca GNU/Linux işletim sistemi için uygulama, işlevin sözdizimine göre değişiklik gösterecektir. Zamanlayıcıyı Kurі ZamanlayıcıProc.
Aşağıdaki kod bir yöntemle çağrılır Zamanlayıcıyı Kur fonksiyon aktarılana kadar MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Oluşturulan zamanlayıcının kimliği menüde bulunur m_uiTimer Böylece açabilirsiniz.
İşlev MyTimerProc gelecek sıraya bakar:
VOID CALLBACK MyTimerProc(HWND hwnd, // zamanlayıcı mesajları için pencere tanıtıcısı UINT uMsg, // WM_TIMER mesajı UINT idEvent, // zamanlayıcı tanımlayıcısı DWORD dwTime // mevcut sistem zamanı) ( if (!pAsyncEvent) return; w "ComponentNative", *what = L"Timer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); , ne, wstime); delete wstime; ))
Fonksiyonun özü bir metodu çağırmasıdır Harici Olay 1C: Enterprise sistemine yapılan bildirimin izin verdiği şey.
Yöntemin işlevselliğini genişletmek için Başlatma Zamanlayıcısı Aşağıdakileri deneyelim:
Yöntem kodunu değiştirme NParams'ı edinin yani yöntem için eMethStartTimer dönüş değeri 1:
case eMethStartTimer: dönüş 1;
Kodu yönteme yönlendirelim CallAsProcşunu görene kadar:
case eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
Şimdi önceliği kontrol edelim. Bunun için konfigürasyon eklenti modülüne aşağıdaki kodu yazacağız:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); KinetsProsedürleri
Konfigürasyon başladıktan sonra program öncesinde 2 saniye aralıklarla bir bildirim gelmelidir, bu da zamanlayıcının doğru çalıştığı anlamına gelir.

1C: Enterprise sistemi ile etkileşim

Harici bileşen ile 1C: Enterprise sistemi arasındaki etkileşim için, dosyada açıklanan IAddInDefBase sınıfının yöntemleri kullanılır. AddInDefBase.h. En sık suistimal edilenler ise şöyle yorumlanıyor:
Grevle ilgili bildirimin oluşturulması
sanal bool ADDIN_API AddError(imzasız kısa wcode, const WCHAR_T* kaynağı, const WCHAR_T* tanım, uzun kod)
wcode, kod- derleme kodları (açıklamalı derleme kodlarının bir listesi ITS diskinde bulunabilir)
kaynak- dzherelo af
tanım- Değişikliklerin açıklaması
“1C: Girişimcilik” sisteminin geliştirilmiş bildirimi
sanal bool ADDIN_API HariciEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszKaynak- Dzherelo notu
wszMesajı- Duyuru metni
wszVerileri- veri aktarımı
Yeniden maruz kalma, Dış Toprağın İşlenmesi prosedürü ile gerçekleştirilir.
Harici bileşenlerin 1C: Enterprise sistemine kaydedilmesi
sanal bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfilAdı- Ben bileşenim.
Bu yöntemler VK ve 1C arasında yeterli etkileşimi sağlar. 1C: Enterprise sisteminin harici bileşeninden veri çıkarmak için, harici bileşen 1C sisteminin nasıl yönetileceğine ilişkin özel bilgiler gönderir ve gerekirse ağ geçidi veri aktarımı için harici yöntemleri yeni bileşenler olarak çağırır.

Veri türü tVariant

Harici bir bileşen ile 1C: Enterprise sistemi arasında veri alışverişi yaparken tVariant veri türü seçilir. ITS diskinde bulunabilen type.h dosyasının açıklamaları şunlardır:
struct _tVariant ( _ANONYMOUS_UNION union ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint8_t ui8Val; int64_t ullVal; int32_t er rCode; long h Res; float fltVal; double dblVal; bool bVal; char chVal; wchar_t wchVal; DATE tarih; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; al;uint32_t strLen ; //bayt sayısı ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct ( WCHAR_T* pwstrVal; uint32_t wstrLen; / / sembol sayısı ) pvarVal TYPEVAR vt'deki boyutlu dizi;);
Tip tVaryant aşağıdakileri içeren bir yapıdır:
  • sumish (birleşim), verileri kaydetmek için ortada tanınır
  • Veri türü tanımlayıcı
Değişken tipte zagalnym tipi bir robotta tVaryant Yaklaşan algoritmayı takip edin:
  1. Değişiklikle birlikte halihazırda saklanan veri türüne göre
  2. Verilere anında erişim için sumisha'nın görünen alanına doğru kaydırın
Vikoristannya tipi tVaryant 1C: Enterprise sistemi ile harici bileşenler arasındaki etkileşimi önemli ölçüde basitleştirecek

ek

İstatistiklere izmarit yerleştirmek için örnekler kataloğu
örnekler/1 - demo bileşenini başlatın
örnekler/2 - yetkililer listesinin genişletilmesinin gösterimi
örnekler/3 - genişletilmiş yöntem listesinin gösterimi
Kozhen kataloğu, VS 2008 projesi ve hazır 1C konfigürasyonu.

OLEG FİLİPİV ANT-Inform, eğitim dairesi başkanının şefaatçisi, [e-posta korumalı]

1C:Enterprises'ın genişletilebilir işlevselliği
Bölüm 1. COM'un harici bileşenleri

Bir 1C cilt geliştiricisinin hayatında, önüne konulan görevin 1C platformunun yeteneklerini aştığı an gelir. “Mozhlivy'nin kenarlarını iyileştirmenin” yollarına bir göz atalım

Tamamlanan 1C geliştiricileri, makalenin başlığının ilk üç kelimesinden sonra melodik bir şekilde 1C:Enterprise için yeni bileşenlerin olduğunu tahmin ettiler. Bu teknoloji 1C:Enterprise 7.7 platformundan (veya öncesinden) beri mevcuttur. Tarihsel olarak, esas olarak, mülkiyeti başlatan şarkı işlemlerinin 1C platformu tarafından işlenmesini gerektiren ticari ekipmanlarla (Barkod tarayıcılar, elektronik kasalar, yazarkasalar) en üst düzeyde etkileşim için ortaya çıkmıştır. Bunlar COM/LPT bağlantı noktalarına giden bayt sırası ile aynıdır. Elbette 1C platformunu bu kadar düşük hızlı mekanizmalarla çalışmaya uyarlamak doğru olmaz, dolayısıyla 1C:Enterprise için en yeni bileşenlerin teknolojisi tahmin edilebilir.

Bu makale serisinde dış bileşenler hakkında daha az bilgi yok: Dış bileşenler germe ve katlama mekanizmasını tamamlayacak, dolayısıyla en önemli görevlerdeki rolleri "silahtan tümseklere ateş etmek" olarak değerlendiriliyor. Bu harici bileşenler, 1C:Enterprise platformunun kapsamının ötesine geçen çeşitli görevleri gerçekleştirmenin en evrensel yoludur ve bu nedenle bunları da dahil edebiliriz. İstatistikler, COM'a dayalı olarak yeni bileşenlerin en eski, sıklıkla revize edilen ve yeniden doğrulanan teknolojisine bakacaktır.

Dış bileşenler nelerdir?

Yukarıda belirtildiği gibi harici bileşenler 1C:Enterprise'da 7.7 sürümüyle göründü. Geleneğe dayanarak, 1C platformunun geliştiricileri "dalga geçmediler" ve dış bileşenler, zorunlu otoritelerin ve yöntemlerin söylendiği bir nesneydi. Bileşenler açık ve eksiksiz görünüyor. 1C: Enterprise 7.7 için yazılan bu bileşenler (teorik olarak) 1C: Enterprise 8.3 ile çalışır.

Uygulamada bir takım incelikler vardır: Harici bileşen platformun kendisiyle aktif olarak etkileşime girdiğinden, işlevleri belirli bir sürüm için uzmanlaşmış olacaktır.

1C:Enterprise'ın 8.2 sürümüyle, harici bileşenlerin geliştirilmesi için NativeAPI adı verilen yeni bir teknoloji ortaya çıktı. Bu teknoloji kullanılarak yazılan bileşenler COM nesneleri değildir. Bir yandan bu artı - bu bileşenler kayıt gerektirmez, diğer yandan 1C:Enterprise platformu dışında bunları vikoristanlamak imkansızdır. Harici bileşenlerin geliştirilmesi, suçlanacak birkaç dolaylı arayüz nedeniyle daha da karmaşık hale geldi. Güncel istatistiklerde de onunla ilgili bilgiler var.

Harici bileşenler ve teknoloji COM

COM teknolojisinin kendisini tam olarak anlatmayacağım çünkü bu konuyla ilgili pek çok literatür var. İlk inproc sunucusunun oluşturulmasının 1C:Enterprise için harici bileşenlerin oluşturulmasıyla "karıştığını" söylemek kolaydır, ancak bu gerçeklerden çok uzak değildir. Çoğu zaman sadece bu işlevsellik ile idare edebilirsiniz. Visual Studio'da COM nesnesinin nasıl oluşturulacağı birçok farklı şekilde anlatılmaktadır. Zokrema, kişi 1C: Enterprise web sitesinin poposuyla bunun nasıl yapılacağını ayrıntılı olarak yazdı.

Hala 1C:Enterprise için tam teşekküllü bir harici COM bileşeni geliştirmek istiyorsanız (ihtiyaç duyabileceğiniz seçeneklerden yalnızca birini düşünebilirim - bileşen 1C platformundaki sistemle aktif olarak etkileşime girebilir, koristuvachov'a haber verin, durum satırı, iletişim kutularını görüntüleme vb.), harici bileşenlerin teknolojisini hızlandırmak gerekir. Hadi bakalım.

  • öğretici

Girmek

Bu makale, 1C: Enterprise sistemindeki harici bileşenlerin çalışması hakkında bilgi sağlar.
Windows işletim sisteminin kontrolü altında çalışan 1C: Enterprise sistem sürüm 8.2'nin harici bileşenlerini geliştirme süreci, çalışmanın dosya sürümüyle gösterilecektir. Bu seçenek, küçük işletmelere uygun çoğu çözümde mevcuttur. VK, C++ programlamam kullanılarak uygulanacaktır.

"1C: Enterprise"ın harici bileşenleri

“1C: Enterprise” genişleyen bir sistemdir. Sistemin işlevsel yeteneklerini genişletmek için harici bileşenler (VC) kullanılır. Perakendeci açısından VK, gücü ve yöntemleri olan ve aynı zamanda 1C: Enterprise sistemi tarafından işlenmek üzere veri üretebilen harici bir nesnedir.
"1C: Girişimcilik" programını kullanarak uygulanması zor ve imkansız olan görevlerin kilidini açmak için harici bileşenler kullanılabilir. Sokrem, bu sınıfa, örneğin belirli ekipmanlarla çalışmak için işletim sistemiyle düşük seviyeli etkileşimler gerektiren işler getirilebilir.
“1C: Enterprise” sistemi, harici bileşenler tarafından oluşturulan iki teknolojiyi kullanır:
  • Wikoristannyam Yerel API'sinden
  • vikoristannym teknolojileri COM ile
Son derece önemli iki teknoloji arasındaki sınırları tanımlarken, VK'nın Native API ile geliştirilmesinde görülebileceği gibi fark önemsizdir. Gerekirse, uygulama VK'nın farklı bir COM teknolojisiyle geliştirilmesi için derlenebilir ve ayrıca küçük değişikliklerle, dosya modunda yönetilen diğer işletim seçenekleriyle 1C:Enterprise sisteminde kullanılmak üzere kaydedilebilir.
VK yapısı
1C: Enterprise temsil sisteminin DLL kütüphanesi biçimindeki harici bir bileşeni. Kütüphane kodu IComponentBase sınıfını açıklar. Oluşturulan sınıf, harici bileşenlerin işlevine karşılık gelen belirli yöntemlere sahip olabilir. Materyali yayınladığımda aşağıda daha ayrıntılı yöntemler anlatılacaktır.

Bir demo VK'nın başlatılması

Zavdannya:
  1. Vikonati, ITS aboneliğiyle birlikte gelen ve 1C'deki harici bileşenler mekanizmasının ana yeteneklerini göstermeyi amaçlayan katlanmış harici bileşenler
  2. Demo bileşenini 1C konfigürasyonuna bağlayın
  3. Bildirilen işlevlerin doğruluğunu kontrol edin
Derleme
VK demosu, "/VNCOMP82/example/NativeAPI" dizinindeki ITS abonelik diskine yüklenir.
Bir demo VK oluşturmak için Microsoft Visual Studio 2008'i kullanacağız. Bu ürünün diğer sürümleri, kullanılan Visual Studio projesinin formatını desteklememektedir.


AddInNative projesini başlatıyoruz. Bir proje kurarken, projenin derlenmesi için gerekli başlık dosyalarının bulunduğu bir dizine yer veririz. Kokuyu yıkamak için katalozdaki ITS diskinde bulunur /VNCOMP82/include.
Koleksiyonun sonucu bir dosyadır /bind/AddInNative.dll. Buna 1C konfigürasyonuna bağlantı için derlenmiş bir kütüphane dahildir.
1C yapılandırmasından önce VK bağlantıları
Boş konfigürasyon 1C ile oluşturulabilir.
Program modülünün kodu aşağıdadır.
değişken DemoComp; Prosedür OnEarthRobotSystem() Insert HariciComponent("...\bind\AddInNative.dll", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.AddInNativeExtension"); KinetsProsedürleri
1C yapılandırmasını başlatırken sıfırlamayla ilgili herhangi bir bildirim olmadığından VK başarıyla bağlandı.
Girilen kodun girilmesi sonucunda konfigürasyonun global görünürlüğü bir nesne olarak görünür DemoComp Harici bileşenlerin kodunda tanımlanan yöntemler ne kadar güçlü?
Gömülü işlevselliğin gösterimi
VK gösterisinin fizibilitesini kontrol edelim. Bunun için kurulum yapıp yetkililerin adımlarını okumayı deneyelim, VK yönteminin adımlarına tıklayıp ayrıca VK bildirimlerini iptal edip erişmeye çalışalım.
ITS diskinde sağlanan belgeler VK demosunun işlevselliğini belirtir:
  1. Bileşen nesnesinin tesis kontrolü
    Yöntem: bir ısırık al, Vimknuti
    Yetki: Dahil
  2. Kontrollü zamanlayıcı
    Bileşenin her saniyesi “1C: Enterprise” sisteminin parametrelerle bildirilmesiyle güçlendirilir Bileşen, Zamanlayıcı ve sistemik bir yaşındaki çocuğun doktorunun yanında.
    Yöntem: Başlatma Zamanlayıcısı, Durdurma Zamanlayıcısı
    Yetki: Ä Zamanlayıcı
  3. Yöntem Satır Durumunu Göster Yöntem tarafından parametre olarak iletilen satır durumundaki metni görüntüleyen
  4. Yöntem VantageResim. Atanan dosyadan görüntüleri yakalar ve çift veri biçiminde “1C: Enterprise” sistemine aktarır.
Bu işlevlerin kullanışlılığını yeniden değerlendiriyoruz. Saldırgan kod kimin hesabına yöneliktir:
değişken DemoComp; Prosedür AtStartRobotSystem()ConnectExternalComponent(...); DemoComp = Yeni("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Wimcnuti(); Göster (DemoComp.Enabled); DemoComp.Enable(); Göster (DemoComp.Enabled); DemoComp.StartTimer(); EndProceduresProcedureProcedureProcessExternalPod(Dzherelo, Podiya,Dani) Show(Dzherelo + " " + Podiya + " " +Dani); KinetsProsedürleri
Yapılandırmayı başlatmanın sonucu resimde gösterilmektedir


Puanlama yöntemlerinin sonuçları “Rapor” panelinde görüntülenir DemoComp.Wimcnuti()і Demo.Comp.Enable(). Aynı paneldeki sonraki satırlar, VK'dan alıntıların işlenmesinin sonuçlarını gösterecektir. Dzherelo, Podiaі Dani açıkça.

Daha fazla harici bileşen

Talep: Dış parçaların adını daha fazla değiştirin.
Önceki bölümün bir vikory kimliği var AddInNativeExtension, herhangi bir açıklama olmadan. Bu videoda AddInNativeExtension- bu ad genişletildi.
VK koduna atanmış bir yöntem var Uzantıyı Farklı Kaydet VK'nın sisteme daha fazla kaydedilmesi için gerekli olan isimleri 1C: Enterprise sistemine aktaran. Harici bileşenlerin özünü açıkça ortaya koyan bir tanımlayıcının belirtilmesi önerilir.
Yönteme yeni kod ekleyin Uzantıyı Farklı Kaydet Uzantının değişen adları nedeniyle:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; ((void**)wsExtensionName, iActualSize * sizeof (WCHAR_T)))::convToShortWchar(wsExtensionName, wsExtension, iActualSize); doğruyu döndür; ) false değerini döndür;
Seçilen uygulamanın VK adı şu şekilde değiştirildi: Bazı İsimler. VK'ya bağlıysanız yeni bir ad girmelisiniz:
DemoComp = Yeni("AddIn.DemoVK.SomeName");

VK yetkililerinin listesini genişletme

Zavdannya:
  1. VK yetkililerinin uygulanmasını düşünün
  2. Okuma ve yazma için mevcut olan sıradan tipe güç katın
  3. Sıradan tipe güç ekleyen kayıt, kalan kurulu gücün veri tipini kaydeden, okumaya hazır hale gelir. Gücün yerleşik değeriyle hiçbir eylem başarısızlıkla sonuçlanmayacak

Oluşturulan bileşenin gücünü kontrol etmek için geliştiricinin AddInNative.cpp kitaplık kodunda aşağıdaki yöntemleri uygulaması gerekir:
NProps'u edinin
Bu genişletmenin güç sayısını, güç sayısı için 0 olarak döndürür
FindProp
Parametrelerde adı iletilen yetkilinin seri numarasını çevirir
GetPropName
Yetkilinin adını seri numarasına ve iletilen film tanımlayıcısına göre döndürür
GetPropVal
Güç değerlerini atanan sıra numarasından döndürür
SetPropVal
Belirlenen sıra numarasından güç değerini ayarlar
IsPropReadable
Teğmen, belirlenmiş bir seri numarasından güç okuma olasılığının işaretini döndürür
IsPropYazılabilir
Belirlenen seri numarasından güç kaydetme olasılığının sancağını döndürür


Sınıfa enjekte etme yöntemlerinin uygulanmasına bir göz atalım CADdInNative.
Gösteri VK'nın 2 gücü vardır: Dahilі Ä Zamanlayıcı (Etkinі IsTimerPresent).
Kütüphane kodunun genel kapsamına atanmış iki dizi vardır:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Devre Dışı", L"Zamanlayıcı");
yetkililerin Rusça ve İngilizce adlarını koruyanlar. Başlık dosyasında AddInNative.h aşırı sigorta belirtilir:
enum Props(ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Her zaman son);
ePropIsEtkinі ePropIsTimerPresent 0 ve 1 değerleri kesinlikle otoritelerin sıra sayılarını tanımlayıcının anlamı ile değiştirmek için kullanılabilir. 2 değerine sahip ePropLast, bir dizi otoriteyi kaldırmak için kullanılır (GetNProps yöntemini kullanarak). Bu adlar yalnızca bileşen kodunun ve kullanılamayan çağrıların ortasında listelenir.
FindProp ve GetPropName yöntemleri dizileri arar g_PropAdlarıі g_PropNamesRu.
Kütüphane modülündeki alanların değerlerini kaydetmek için CAddInNative sınıfı, bileşenlerin güç değerlerini kaydeden güç değerlerine sahiptir. Yöntemler GetPropValі SetPropVal Bu otoritelerin rotasyona tabi tutulması ve öneminin belirlenmesi açıktır.
Yöntemler IsPropReadableі IsPropYazılabilir ve döndür doğru ya da başka YANLIŞ, iletilen güç seri numarasından dikkatli bir şekilde programın mantığı ile tutarlıdır.
Yeterli gücü eklemek için şunları yapmak gerekir:

  1. Masifte mevcut olanı yetkililere ekleyin g_PropAdlarıі g_PropNamesRu(dosya AddInNative.cpp)
  2. Perelik'te Sahne donanımı(dosya AddInNative.h) önce ePropLast Yetkilileri, neyin gerekli olduğunu açıkça tanımlayan bir şey ekleyin
  3. Yetkililerin değerlerini kaydetmek için belleği düzenleyin (bileşen modülünde belirli değerleri kaydeden alanlar ekleyin)
  4. Yöntemlerde değişiklik yapın GetPropValі SetPropValön tarafta görülen hafızayla etkileşime geçmek
  5. Programın mantığını yöntemlere göre değiştirmek önemlidir IsPropReadableі IsPropYazılabilir
1, 2, 5. maddeler açıklama gerektirmez. Bu şartların uygulanmasına ilişkin ayrıntılara istatistik eki okunarak ulaşılabilir.
Damo test yetkililerini aradı Ölçekі Türü Ters Çevirme açıkça. Bu nedenle, aşağıdaki 1. paragrafın bir sonucu olarak:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Eklendi", L"Zamanlayıcı", L"Test", L"TypeCheck");
Perelik Sahne donanımı Matime Viglyad:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Her zaman son);
Kodun anlamlı basitliği için STL C++ kullanın. Zokrema, sıra halindeki robotlar için WCHAR, kütüphaneyi bağlayın ip.
Yöntemin değerini kaydetmek için Ölçek, sınıfta önemli CADdInNative görünürlük alanındaki özel alanda:
dizi testi1;
Satır parametrelerini “1C:Enterprise” ile harici bileşen arasında aktarmak için “1C:Enterprise” bellek yöneticisi kullanılır. Gelin raporuna bir göz atalım. Belleği görüntülemek ve kaydetmek için aşağıdaki işlevleri kullanın: AllocBellekі Boş hafıza, dosyaya atandı ImemoryManager.h. 1C: Girişimcilik sistemine bir satır parametresinin aktarılması gerekiyorsa, harici bileşen, fonksiyona tıklanarak altındaki hafızayı görebilir. AllocBellek. Prototip şuna benziyor:
sanal bool ADDIN_API AllocMemory (void** pMemory, imzasız uzun ulCountByte) = 0;
de pBellek- görünür bellek bloğunun adresini içerecek olan yatırıcının adresi,
ulCountByte- Görünen hafıza kutusunun boyutu.
Art arda bir hafıza görünümü örneği:
WCHAR_T * t1 = NULL, * test = L "TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Satır veri türleriyle çalışmayı kolaylaştırmak için işlevi açıklıyoruz wstring_to_p. Vaughn wstring-row parametresini kaldırır. Fonksiyonun sonucu yapıyı doldurmaktır tVaryant. İşlev kodu:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T));memcpy(t1, str.c_str(), (str.length()+1) * sizeof(WCHAR_T));val -> pstrVal = t1;val -> strLen = str.length(); doğruyu döndür;
Bu aynı zamanda yönteme ilişkin switch ifadesinin durum bölümüdür. GetPropVal Göreceğiz:
case ePropTest1: wstring_to_p(test1, pvarPropVal); kırmak;
Yöntem SetPropVal:
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) false değerini döndürürse; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); kırmak;
Diğer yetkilerin uygulanması için sınıf alanı önemlidir CaddInNative
uint8_t son_tip;
Bu durumda kalan aktarılan değerin türü kaydedilir. CaddInNative::SetPropVal yöntemini kullanmak için aşağıdaki komutu ekleyin:
son_tip = TV_VT(varPropVal);
Şimdi başka bir kuvvetin okuma değerini yazdığınızda değeri döndüreceksiniz son_tip, Amaçlanan görev neyi temsil ediyor?
Değişikliklerin uygulanabilirliğini kontrol edelim.
Bu amaçla mevcut 1C konfigürasyonunu şu şekilde gösterelim:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Show(Row(DemoComp.CheckType)); DemoComp.Test = "Vasya"; Show(Row(DemoComp.Test)); DemoComp.Test = "Petya"; Show(Row(DemoComp.Test)); Show(Row(DemoComp.CheckType)); KinetsProsedürleri
Sonuç olarak, lansmana aşağıdaki mesaj dizisi verilir:
3
Vasya
Petrol
22

Diğer üçüncü bilgi ise ilk etapta kurulan iktidar okumasının sonucudur. Yapılacak ilk şey, kalan yerleşik güç türünden intikam almaktır. 3 tam değere, 22 ise satır değerine karşılık gelir. Türlerin çeşitliliği ve kodları dosyaya yüklenir türleri.h ITS diskinde bulunan .

Genişletilmiş yöntem listesi

Zavdannya:
  1. Harici bileşenlerin işlevselliğini ek işlevlerle genişletin:
  2. Yöntemlerin harici bileşenlerde nasıl uygulanacağını öğrenin
  3. Bir işlev yöntemi ekleyin İşlev1 parametre iki satır aldığından (“Parametre1” ve “Parametre2”). Sonuç olarak satır şu şekilde olur: “Yeniden doğrulama. Parametre1, Parametre2"
  4. Bu değişikliklerin kullanışlılığına dönüştürün

Oluşturulan bileşenin yöntemlerini uygulamak için geliştiricinin bu tür yöntemleri AddInNative kitaplık kodunda uygulaması gerekir:
NMethods'u Alın, Bulma Yöntemi, GetMethodName
Yöntemin numarasını ve adını arayarak en fazla sayıda yöntemi seçmek için tasarlanmıştır. Yetkililer için benzer yöntemlere benzer
NParams'ı edinin
Yöntemin parametre sayısını atanan seri numarasından döndürür; Böyle bir sayıya sahip bir yöntem günlükse veya parametreleri yoksa 0 döndürün
GetParamDefValue
Belirtilen yöntemin girilen parametresinin değerini döndürür
HasRetVal
Döndürülecek değerin belirtilen sıra numarasına sahip bir yöntemin görünürlük sırasını döndürür: döndürülen değerlere sahip yöntemler için true YANLIŞ başka bir durumda
CallAsProc
YANLIŞ 1C modülü: İşletmeler'in uygulandığı saatin insafından kaynaklanmaktadır. Bir dizi parametrenin belleği 1C: Enterprise'da görünür ve mevcuttur.
CallAsFunc
Yöntem, atanan seri numarasıyla tanımlanır. Yöntem dönüyor YANLIŞ 1C modülü: İşletmeler'in uygulandığı saatin insafından kaynaklanmaktadır. Bir dizi otoritenin hafızası 1C: Enterprise olarak görülüyor. Döndürülen değer satır veya double veri tipi olduğundan bileşen hafıza fonksiyonunu görür. AllocBellek Bellek yöneticisi verileri buraya yazar ve bu adresi yapının özel bir alanına kaydeder. 1C: Enterprise bu belleği tıklatarak almak için Boş hafıza.
ITS diskinde sağlanan belgelerdeki parametreler listesi ve rapor açıklamaları da dahil olmak üzere yöntemlerin tam açıklaması.
Açıklanan yöntemlerin uygulanmasına bakalım.
Bileşen kodunda iki dizi vardır:
static wchar_t *g_MethodNames = (L"Etkinleştir", L"Devre Dışı Bırak", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Aç", L"Vimknuti", L"RowStatus'ta Göster", L"StartTimer", L"StopTimer", L"EnterBaby");
o aşırı tepki:
enum Yöntemleri (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Her zaman son);
Koku vikorystvuyutsya fonksiyonlarıdır NMethods'u Alın, Bulma Yöntemiі GetMethodName, Yetkililerin açıklamasına benzetilerek.
Yöntemler NParams'ı edinin, GetParamDefValue, HasRetVal Bir anahtarı uygulamak için parametrelerin ve program mantığının gerekli değerleri döndürecek şekilde aktarılması önemlidir. Yöntem HasRetVal Kodunuzda ayrıca sonucu döndürebilecek yöntemlerin bir listesi de bulunur. Onlar için şarap dönüyor doğru. Tüm çelik yöntemleri için döndürün YANLIŞ.
Yöntemler CallAsProcі CallAsFunc Yanlış kod yönteminden intikam alın.
İşlev olarak çağrılabilecek bir yöntem eklemek için harici bileşenin çıkış kodunda değişiklik yapmanız gerekir:
  1. Dizilere yöntem adları ekleme g_MethodNamesі g_MethodNamesRu(dosya AddInNative.cpp)
  2. Yöntemleri aktarmadan önce yönteme tanımlayıcı hakkındaki bilgileri ekleyin (dosya AddInNative.h)
  3. İşlev kodunda değişiklik yapma NParams'ı edinin Programın mantığına bağlı
  4. Gerekirse yöntem kodunda değişiklik yapın GetParamDefValue Yöntemin parametrelerinin arkasındaki değerleri anlamanız gerekiyorsa.
  5. İşlevde değişiklik yapma HasRetVal
  6. Robot fonksiyonlarının mantığında değişiklik yapın CallAsProc ya da başka CallAsFunc doğrudan bağlı olan yöntemin kodunu oraya yerleştirerek.
Yol Gösterici Masivi g_MethodNamesі g_MethodNamesRu ve aşırı maruz kalma Yöntemlerşunu görene kadar:
static wchar_t *g_MethodNames = (L"Etkinleştir", L"Devre Dışı Bırak", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Etkinleştir", L"Vimknuti", L"ShowInRowStatus", L"StartTimer", L"StopTimer", L"ZavantazhitiMalyunok", L"Test");

Numaralandırma Yöntemleri (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Her zaman son);
Seçilebilir fonksiyon NProps'u edinin“Test” yöntemindeki parametre sayısını değiştirmek için:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: dönüş 1; case eMethLoadPicture: dönüş 1; case eMethTest: dönüş 2; varsayılan :)
Lütfen fonksiyonda değişiklik yapın:
Bool Caddinnative :: getparamdefvalue (Consta Long Lmethodnum, Cost Long lparamnum, TVariant *pvarparamdefvalue (tv_vt (PvarparamDeFvalue) = VTYPE_EMPTY; SWITCH (LMETHODN UM) Statusline: Case EmetHstarttimer: Case EmetHstopoptimer: Case Emmethtest: / / / Parametre Değeri Yok​​ varsayılan olarak break; varsayılan: false değerini döndür;) false değerini döndür;
Verilen satıra Zavdyaki
vaka eMethTest:
Bir veya daha fazla argüman varsa karşılık gelen parametreler boş değerlere sahip olacaktır ( VTYPE_EMPTY). Parametreyi bölümde belirttikten sonra ayarlarının girilmesi gerekmektedir. eMethTest anahtar işlev bildirimi CAddInNative::GetParamDefValue.
“Test” yöntemi değerleri döndürebildiğinden fonksiyon kodunda değişiklik yapmanız gerekir. HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) return false; )
Kodu yönteme ve işleve ekliyorum CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(LoMethodNum) ( case eMeMe if (!lSizeArray || !paParams) return false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; break;) return ret;
Bileşeni derleyelim ve yapılandırma kodunu şu şekilde görünecek şekilde ayarlayalım:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); şerit = DemoComp.Test ("Merhaba," "Işık!"); Povidomite(trans); KinetsProsedürleri
Yapılandırmayı başlattıktan sonra, yöntemin başarıyla tamamlandığını onaylamak için bir bildirim görünür: "Merhaba Işık!".

Zamanlayıcı

Zavdannya:
  1. Zamanlayıcının uygulamasını VK demosundan okuyun
  2. "StartTimer" yöntemini değiştirerek parametrelere zamanlayıcı istek aralığını (milisaniye cinsinden) aktarma özelliğini ekleyin.
  3. Bu değişikliklerin kullanışlılığına dönüştürün

Robotlar için WinAPI, bir saat içinde hızlı bir şekilde bildirim almanızı sağlar WM_TIMER. Zamanlayıcı için ayarladığınız saat aralığından sonra programınızın sona ereceğini lütfen unutmayın.
Bir zamanlayıcı oluşturmak için aşağıdaki işlev kullanılır: Zamanlayıcıyı Kur:
UINT SetTimer(HWND hWnd, // pencere açıklaması UINT nIDevent, // zamanlayıcı kimliği (sayı) UINT nElapse, // gecikme TIMERPROC lpTimerFunc); // fonksiyonun göstergesi
Daha fazla bilgi için işletim sistemi WM_TIMER Programa aralıklarla bir argüman atarız nGeçme(Milisaniye cinsinden). Kalan parametrede, cilt zamanlayıcı etkinleştirildiğinde devre dışı bırakılabilecek bir işlevi belirleyebilirsiniz. Bu fonksiyonun başlığı şu şekilde görünebilir (şunun gibi bir şey olabilir):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Zamanlayıcının VK demosundaki uygulamasına bakalım.
Dolayısıyla, Windows işletim sistemi için harici bileşenlerin geliştirilmesi sürecine baktığımızda, zamanlayıcının diğer işletim sistemlerinde uygulanmasına bakmıyoruz. Kısaca GNU/Linux işletim sistemi için uygulama, işlevin sözdizimine göre değişiklik gösterecektir. Zamanlayıcıyı Kurі ZamanlayıcıProc.
Aşağıdaki kod bir yöntemle çağrılır Zamanlayıcıyı Kur fonksiyon aktarılana kadar MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Oluşturulan zamanlayıcının kimliği menüde bulunur m_uiTimer Böylece açabilirsiniz.
İşlev MyTimerProc gelecek sıraya bakar:
VOID CALLBACK MyTimerProc(HWND hwnd, // zamanlayıcı mesajları için pencere tanıtıcısı UINT uMsg, // WM_TIMER mesajı UINT idEvent, // zamanlayıcı tanımlayıcısı DWORD dwTime // mevcut sistem zamanı) ( if (!pAsyncEvent) return; w "ComponentNative", *what = L"Timer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); , ne, wstime); delete wstime; ))
Fonksiyonun özü bir metodu çağırmasıdır Harici Olay 1C: Enterprise sistemine yapılan bildirimin izin verdiği şey.
Yöntemin işlevselliğini genişletmek için Başlatma Zamanlayıcısı Aşağıdakileri deneyelim:
Yöntem kodunu değiştirme NParams'ı edinin yani yöntem için eMethStartTimer dönüş değeri 1:
case eMethStartTimer: dönüş 1;
Kodu yönteme yönlendirelim CallAsProcşunu görene kadar:
case eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
Şimdi önceliği kontrol edelim. Bunun için konfigürasyon eklenti modülüne aşağıdaki kodu yazacağız:
değişken DemoComp; RobotSystem() Başlatılırken Yapılacak Prosedür ConnectNativeComponent("...", "DemoVK", HariciComponentType.Native); DemoComp = Yeni("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); KinetsProsedürleri
Konfigürasyon başladıktan sonra program öncesinde 2 saniye aralıklarla bir bildirim gelmelidir, bu da zamanlayıcının doğru çalıştığı anlamına gelir.

1C: Enterprise sistemi ile etkileşim

Harici bileşen ile 1C: Enterprise sistemi arasındaki etkileşim için, dosyada açıklanan IAddInDefBase sınıfının yöntemleri kullanılır. AddInDefBase.h. En sık suistimal edilenler ise şöyle yorumlanıyor:
Grevle ilgili bildirimin oluşturulması
sanal bool ADDIN_API AddError(imzasız kısa wcode, const WCHAR_T* kaynağı, const WCHAR_T* tanım, uzun kod)
wcode, kod- derleme kodları (açıklamalı derleme kodlarının bir listesi ITS diskinde bulunabilir)
kaynak- dzherelo af
tanım- Değişikliklerin açıklaması
“1C: Girişimcilik” sisteminin geliştirilmiş bildirimi
sanal bool ADDIN_API HariciEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszKaynak- Dzherelo notu
wszMesajı- Duyuru metni
wszVerileri- veri aktarımı
Yeniden maruz kalma, Dış Toprağın İşlenmesi prosedürü ile gerçekleştirilir.
Harici bileşenlerin 1C: Enterprise sistemine kaydedilmesi
sanal bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfilAdı- Ben bileşenim.
Bu yöntemler VK ve 1C arasında yeterli etkileşimi sağlar. 1C: Enterprise sisteminin harici bileşeninden veri çıkarmak için, harici bileşen 1C sisteminin nasıl yönetileceğine ilişkin özel bilgiler gönderir ve gerekirse ağ geçidi veri aktarımı için harici yöntemleri yeni bileşenler olarak çağırır.

Veri türü tVariant

Harici bir bileşen ile 1C: Enterprise sistemi arasında veri alışverişi yaparken tVariant veri türü seçilir. ITS diskinde bulunabilen type.h dosyasının açıklamaları şunlardır:
struct _tVariant ( _ANONYMOUS_UNION union ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint8_t ui8Val; int64_t ullVal; int32_t er rCode; long h Res; float fltVal; double dblVal; bool bVal; char chVal; wchar_t wchVal; DATE tarih; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; al;uint32_t strLen ; //bayt sayısı ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct ( WCHAR_T* pwstrVal; uint32_t wstrLen; / / sembol sayısı ) pvarVal TYPEVAR vt'deki boyutlu dizi;);
Tip tVaryant aşağıdakileri içeren bir yapıdır:
  • sumish (birleşim), verileri kaydetmek için ortada tanınır
  • Veri türü tanımlayıcı
Değişken tipte zagalnym tipi bir robotta tVaryant Yaklaşan algoritmayı takip edin:
  1. Değişiklikle birlikte halihazırda saklanan veri türüne göre
  2. Verilere anında erişim için sumisha'nın görünen alanına doğru kaydırın
Vikoristannya tipi tVaryant 1C: Enterprise sistemi ile harici bileşenler arasındaki etkileşimi önemli ölçüde basitleştirecek

ek

İstatistiklere izmarit yerleştirmek için örnekler kataloğu
örnekler/1 - demo bileşenini başlatın
örnekler/2 - yetkililer listesinin genişletilmesinin gösterimi
örnekler/3 - genişletilmiş yöntem listesinin gösterimi
Kozhen kataloğu, VS 2008 projesi ve hazır 1C konfigürasyonu.

Bu makale, harici bileşenlerin çalışmasına ve bunların bağlantılarına ayrılmıştır. Şu anda, 1C Enterprise'ın yeteneklerini genişletmek için iki harici bileşen teknolojisi kullanılıyor:

  • 1 Daha fazla yardım için Yerel API
  • 2 WIKORISTANNAM TEKNOLOJİ COM
Bu yazımda Native API bileşenleri ile yapılan çalışmalara değinmek istiyorum.
O halde basitten karmaşığa doğru başlayalım:
Vityag z ITS

1. VK'nın diske kurulu olması kabul edilebilir:

"Tovstoy Müşterisine (olağanüstü ekleme)" bölümünde Mozhlive vikoristannya;

Bu, Native bileşene sahip en basit robot poposudur. Lütfen bu bileşenin sistemden kayıt gerektirmediğini ve bunun da yönetimi önemli ölçüde kolaylaştıracağını unutmayın.

2. Gördüğünüz popo gerçekçi değil. Çoğu zaman bileşenler düzende yeniden düzenlenir. Düzen, zip arşivlerinin bileşen dosyaları ve MANIFEST.xml dosyasıyla yanlış yerleştirilmesinden suçludur
Manifest dosyası örneği:

3. İnce ve web istemcide çalışırken basit bir yöntemdir.
ITS'den alıntı:

açıklama:
%APPDATA%\1C\1Cv82\ExtCompT- Kalın ve İnce istemcilere yönelik bileşenlerin kurulmasına yönelik dizin.
%APPDATA%\Roaming\Mozilla\Uzantılar- Mozilla FF/ için dizin (versiyonum) uzantısı
Vikoristik yöntemle HariciComponent()'ı yükleyin, müşteriye bağlı olarak ilgili kataloğun paketlenmemiş uzantıları olacaktır.

Harici bir bileşenin takılmasına ilişkin prosedür örneği:

Harici Bileşeni Yükle- bileşenin kurulu sürümünün güncellenmesi gerekiyorsa, yöntem yalnızca bileşenin ilk kurulumundan sonra kullanılmalıdır.

Hem ince hem de kalın istemci için:
Harici bileşenlerin kurulum işlemini benzer bir yöntemle yeniden yürütmek yeterlidir. Harici Bileşeni Yükle().

Bileşeni güncellemek için web istemcisi seçeneği:

  • Web tarayıcı eklentileri (Mozilla FF) ile eklentiyi robot üzerinden kaldırmak gerekmektedir.
  • Kısayol yöntemini kullanma Harici Bileşeni Yükle
VK'ya bağlanmak için aşağıdaki prosedürü kullanabilirsiniz:

Bileşen kurulmamışsa, o zaman suçlama olacaktır.

2. Bir bileşenin zamana duyarlı bir montajdan (harici cihaz reddetme dosyası, harici işleme) kurulmasının gerekli olduğu durumlar vardır; bu durumda ilk parametrelerin, Harici Bileşeni Bağla ve Harici Bileşeni Yükle yönteminde ayarlanması gerekir. Toplantı sırasında arşivleyin. Robotun kudretli kıçını aşağıya doğrultacağım:

&OnClients Adresleri Bileşen Arşivine Aktarır; &OnClients Değişken Bileşeni; &İstemci Prosedüründe OnVidkritti(Vidmova) //adresler, bir satır yerleştirin (gezinme, //saat-saat yakınsamasında çift veri zip arşivine gönderilir) EndProcedures //OnOnVidkritti() &Sunucuda //Pi yöntemleri Harici Bileşeni etkinleştirir, Ayarla Harici Bileşen, // "gezinme postası" biçimindeki ilk satır parametresi olarak kabul edilebilir // (harici bileşenin URL'si, ZIP arşivinde paketlenmiş, biçiminde). Function RetrieveAddressArchiveHourlyArchive()ProcessingObject = FormValueProperties("ProcessingObject"); PostingOnArchives = PlaceInHomeStorm(ProfileObject.OutlayLayout("MIKO_phone_IP"), Yeni Benzersiz Tanımlayıcı); Arşivlere Dönüş; EndFunctions // ArchiveHourlyConvergence() Adresini Alın &OnClient // Bileşen henüz kurulmamışsa prosedür yalnızca bir kez çağrılmalıdır // veya güncellenmiş bir Prosedür gerektirir Bileşen Kurulumu (Komut) Harici yuComponent Kurulumunu Deneyin(AddressArres) Vinyatok Show("Harici bileşen kurulamadı."); KinetsProby; Prosedürün Sonu // Component() &OnClient Kurulumu // bir bileşenin başlatılması için ana prosedür Prosedür Başlatma (Komut) Harici Bileşeni Bağlamayı Deneyin (Arşiv Bileşen Adresi, "Comp", Harici Bileşenleri Yazın. Bileşen = Yeni (AddIn.Comp.MIKO_phone_IP) ; Announcement("Başlatma. Muhtemelen bileşen Henüz bir açıklama yok."); KіnetsProby; KіnetsProcedures