Kuandika vipengele asili 1c kwenye c. Teknolojia ya sehemu ya nje (). Vipengele vya nje "1C: Enterprise"

ansmirnov Agosti 22, 2013 saa 2:12 jioni

Vipengele vya nje katika 1C 8.2

  • Kupanga programu,
  • C++
  • Mafunzo

Utangulizi

Nakala hii inatoa wazo la jinsi vifaa vya nje hufanya kazi katika 1C: Mfumo wa Biashara.
Mchakato wa kutengeneza kipengee cha nje cha 1C: Toleo la mfumo wa Enterprise 8.2, unaoendesha chini ya Windows OS yenye hali ya uendeshaji ya faili, itaonyeshwa. Chaguo hili hutumiwa katika suluhisho nyingi iliyoundwa kwa biashara ndogo ndogo. VK itatekelezwa katika lugha ya programu ya C++.

Vipengele vya nje "1C: Enterprise"

"1C: Enterprise" ni mfumo unaopanuliwa. Ili kupanua utendaji wa mfumo, vipengele vya nje (EC) hutumiwa. Kutoka kwa mtazamo wa msanidi programu, VC ni kitu cha nje ambacho kina mali na mbinu, na pia inaweza kuzalisha matukio ya usindikaji na 1C: Mfumo wa Biashara.
Vipengele vya nje vinaweza kutumika kutatua darasa la matatizo ambayo ni vigumu au hata haiwezekani kutekeleza katika lugha ya programu iliyojengwa katika 1C: Enterprise. Hasa, darasa hili linajumuisha kazi zinazohitaji mwingiliano wa kiwango cha chini na mfumo wa uendeshaji, kwa mfano, kufanya kazi na vifaa maalum.
1C: Mfumo wa Biashara hutumia teknolojia mbili kuunda vifaa vya nje:
  • kwa kutumia Native API
  • kwa kutumia teknolojia ya COM
Kwa kuzingatia vikwazo vilivyotolewa, tofauti kati ya teknolojia mbili zilizotajwa hapo juu ni ndogo, kwa hivyo tutazingatia uundaji wa michezo ya video kwa kutumia API ya Asili. Ikiwa ni lazima, maendeleo yaliyotekelezwa yanaweza kutumika kwa maendeleo ya programu ya kompyuta kwa kutumia teknolojia ya COM, na pia, pamoja na marekebisho madogo, kutumika kwa ajili ya matumizi katika 1C: Mfumo wa Biashara na chaguzi nyingine za uendeshaji isipokuwa mode ya uendeshaji wa faili.
Muundo wa VK
Sehemu ya nje ya 1C: Mfumo wa Biashara unawasilishwa kwa namna ya maktaba ya DLL. Nambari ya maktaba inaelezea darasa la kizazi IComponentBase. Darasa lililoundwa lazima lifafanue njia zinazohusika na utekelezaji wa kazi za sehemu ya nje. Mbinu zilizobatilishwa zitaelezewa kwa undani zaidi hapa chini kama nyenzo zinavyowasilishwa.

Kuzindua onyesho la VK

Kazi:
  1. Kusanya kijenzi cha nje kilichotolewa na usajili wa ITS na kinachokusudiwa kuonyesha uwezo mkuu wa utaratibu wa sehemu ya nje katika 1C.
  2. Unganisha kijenzi cha onyesho kwenye usanidi wa 1C
  3. Hakikisha vipengele vilivyotangazwa vinafanya kazi ipasavyo
Mkusanyiko
Onyesho la VK liko kwenye diski ya usajili ya ITS kwenye saraka ya "/ VNCOMP82/example/NativeAPI".
Ili kuunda onyesho la VC tutatumia Microsoft Visual Studio 2008. Matoleo mengine ya bidhaa hii hayatumii umbizo la mradi wa Visual Studio linalotumika.


Fungua mradi wa AddInNative. Katika mipangilio ya mradi, tunajumuisha saraka na faili za kichwa zinazohitajika ili kujenga mradi. Kwa msingi, ziko kwenye diski ya ITS kwenye saraka /VNCOMP82/pamoja na.
Matokeo ya ujenzi ni faili /bind/AddInNative.dll. Hii ni maktaba iliyokusanywa kwa ajili ya kuunganisha kwa usanidi wa 1C.
Kuunganisha VK kwa usanidi wa 1C
Wacha tuunde usanidi tupu wa 1C.
Ifuatayo ni msimbo wa moduli ya programu inayosimamiwa.
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...\bind\AddInNative.dll", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.AddInNativeExtension"); Mwisho wa Utaratibu
Ikiwa hakuna kosa lililoripotiwa wakati wa kuanzisha usanidi wa 1C, basi VK iliunganishwa kwa ufanisi.
Kama matokeo ya kutekeleza nambari iliyo hapo juu, kitu kinaonekana katika mwonekano wa kimataifa wa usanidi DemoComp, ambayo ina mali na mbinu ambazo zinafafanuliwa katika kanuni ya sehemu ya nje.
Onyesho la utendaji uliojengwa ndani
Wacha tuangalie utendaji wa onyesho la VK. Ili kufanya hivyo, hebu jaribu kuweka na kusoma baadhi ya mali, piga baadhi ya mbinu za VK, na pia kupokea na kusindika ujumbe wa VK.
Nyaraka zinazotolewa kwenye diski ya ITS zinasema utendaji ufuatao wa onyesho la VC:
  1. Kusimamia Hali ya Kitu cha Kipengee
    Mbinu: Washa, Zima
    Sifa: Imejumuishwa
  2. Usimamizi wa saa
    Kila sekunde sehemu hutuma ujumbe kwa 1C: Mfumo wa Biashara na vigezo Sehemu, Kipima muda na mstari wa kukabiliana na saa ya mfumo.
    Mbinu: StartTimer, StopTimer
    Sifa: Kuna Kipima Muda
  3. Njia ShowInStatusLine, ambayo huonyesha maandishi yaliyopitishwa kwa njia kama vigezo kwenye upau wa hali
  4. Njia PakiaPicha. Hupakia picha kutoka kwa faili iliyobainishwa na kuihamisha hadi 1C: Mfumo wa Biashara katika mfumo wa data binary.
Hebu tuhakikishe kwamba vipengele hivi vinafanya kazi. Ili kufanya hivyo, endesha nambari ifuatayo:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() UnganishaExternalComponent(...); DemoComp = Mpya("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Zimaza(); Ripoti(DemoComp.Enabled); DemoComp.Wezesha(); Ripoti(DemoComp.Enabled); DemoComp.StartTimer(); Mwisho wa Utaratibu wa Utaratibu Usindikaji wa Tukio la Nje(Chanzo, Tukio, Data) Ripoti(Chanzo + "" + Tukio + "" + Data); Mwisho wa Utaratibu
Matokeo ya kuendesha usanidi yanaonyeshwa kwenye picha


Paneli ya "Ujumbe" huonyesha matokeo ya simu za mbinu DemoComp.Disable() Na Onyesho.Comp.Wezesha(). Mistari inayofuata kwenye jopo moja ina matokeo ya usindikaji wa ujumbe uliopokelewa kutoka kwa VK - Chanzo, Tukio Na Data kwa mtiririko huo.

Jina maalum la kijenzi cha nje

Kazi: Badilisha jina la kijenzi cha nje kuwa cha kiholela.
Sehemu iliyotangulia ilitumia kitambulisho AddInNativeExtension, maana yake haikufafanuliwa. Kwa kesi hii AddInNativeExtension- hili ndilo jina la ugani.
Nambari ya VK inafafanua njia RegisterExtensionAs, kurudisha jina kwa 1C: Mfumo wa Biashara, ambayo ni muhimu kwa usajili unaofuata wa VK kwenye mfumo. Inashauriwa kutaja kitambulisho ambacho kwa kiasi fulani kinaonyesha kiini cha sehemu ya nje.
Hapa kuna nambari kamili ya njia RegisterExtensionAs na jina la kiendelezi limebadilishwa:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; ikiwa (m_illory-Memory_Memory> ((batili**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); rudisha kweli; ) rudisha sivyo; )
Katika mfano uliopewa, jina la VK linabadilishwa kuwa Jina Fulani. Kisha wakati wa kuunganisha VK lazima ueleze jina jipya:
DemoComp = Mpya("AddIn.DemoVK.SomeName");

Kupanua orodha ya mali ya VK

Kazi:
  1. Soma utekelezaji wa mali za VK
  2. Ongeza sifa ya kusoma/kuandika ya aina ya mfuatano
  3. Ongeza kipengele cha kusoma/kuandika ambacho huhifadhi aina ya data ya seti ya mali ya mwisho. Hakuna hatua inayochukuliwa wakati wa kuweka thamani ya mali

Ili kubainisha sifa za kijenzi kinachoundwa, msanidi lazima atekeleze mbinu zifuatazo katika msimbo wa maktaba ya AddInNative.cpp:
GetNProps
Hurejesha idadi ya sifa za kiendelezi hiki, 0 ikiwa hakuna sifa
FindProp
Hurejesha nambari ya ufuatiliaji ya sifa ambayo jina lake limepitishwa katika vigezo
GetPropName
Hurejesha jina la sifa kwa nambari yake ya mfululizo na kwa kitambulisho cha lugha iliyopitishwa
GetPropVal
Hurejesha thamani ya mali pamoja na nambari maalum iliyobainishwa
SetPropVal
Huweka thamani ya mali na nambari maalum ya ordinal
IsPropReadable
Hurejesha alama ya kusomeka ya sifa iliyo na nambari ya mfuatano iliyobainishwa
IsPropWritable
Hurejesha bendera ya uandikaji ya sifa iliyo na nambari ya mfuatano iliyobainishwa


Hebu fikiria utekelezaji wa mbinu za darasa hapo juu CAddInNative.
Katika onyesho la VC, mali 2 zimefafanuliwa: Imejumuishwa Na Kuna Kipima Muda (Imewezeshwa Na IsTimerPresent).
Katika wigo wa kimataifa wa nambari ya maktaba, safu mbili zimefafanuliwa:
tuli wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); tuli wchar_t *g_PropNamesRu = (L"Imewezeshwa", L"Kuna Kipima Muda");
ambayo huhifadhi majina ya mali ya Kirusi na Kiingereza. Katika faili ya kichwa AddInNative.h hesabu imefafanuliwa:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Daima mwisho);
ePropIsEnabled Na ePropIsTimerPresent, mtawalia kuwa na thamani 0 na 1, hutumiwa kuchukua nafasi ya nambari za mfululizo za sifa na vitambulishi vya maana. ePropLast, ambayo ina thamani ya 2, inatumika kupata idadi ya sifa (kwa kutumia mbinu ya GetNProps). Majina haya hutumiwa tu ndani ya msimbo wa sehemu na haipatikani kutoka nje.
Njia za FindProp na GetPropName hufanya utafutaji wa safu g_PropNames Na g_PropNamesRu.
Ili kuhifadhi maadili ya sehemu kwenye moduli ya maktaba, darasa la CAddInNative lina mali zinazohifadhi thamani ya vipengele vya sehemu. Mbinu GetPropVal Na SetPropVal rudisha na uweke thamani ya mali hizi ipasavyo.
Mbinu IsPropReadable Na IsPropWritable na kurudi kweli au uongo, kulingana na nambari ya ordinal iliyopitishwa ya mali kwa mujibu wa mantiki ya maombi.
Ili kuongeza mali maalum unahitaji:

  1. Ongeza jina la mali inayoongezwa kwenye safu g_PropNames Na g_PropNamesRu(faili AddInNative.cpp)
  2. Kuorodhesha Props(faili AddInNative.h) kabla ePropLast ongeza jina ambalo linatambulisha kipekee mali inayoongezwa
  3. Panga kumbukumbu ya kuhifadhi maadili ya mali (unda sehemu za sehemu za moduli zinazohifadhi maadili yanayolingana)
  4. Fanya mabadiliko kwa mbinu GetPropVal Na SetPropVal kuingiliana na kumbukumbu iliyotengwa katika hatua ya awali
  5. Kwa mujibu wa mantiki ya maombi, fanya mabadiliko kwa mbinu IsPropReadable Na IsPropWritable
Pointi 1, 2, 5 hazihitaji maelezo. Maelezo ya utekelezaji wa hatua hizi yanaweza kupatikana kwa kujifunza kiambatisho cha makala.
Wacha tupe majina kwa sifa za mtihani Mtihani Na Aina ya Angalia kwa mtiririko huo. Kisha, kama matokeo ya hatua ya 1, tunayo:
tuli wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); tuli wchar_t *g_PropNamesRu = (L"Imewezeshwa", L"Kuna Kipima Muda", L"Jaribio", L"Aina ya Angalia");
Uhamisho Props itaonekana kama:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Daima mwisho);
Ili kurahisisha msimbo kwa kiasi kikubwa, tutatumia STL C++. Hasa, kwa kufanya kazi na masharti WCHAR, tuunganishe maktaba wstring.
Ili kuokoa thamani ya njia Mtihani, tunafafanua darasani CAddInNative katika wigo wa uwanja wa kibinafsi:
mtihani wa kamba1;
Ili kuhamisha vigezo vya kamba kati ya 1C: Biashara na vipengele vya nje, 1C: Meneja wa kumbukumbu ya Biashara hutumiwa. Hebu tuangalie kwa karibu kazi yake. Kazi hutumiwa kutenga na kumbukumbu ya bure kwa mtiririko huo Kumbukumbu ya Alloc Na Kumbukumbu ya Bure iliyofafanuliwa kwenye faili KumbukumbuMeneja.h. Ikiwa ni muhimu kupitisha parameta ya kamba kwa 1C: Mfumo wa Biashara, sehemu ya nje lazima itenge kumbukumbu kwa ajili yake kwa kupiga kazi. Kumbukumbu ya Alloc. Mfano wake unaonekana kama hii:
virtual bool ADDIN_API AllocMemory (batili** pMemory, ulCountByte ndefu isiyo na saini) = 0;
Wapi Kumbukumbu- anwani ya pointer ambayo anwani ya eneo la kumbukumbu iliyotengwa itawekwa,
ulCountByte- ukubwa wa eneo la kumbukumbu lililotengwa.
Mfano wa mgao wa kumbukumbu kwa kamba:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((batili**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Kwa urahisi wa kufanya kazi na aina za data za kamba, tutaelezea kazi wstring_to_p. Inapokea kamba ya wstring kama parameta. Matokeo ya kazi ni muundo uliojaa tVariant. Msimbo wa kazi:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((batili**)&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(); kurudi kweli;)
Kisha sehemu ya kesi inayofanana ya taarifa ya kubadili njia GetPropVal itachukua fomu:
kesi ePropTest1: wstring_to_p(test1, pvarPropVal); mapumziko;
Njia SetPropVal:
kesi ePropTest1: ikiwa (TV_VT(varPropVal) != VTYPE_PWSTR) itarudi sivyo; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); mapumziko;
Ili kutekeleza mali ya pili, tunafafanua shamba la darasa CaddInNative
uint8_t mwisho_aina;
ambamo tutahifadhi aina ya thamani ya mwisho iliyohamishwa. Ili kufanya hivyo, ongeza amri kwa njia ya CaddInNative::SetPropVal:
last_type = TV_VT(varPropVal);
Sasa, tunapoomba kusoma thamani ya mali ya pili, tutarudisha thamani aina_ya_mwisho, kazi iliyoteuliwa inahitaji nini.
Wacha tuangalie utendakazi wa mabadiliko yaliyofanywa.
Ili kufanya hivyo, hebu tuwasilishe mwonekano wa usanidi wa 1C kama ifuatavyo:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); DemoComp.TypeCheck = 1; Ripoti(String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Ripoti(String(DemoComp.Test)); DemoComp.Test = "Petya"; Ripoti(String(DemoComp.Test)); Ripoti(String(DemoComp.TypeCheck)); Mwisho wa Utaratibu
Kama matokeo ya uzinduzi, tutapokea mlolongo wa ujumbe:
3
Vasya
Peter
22

Ujumbe wa pili na wa tatu ni matokeo ya kusoma mali iliyowekwa katika hatua ya awali. Ujumbe wa kwanza na wa pili una aina ya msimbo wa seti ya mali ya mwisho. 3 inalingana na thamani kamili, 22 kwa thamani ya mfuatano. Mawasiliano ya aina na nambari zao zimeanzishwa kwenye faili aina.h, ambayo iko kwenye diski YAKE.

Kupanua orodha ya mbinu

Kazi:
  1. Panua utendakazi wa kijenzi cha nje kwa utendakazi ufuatao:
  2. Chunguza njia za kutekeleza njia za sehemu za nje
  3. Ongeza mbinu ya kukokotoa Kazi1, ambayo huchukua mifuatano miwili (“Parameter1” na “Parameter2”) kama kigezo. Matokeo yake ni kamba kama: "Kuangalia. Parameta1, Parameta2"
  4. Hakikisha mabadiliko unayofanya yanafanya kazi.

Ili kufafanua mbinu za kijenzi kinachoundwa, msanidi lazima atekeleze mbinu zifuatazo katika msimbo wa maktaba ya AddInNative:
GetNMethods, FindMethod, GetMethodName
Iliyoundwa ili kupata nambari inayolingana ya njia, tafuta nambari na jina la njia. Sawa na njia zinazolingana za mali
GetNParams
Hurejesha idadi ya vigezo vya mbinu na nambari ya mfuatano iliyobainishwa; ikiwa njia iliyo na nambari hii haipo au haina vigezo, inarudisha 0
PataParamDefValue
Hurejesha thamani chaguo-msingi ya kigezo kilichobainishwa cha mbinu iliyobainishwa
HasRetVal
Hurejesha alama ya iwapo mbinu iliyo na thamani iliyobainishwa ya kurejesha ina thamani ya kurejesha: kweli kwa mbinu zenye thamani ya kurejesha na uongo vinginevyo
CallAsProc
uongo, hitilafu ya wakati wa kukimbia hutokea na utekelezaji wa 1C: moduli ya Biashara imekoma. Kumbukumbu ya safu ya vigezo imetengwa na kutolewa na 1C: Enterprise.
CallAsFunc
Hutekeleza mbinu kwa kutumia nambari maalum ya mfuatano. Ikiwa njia inarudi uongo, hitilafu ya wakati wa kukimbia hutokea na utekelezaji wa 1C: moduli ya Biashara imekoma. Kumbukumbu kwa safu ya vigezo imetengwa na 1C: Enterprise. Ikiwa thamani ya kurejesha ni mfuatano au aina ya data ya jozi, kijenzi hugawa kumbukumbu na chaguo la kukokotoa Kumbukumbu ya Alloc meneja wa kumbukumbu, anaandika data huko na kuhifadhi anwani hii katika uwanja unaofanana wa muundo. 1C: Biashara itafungua kumbukumbu hii kwa kupiga simu Kumbukumbu ya Bure.
Maelezo kamili ya mbinu, ikiwa ni pamoja na orodha ya vigezo, inaelezwa kwa undani katika nyaraka zinazotolewa kwenye diski ya ITS.
Hebu fikiria utekelezaji wa mbinu zilizoelezwa hapo juu.
Katika nambari ya sehemu, safu mbili zinafafanuliwa:
tuli wchar_t *g_MethodNames = (L"Wezesha", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); tuli wchar_t *g_MethodNamesRu = (L"Wezesha", L"Zima", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
na hesabu:
Mbinu za enum ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Daima mwisho);
Zinatumika katika kazi GetNMethods, FindMethod Na GetMethodName, kwa mlinganisho na maelezo ya mali.
Mbinu GetNParams, PataParamDefValue, HasRetVal kutekeleza kubadili, kulingana na vigezo vilivyopitishwa na mantiki ya maombi, kurudi thamani inayohitajika. Njia HasRetVal katika nambari yake ina orodha ya njia pekee zinazoweza kurudisha matokeo. Kwao anarudi kweli. Kwa njia zote za chuma zinarudi uongo.
Mbinu CallAsProc Na CallAsFunc ina nambari inayoweza kutekelezwa ya njia moja kwa moja.
Ili kuongeza njia ambayo inaweza kuitwa tu kama chaguo za kukokotoa, unahitaji kufanya mabadiliko yafuatayo kwa msimbo wa chanzo wa sehemu ya nje:
  1. Ongeza jina la mbinu kwenye safu g_MethodNames Na g_MethodNamesRu(faili AddInNative.cpp)
  2. Ongeza kitambulisho cha njia cha maana kwenye hesabu ya Mbinu (faili AddInNative.h)
  3. Fanya mabadiliko kwenye msimbo wa chaguo la kukokotoa GetNParams kulingana na mantiki ya programu
  4. Ikiwa ni lazima, fanya mabadiliko kwa msimbo wa njia PataParamDefValue, ikiwa unataka kutumia maadili ya msingi ya vigezo vya njia.
  5. Fanya mabadiliko kwenye kipengele cha kukokotoa HasRetVal
  6. Fanya mabadiliko kwa mantiki ya vitendakazi CallAsProc au CallAsFunc, ikiweka nambari inayoweza kutekelezwa moja kwa moja ya njia hapo
Wacha tuwasilishe safu g_MethodNames Na g_MethodNamesRu, pamoja na kuorodhesha Mbinu kwa fomu:
tuli wchar_t *g_MethodNames = (L"Wezesha", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); tuli wchar_t *g_MethodNamesRu = (L"Wezesha", L"Zima", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test");

Mbinu za Enum ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Daima mwisho );
Hebu tuhariri kitendakazi GetNProps ili irudishe idadi ya vigezo vya njia ya "Mtihani":
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default: return 0; ) return 0; )
Wacha tufanye mabadiliko kwa kazi:
bool CAddInNative::GetParamDefValue(consst long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) ( ​​TV_VT(pvarParamDefValue)= VTYPE_EMPTY; badilisha(lMethodNum) ( case eMethEthEnable caseMethMethMethMeth:Sho eMethEnable caseMethMethMeth: kesi eMethEnable: mer: kesi eMethStopTimer: kesi eMethTest : / / Hakuna maadili ya kigezo kwa kuvunja chaguo-msingi; chaguo-msingi: rudisha sivyo; ) rudisha sivyo;)
Shukrani kwa mstari ulioongezwa
kesi eMethTest:
ikiwa hoja moja au zaidi haipo, vigezo vinavyolingana vitakuwa na thamani tupu ( VTYPE_TUPU) Ikiwa unahitaji thamani ya msingi kwa parameter, unapaswa kuiweka katika sehemu eMethTest taarifa ya kubadili kazi CAddInNative::GetParamDefValue.
Kwa kuwa mbinu ya Jaribio inaweza kurudisha thamani, unahitaji kufanya mabadiliko kwenye msimbo wa chaguo la kukokotoa HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) rudisha sivyo; )
Na ongeza nambari inayoweza kutekelezwa ya njia kwenye kazi CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethLoadPicture: breakest kesi: ... ikiwa (!lSizeArray || !paParams) inarudi sivyo; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = kweli ; mapumziko; ) kurudi nyuma;)
Wacha tukusanye sehemu na tulete nambari ya usanidi kwa fomu:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Hujambo," "Dunia!"); Ripoti (kwa); Mwisho wa Utaratibu
Baada ya kuzindua usanidi, tutapokea ujumbe: "Halo, Ulimwengu!", Ambayo inaonyesha kuwa njia hiyo ilifanya kazi kwa mafanikio.

Kipima muda

Kazi:
  1. Soma utekelezaji wa kipima saa kwenye onyesho la VK
  2. Rekebisha mbinu ya "StartTimer" kwa kuongeza uwezo wa kupitisha katika vigezo muda wa majibu ya kipima muda (katika milisekunde)
  3. Hakikisha mabadiliko unayofanya yanafanya kazi.

Katika WinAPI, unaweza kutumia ujumbe kufanya kazi na wakati WM_TIMER. Ujumbe huu utatumwa kwa programu yako kwa muda ambao umeweka wakati wa kuunda kipima muda.
Ili kuunda kipima muda, tumia kitendakazi SetTimer:
UINT SetTimer(HWND hWnd, // kifafanuzi cha dirisha UINT nIDevent, // kitambulisho cha kipima saa (nambari) UINT nElapse, // kuchelewesha TIMERPROC lpTimerFunc); // pointer kufanya kazi
Mfumo wa uendeshaji utatuma ujumbe WM_TIMER kwenye programu na muda ulioainishwa kwenye hoja nElapse(katika milliseconds). Katika parameter ya mwisho unaweza kutaja kazi ambayo itatekelezwa kila wakati timer inawaka. Kichwa cha kazi hii kinapaswa kuonekana kama hii (jina linaweza kuwa chochote):
utupu __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Hebu fikiria utekelezaji wa timer katika demo VC.
Kwa kuwa tunazingatia mchakato wa kuendeleza sehemu ya nje ya familia ya Windows OS, hatutazingatia utekelezaji wa timer katika mifumo mingine ya uendeshaji. Kwa GNU/Linux OS, haswa, utekelezaji utatofautiana katika syntax ya chaguo la kukokotoa SetTimer Na TimerProc.
Nambari inayoweza kutekelezwa huita mbinu SetTimer, ambayo kazi hupitishwa MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Kitambulisho cha kipima muda kilichoundwa kinawekwa kwenye kigezo m_uiTimer ili iweze kuzimwa baadaye.
Kazi MyTimerProc kama ifuatavyo:
VOID CALLBACK MyTimerProc(HWND hwnd, // mpini wa dirisha kwa ujumbe wa kipima muda UINT uMsg, // WM_TIMER ujumbe wa UINT idEvent, // kitambulisho cha kipima saa DWORD dwTime // wakati wa mfumo wa sasa) ( ikiwa (!pAsyncEvent) itarudi; wchar_t *who = L "ComponentNative", *what = L"Time"; wchar_t *wstime = new wchar_t; ikiwa (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(nani , nini, wstime); futa wstime; ))
Kiini cha kazi ni kwamba njia inaitwa Tukio la nje, ambayo hutuma ujumbe kwa 1C: Mfumo wa Biashara.
Ili kupanua utendaji wa njia StartTimer Hebu tufanye yafuatayo:
Kurekebisha msimbo wa mbinu GetNParams ili iwe kwa mbinu eMethStartTimer thamani iliyorejeshwa 1:
kesi eMethStartTimer: kurudi 1;
Hapa kuna nambari ya njia CallAsProc kwa fomu:
kesi eMethStartTimer: ikiwa (!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;
Sasa hebu tuangalie utendaji. Ili kufanya hivyo, tutaandika msimbo katika moduli ya programu iliyosimamiwa ya usanidi:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); Mwisho wa Utaratibu
Baada ya kuanza usanidi, programu itapokea ujumbe kwa vipindi vya sekunde 2, ambayo inaonyesha kuwa timer inafanya kazi kwa usahihi.

Mwingiliano na 1C: Mfumo wa Biashara

Kuingiliana kati ya sehemu ya nje na 1C: Mfumo wa Biashara, njia za darasa la IAddInDefBase, zilizoelezewa kwenye faili. AddInDefBase.h. Tunaorodhesha zile zinazotumiwa sana:
Inazalisha Ujumbe wa Hitilafu
bool virtual ADDIN_API AddError(wcode fupi isiyo na saini, const WCHAR_T* chanzo, const WCHAR_T* descr, msimbo mrefu)
wcode, kanuni- nambari za makosa (orodha ya nambari za makosa na maelezo zinaweza kupatikana kwenye diski ya ITS)
chanzo- chanzo cha makosa
descr- maelezo ya makosa
Inatuma ujumbe kwa 1C: Mfumo wa Biashara
bool pepe ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszChanzo- chanzo cha ujumbe
wszMessage- Nakala ya ujumbe
wszData- data iliyopitishwa
Uzuiaji wa ujumbe unafanywa na utaratibu wa Uchakataji wa Tukio la Nje
Usajili wa sehemu ya nje katika 1C: Mfumo wa Biashara
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- jina la sehemu.
Njia hizi ni za kutosha kwa mwingiliano kamili kati ya VK na 1C. Ili kupokea data kutoka kwa sehemu ya nje kutoka kwa 1C: Mfumo wa Biashara na kinyume chake, sehemu ya nje hutuma ujumbe maalum, ambao kwa upande wake unachukuliwa na mfumo wa 1C na, ikiwa ni lazima, huita njia za sehemu ya nje ili kusambaza data nyuma. .

Aina ya data ya tVariant

Wakati wa kubadilishana data kati ya sehemu ya nje na 1C: Mfumo wa Biashara, aina ya data ya tVariant hutumiwa. Imeelezewa katika faili za type.h, ambazo zinaweza kupatikana kwenye diski YAKE:
muundo _tVariant ( _ANONYMOUS_UNION muungano ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint2_t_uVal; uint2l_t_t_t_t; int32_t errCode; hRes ndefu; fltVal ya kuelea; dblVal mbili; bool bVal; char chVal; wchar_t wchVal; TAREHE; IID IDVal; muundo _tVariant *pvarVal; muundo tm tmVal; _ANONYMOUS_STRUCT muundo ( batili* pInterfaceVal; IID InterfaceID; ) __VARUS_IANT_NAME_NAME; strVal; uint3 2_t strLen ; //idadi ya baiti ) __VARIANT_NAME_3/*str*/; muundo _ANONYMOUS_STRUCT ( WCHAR_T* pwstrVal; uint32_t wstrLen; //hesabu ya ishara ) __VARIANT_NAME_4/*wstr*/; ) ___pensheni2;b_1; - safu ya mwelekeo katika pvarVal TYPEVAR vt;
Aina tVariant ni muundo unaojumuisha:
  • mchanganyiko (muungano) unaokusudiwa moja kwa moja kuhifadhi data
  • kitambulisho cha aina ya data
Kwa ujumla, kufanya kazi na vigezo vya aina tVariant hutokea kulingana na algorithm ifuatayo:
  1. Kuamua aina ya data iliyohifadhiwa kwa sasa katika kigezo
  2. Fikia sehemu inayolingana ya mchanganyiko ili kufikia data moja kwa moja
Kutumia aina tVariant hurahisisha mwingiliano wa 1C: Mfumo wa Biashara na vifaa vya nje

Maombi

Saraka ya "mifano" ina mifano ya makala
mifano/1 - zindua sehemu ya onyesho
mifano/2 - maonyesho ya upanuzi wa orodha ya mali
mifano/3 - maonyesho ya kupanua orodha ya mbinu
Kila saraka ina mradi wa VS 2008 na usanidi tayari wa 1C.

OLEG FILIPOV, ANT-Inform, Naibu Mkuu wa Idara ya Maendeleo, [barua pepe imelindwa]

Kupanua utendakazi wa 1C:Enterprise
Sehemu ya 1: Vipengele vya Nje vya COM

Inakuja wakati katika maisha ya kila msanidi wa 1C wakati majukumu aliyopewa yanazidi uwezo wa jukwaa la 1C. Wacha tuangalie njia za "kushinda mpaka wa iwezekanavyo"

Wasanidi programu wa 1C wenye uzoefu pengine tayari wamekisia kutoka kwa maneno matatu ya kwanza ya kichwa cha makala ambayo tutakuwa tunazungumza kuhusu vipengele vya nje vya 1C:Enterprise. Teknolojia hii imekuwepo tangu siku za jukwaa la 1C:Enterprise 7.7 (au mapema). Kwa kihistoria, ilionekana kusuluhisha shida za mwingiliano na vifaa vya kibiashara (skana za Barcode, mizani ya elektroniki, rejista za pesa), wakati ambapo ikawa muhimu kwa jukwaa la 1C kushughulikia matukio fulani yaliyoanzishwa na vifaa. Matukio kama haya si chochote zaidi ya mlolongo wa baiti zinazofika kwenye bandari za COM/LPT. Bila shaka, kurekebisha jukwaa la 1C kufanya kazi na mifumo hiyo ya kiwango cha chini haitakuwa sahihi sana, kwa hiyo tulikuja na teknolojia ya vipengele vya nje vya 1C: Enterprise.

Katika safu hii ya vifungu hatutazungumza tu juu ya vifaa vya nje: vifaa vya nje ni njia yenye nguvu na ngumu, kwa hivyo kuzitumia kutatua shida zingine huonekana kama "kupiga shomoro na kanuni." Walakini, vipengee vya nje ndio zana ya ulimwengu wote ya kutatua kila aina ya shida ambazo huenda zaidi ya upeo wa jukwaa la 1C:Enterprise, kwa hivyo tutaanza navyo. Nakala hiyo itajadili teknolojia ya zamani zaidi, inayotumiwa mara nyingi na iliyojaribiwa kwa wakati kwa kuunda vifaa vya nje - kulingana na COM.

Vipengele vya nje ni nini

Vipengele vya nje, kama ilivyotajwa hapo juu, vilionekana katika 1C:Enterprise tangu toleo la 7.7. Hapo awali, kwa mujibu wa mila, watengenezaji wa jukwaa la 1C "hawakusumbua," na vipengele vya nje vilikuwa kitu kilicho na mali na mbinu fulani za lazima. Vipengele bado vipo katika fomu sawa hadi leo. Hiyo ni, vipengele vilivyoandikwa kwa 1C:Enterprise 7.7 (kwa nadharia) vitafanya kazi na 1C:Enterprise 8.3.

Kwa mazoezi, kuna idadi ya hila: ikiwa sehemu ya nje inaingiliana kikamilifu na jukwaa yenyewe, basi kazi zake zitakuwa maalum kwa toleo maalum.

Tangu toleo la 8.2, 1C:Enterprise imeanzisha teknolojia mpya ya kutengeneza vipengee vya nje, inayoitwa NativeAPI. Vipengele vilivyoandikwa kwa kutumia teknolojia hii sio vitu vya COM tena. Kwa upande mmoja, hii ni pamoja - vipengele hivi havihitaji usajili, kwa upande mwingine, matumizi yao mahali popote isipokuwa 1C: Jukwaa la Biashara haliwezekani. Ukuzaji wa vipengee vya nje umekuwa mgumu zaidi; lazima ziunge mkono idadi kubwa zaidi ya miingiliano inayohitajika. Lakini tutazungumza juu yake katika makala inayofuata.

Vipengele vya nje na teknolojia ya COM

Sitaelezea teknolojia ya COM yenyewe kwa undani, kwa sababu kuna maandiko mengi juu ya mada hii. Labda mtu anapaswa kusema tu kwamba watu wengi "huchanganya" kuunda seva ya kawaida ya inproc na kuunda vipengele vya nje vya 1C:Enterprise, lakini hii si mbali na ukweli. Mara nyingi unaweza kupata na utendakazi huu tu. Jinsi ya kuunda kitu cha COM katika Visual Studio imeelezewa katika vyanzo vingi tofauti. Hasa, mtu huyo aliandika kwa undani jinsi hii inafanywa, kwa mfano wa simu kutoka 1C:Enterprise.

Ikiwa bado unataka kutengeneza kijenzi kamili cha nje cha COM kwa 1C:Enterprise (ya chaguzi kwa nini hii inaweza kuhitajika, naweza kufikiria moja tu - kijenzi lazima kiingiliane kikamilifu na mfumo kwenye jukwaa la 1C, waarifu watumiaji, kubadilisha mstari wa hali, onyesha masanduku ya mazungumzo na nk), basi unahitaji kutumia teknolojia ya vipengele vya nje moja kwa moja. Basi hebu tuanze.

  • Mafunzo

Utangulizi

Nakala hii inatoa wazo la jinsi vifaa vya nje hufanya kazi katika 1C: Mfumo wa Biashara.
Mchakato wa kutengeneza kipengee cha nje cha 1C: Toleo la mfumo wa Enterprise 8.2, unaoendesha chini ya Windows OS yenye hali ya uendeshaji ya faili, itaonyeshwa. Chaguo hili hutumiwa katika suluhisho nyingi iliyoundwa kwa biashara ndogo ndogo. VK itatekelezwa katika lugha ya programu ya C++.

Vipengele vya nje "1C: Enterprise"

"1C: Enterprise" ni mfumo unaopanuliwa. Ili kupanua utendaji wa mfumo, vipengele vya nje (EC) hutumiwa. Kutoka kwa mtazamo wa msanidi programu, VC ni kitu cha nje ambacho kina mali na mbinu, na pia inaweza kuzalisha matukio ya usindikaji na 1C: Mfumo wa Biashara.
Vipengele vya nje vinaweza kutumika kutatua darasa la matatizo ambayo ni vigumu au hata haiwezekani kutekeleza katika lugha ya programu iliyojengwa katika 1C: Enterprise. Hasa, darasa hili linajumuisha kazi zinazohitaji mwingiliano wa kiwango cha chini na mfumo wa uendeshaji, kwa mfano, kufanya kazi na vifaa maalum.
1C: Mfumo wa Biashara hutumia teknolojia mbili kuunda vifaa vya nje:
  • kwa kutumia Native API
  • kwa kutumia teknolojia ya COM
Kwa kuzingatia vikwazo vilivyotolewa, tofauti kati ya teknolojia mbili zilizotajwa hapo juu ni ndogo, kwa hivyo tutazingatia uundaji wa michezo ya video kwa kutumia API ya Asili. Ikiwa ni lazima, maendeleo yaliyotekelezwa yanaweza kutumika kwa maendeleo ya programu ya kompyuta kwa kutumia teknolojia ya COM, na pia, pamoja na marekebisho madogo, kutumika kwa ajili ya matumizi katika 1C: Mfumo wa Biashara na chaguzi nyingine za uendeshaji isipokuwa mode ya uendeshaji wa faili.
Muundo wa VK
Sehemu ya nje ya 1C: Mfumo wa Biashara unawasilishwa kwa namna ya maktaba ya DLL. Nambari ya maktaba inaelezea darasa la kizazi IComponentBase. Darasa lililoundwa lazima lifafanue njia zinazohusika na utekelezaji wa kazi za sehemu ya nje. Mbinu zilizobatilishwa zitaelezewa kwa undani zaidi hapa chini kama nyenzo zinavyowasilishwa.

Kuzindua onyesho la VK

Kazi:
  1. Kusanya kijenzi cha nje kilichotolewa na usajili wa ITS na kinachokusudiwa kuonyesha uwezo mkuu wa utaratibu wa sehemu ya nje katika 1C.
  2. Unganisha kijenzi cha onyesho kwenye usanidi wa 1C
  3. Hakikisha vipengele vilivyotangazwa vinafanya kazi ipasavyo
Mkusanyiko
Onyesho la VK liko kwenye diski ya usajili ya ITS kwenye saraka ya "/ VNCOMP82/example/NativeAPI".
Ili kuunda onyesho la VC tutatumia Microsoft Visual Studio 2008. Matoleo mengine ya bidhaa hii hayatumii umbizo la mradi wa Visual Studio linalotumika.


Fungua mradi wa AddInNative. Katika mipangilio ya mradi, tunajumuisha saraka na faili za kichwa zinazohitajika ili kujenga mradi. Kwa msingi, ziko kwenye diski ya ITS kwenye saraka /VNCOMP82/pamoja na.
Matokeo ya ujenzi ni faili /bind/AddInNative.dll. Hii ni maktaba iliyokusanywa kwa ajili ya kuunganisha kwa usanidi wa 1C.
Kuunganisha VK kwa usanidi wa 1C
Wacha tuunde usanidi tupu wa 1C.
Ifuatayo ni msimbo wa moduli ya programu inayosimamiwa.
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...\bind\AddInNative.dll", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.AddInNativeExtension"); Mwisho wa Utaratibu
Ikiwa hakuna kosa lililoripotiwa wakati wa kuanzisha usanidi wa 1C, basi VK iliunganishwa kwa ufanisi.
Kama matokeo ya kutekeleza nambari iliyo hapo juu, kitu kinaonekana katika mwonekano wa kimataifa wa usanidi DemoComp, ambayo ina mali na mbinu ambazo zinafafanuliwa katika kanuni ya sehemu ya nje.
Onyesho la utendaji uliojengwa ndani
Wacha tuangalie utendaji wa onyesho la VK. Ili kufanya hivyo, hebu jaribu kuweka na kusoma baadhi ya mali, piga baadhi ya mbinu za VK, na pia kupokea na kusindika ujumbe wa VK.
Nyaraka zinazotolewa kwenye diski ya ITS zinasema utendaji ufuatao wa onyesho la VC:
  1. Kusimamia Hali ya Kitu cha Kipengee
    Mbinu: Washa, Zima
    Sifa: Imejumuishwa
  2. Usimamizi wa saa
    Kila sekunde sehemu hutuma ujumbe kwa 1C: Mfumo wa Biashara na vigezo Sehemu, Kipima muda na mstari wa kukabiliana na saa ya mfumo.
    Mbinu: StartTimer, StopTimer
    Sifa: Kuna Kipima Muda
  3. Njia ShowInStatusLine, ambayo huonyesha maandishi yaliyopitishwa kwa njia kama vigezo kwenye upau wa hali
  4. Njia PakiaPicha. Hupakia picha kutoka kwa faili iliyobainishwa na kuihamisha hadi 1C: Mfumo wa Biashara katika mfumo wa data binary.
Hebu tuhakikishe kwamba vipengele hivi vinafanya kazi. Ili kufanya hivyo, endesha nambari ifuatayo:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() UnganishaExternalComponent(...); DemoComp = Mpya("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Zimaza(); Ripoti(DemoComp.Enabled); DemoComp.Wezesha(); Ripoti(DemoComp.Enabled); DemoComp.StartTimer(); Mwisho wa Utaratibu wa Utaratibu Usindikaji wa Tukio la Nje(Chanzo, Tukio, Data) Ripoti(Chanzo + "" + Tukio + "" + Data); Mwisho wa Utaratibu
Matokeo ya kuendesha usanidi yanaonyeshwa kwenye picha


Paneli ya "Ujumbe" huonyesha matokeo ya simu za mbinu DemoComp.Disable() Na Onyesho.Comp.Wezesha(). Mistari inayofuata kwenye jopo moja ina matokeo ya usindikaji wa ujumbe uliopokelewa kutoka kwa VK - Chanzo, Tukio Na Data kwa mtiririko huo.

Jina maalum la kijenzi cha nje

Kazi: Badilisha jina la kijenzi cha nje kuwa cha kiholela.
Sehemu iliyotangulia ilitumia kitambulisho AddInNativeExtension, maana yake haikufafanuliwa. Kwa kesi hii AddInNativeExtension- hili ndilo jina la ugani.
Nambari ya VK inafafanua njia RegisterExtensionAs, kurudisha jina kwa 1C: Mfumo wa Biashara, ambayo ni muhimu kwa usajili unaofuata wa VK kwenye mfumo. Inashauriwa kutaja kitambulisho ambacho kwa kiasi fulani kinaonyesha kiini cha sehemu ya nje.
Hapa kuna nambari kamili ya njia RegisterExtensionAs na jina la kiendelezi limebadilishwa:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; ikiwa (m_illory-Memory_Memory> ((batili**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); rudisha kweli; ) rudisha sivyo; )
Katika mfano uliopewa, jina la VK linabadilishwa kuwa Jina Fulani. Kisha wakati wa kuunganisha VK lazima ueleze jina jipya:
DemoComp = Mpya("AddIn.DemoVK.SomeName");

Kupanua orodha ya mali ya VK

Kazi:
  1. Soma utekelezaji wa mali za VK
  2. Ongeza sifa ya kusoma/kuandika ya aina ya mfuatano
  3. Ongeza kipengele cha kusoma/kuandika ambacho huhifadhi aina ya data ya seti ya mali ya mwisho. Hakuna hatua inayochukuliwa wakati wa kuweka thamani ya mali

Ili kubainisha sifa za kijenzi kinachoundwa, msanidi lazima atekeleze mbinu zifuatazo katika msimbo wa maktaba ya AddInNative.cpp:
GetNProps
Hurejesha idadi ya sifa za kiendelezi hiki, 0 ikiwa hakuna sifa
FindProp
Hurejesha nambari ya ufuatiliaji ya sifa ambayo jina lake limepitishwa katika vigezo
GetPropName
Hurejesha jina la sifa kwa nambari yake ya mfululizo na kwa kitambulisho cha lugha iliyopitishwa
GetPropVal
Hurejesha thamani ya mali pamoja na nambari maalum iliyobainishwa
SetPropVal
Huweka thamani ya mali na nambari maalum ya ordinal
IsPropReadable
Hurejesha alama ya kusomeka ya sifa iliyo na nambari ya mfuatano iliyobainishwa
IsPropWritable
Hurejesha bendera ya uandikaji ya sifa iliyo na nambari ya mfuatano iliyobainishwa


Hebu fikiria utekelezaji wa mbinu za darasa hapo juu CAddInNative.
Katika onyesho la VC, mali 2 zimefafanuliwa: Imejumuishwa Na Kuna Kipima Muda (Imewezeshwa Na IsTimerPresent).
Katika wigo wa kimataifa wa nambari ya maktaba, safu mbili zimefafanuliwa:
tuli wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); tuli wchar_t *g_PropNamesRu = (L"Imewezeshwa", L"Kuna Kipima Muda");
ambayo huhifadhi majina ya mali ya Kirusi na Kiingereza. Katika faili ya kichwa AddInNative.h hesabu imefafanuliwa:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Daima mwisho);
ePropIsEnabled Na ePropIsTimerPresent, mtawalia kuwa na thamani 0 na 1, hutumiwa kuchukua nafasi ya nambari za mfululizo za sifa na vitambulishi vya maana. ePropLast, ambayo ina thamani ya 2, inatumika kupata idadi ya sifa (kwa kutumia mbinu ya GetNProps). Majina haya hutumiwa tu ndani ya msimbo wa sehemu na haipatikani kutoka nje.
Njia za FindProp na GetPropName hufanya utafutaji wa safu g_PropNames Na g_PropNamesRu.
Ili kuhifadhi maadili ya sehemu kwenye moduli ya maktaba, darasa la CAddInNative lina mali zinazohifadhi thamani ya vipengele vya sehemu. Mbinu GetPropVal Na SetPropVal rudisha na uweke thamani ya mali hizi ipasavyo.
Mbinu IsPropReadable Na IsPropWritable na kurudi kweli au uongo, kulingana na nambari ya ordinal iliyopitishwa ya mali kwa mujibu wa mantiki ya maombi.
Ili kuongeza mali maalum unahitaji:

  1. Ongeza jina la mali inayoongezwa kwenye safu g_PropNames Na g_PropNamesRu(faili AddInNative.cpp)
  2. Kuorodhesha Props(faili AddInNative.h) kabla ePropLast ongeza jina ambalo linatambulisha kipekee mali inayoongezwa
  3. Panga kumbukumbu ya kuhifadhi maadili ya mali (unda sehemu za sehemu za moduli zinazohifadhi maadili yanayolingana)
  4. Fanya mabadiliko kwa mbinu GetPropVal Na SetPropVal kuingiliana na kumbukumbu iliyotengwa katika hatua ya awali
  5. Kwa mujibu wa mantiki ya maombi, fanya mabadiliko kwa mbinu IsPropReadable Na IsPropWritable
Pointi 1, 2, 5 hazihitaji maelezo. Maelezo ya utekelezaji wa hatua hizi yanaweza kupatikana kwa kujifunza kiambatisho cha makala.
Wacha tupe majina kwa sifa za mtihani Mtihani Na Aina ya Angalia kwa mtiririko huo. Kisha, kama matokeo ya hatua ya 1, tunayo:
tuli wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); tuli wchar_t *g_PropNamesRu = (L"Imewezeshwa", L"Kuna Kipima Muda", L"Jaribio", L"Aina ya Angalia");
Uhamisho Props itaonekana kama:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Daima mwisho);
Ili kurahisisha msimbo kwa kiasi kikubwa, tutatumia STL C++. Hasa, kwa kufanya kazi na masharti WCHAR, tuunganishe maktaba wstring.
Ili kuokoa thamani ya njia Mtihani, tunafafanua darasani CAddInNative katika wigo wa uwanja wa kibinafsi:
mtihani wa kamba1;
Ili kuhamisha vigezo vya kamba kati ya 1C: Biashara na vipengele vya nje, 1C: Meneja wa kumbukumbu ya Biashara hutumiwa. Hebu tuangalie kwa karibu kazi yake. Kazi hutumiwa kutenga na kumbukumbu ya bure kwa mtiririko huo Kumbukumbu ya Alloc Na Kumbukumbu ya Bure iliyofafanuliwa kwenye faili KumbukumbuMeneja.h. Ikiwa ni muhimu kupitisha parameta ya kamba kwa 1C: Mfumo wa Biashara, sehemu ya nje lazima itenge kumbukumbu kwa ajili yake kwa kupiga kazi. Kumbukumbu ya Alloc. Mfano wake unaonekana kama hii:
virtual bool ADDIN_API AllocMemory (batili** pMemory, ulCountByte ndefu isiyo na saini) = 0;
Wapi Kumbukumbu- anwani ya pointer ambayo anwani ya eneo la kumbukumbu iliyotengwa itawekwa,
ulCountByte- ukubwa wa eneo la kumbukumbu lililotengwa.
Mfano wa mgao wa kumbukumbu kwa kamba:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((batili**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Kwa urahisi wa kufanya kazi na aina za data za kamba, tutaelezea kazi wstring_to_p. Inapokea kamba ya wstring kama parameta. Matokeo ya kazi ni muundo uliojaa tVariant. Msimbo wa kazi:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((batili**)&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(); kurudi kweli;)
Kisha sehemu ya kesi inayofanana ya taarifa ya kubadili njia GetPropVal itachukua fomu:
kesi ePropTest1: wstring_to_p(test1, pvarPropVal); mapumziko;
Njia SetPropVal:
kesi ePropTest1: ikiwa (TV_VT(varPropVal) != VTYPE_PWSTR) itarudi sivyo; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); mapumziko;
Ili kutekeleza mali ya pili, tunafafanua shamba la darasa CaddInNative
uint8_t mwisho_aina;
ambamo tutahifadhi aina ya thamani ya mwisho iliyohamishwa. Ili kufanya hivyo, ongeza amri kwa njia ya CaddInNative::SetPropVal:
last_type = TV_VT(varPropVal);
Sasa, tunapoomba kusoma thamani ya mali ya pili, tutarudisha thamani aina_ya_mwisho, kazi iliyoteuliwa inahitaji nini.
Wacha tuangalie utendakazi wa mabadiliko yaliyofanywa.
Ili kufanya hivyo, hebu tuwasilishe mwonekano wa usanidi wa 1C kama ifuatavyo:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); DemoComp.TypeCheck = 1; Ripoti(String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Ripoti(String(DemoComp.Test)); DemoComp.Test = "Petya"; Ripoti(String(DemoComp.Test)); Ripoti(String(DemoComp.TypeCheck)); Mwisho wa Utaratibu
Kama matokeo ya uzinduzi, tutapokea mlolongo wa ujumbe:
3
Vasya
Peter
22

Ujumbe wa pili na wa tatu ni matokeo ya kusoma mali iliyowekwa katika hatua ya awali. Ujumbe wa kwanza na wa pili una aina ya msimbo wa seti ya mali ya mwisho. 3 inalingana na thamani kamili, 22 kwa thamani ya mfuatano. Mawasiliano ya aina na nambari zao zimeanzishwa kwenye faili aina.h, ambayo iko kwenye diski YAKE.

Kupanua orodha ya mbinu

Kazi:
  1. Panua utendakazi wa kijenzi cha nje kwa utendakazi ufuatao:
  2. Chunguza njia za kutekeleza njia za sehemu za nje
  3. Ongeza mbinu ya kukokotoa Kazi1, ambayo huchukua mifuatano miwili (“Parameter1” na “Parameter2”) kama kigezo. Matokeo yake ni kamba kama: "Kuangalia. Parameta1, Parameta2"
  4. Hakikisha mabadiliko unayofanya yanafanya kazi.

Ili kufafanua mbinu za kijenzi kinachoundwa, msanidi lazima atekeleze mbinu zifuatazo katika msimbo wa maktaba ya AddInNative:
GetNMethods, FindMethod, GetMethodName
Iliyoundwa ili kupata nambari inayolingana ya njia, tafuta nambari na jina la njia. Sawa na njia zinazolingana za mali
GetNParams
Hurejesha idadi ya vigezo vya mbinu na nambari ya mfuatano iliyobainishwa; ikiwa njia iliyo na nambari hii haipo au haina vigezo, inarudisha 0
PataParamDefValue
Hurejesha thamani chaguo-msingi ya kigezo kilichobainishwa cha mbinu iliyobainishwa
HasRetVal
Hurejesha alama ya iwapo mbinu iliyo na thamani iliyobainishwa ya kurejesha ina thamani ya kurejesha: kweli kwa mbinu zenye thamani ya kurejesha na uongo vinginevyo
CallAsProc
uongo, hitilafu ya wakati wa kukimbia hutokea na utekelezaji wa 1C: moduli ya Biashara imekoma. Kumbukumbu ya safu ya vigezo imetengwa na kutolewa na 1C: Enterprise.
CallAsFunc
Hutekeleza mbinu kwa kutumia nambari maalum ya mfuatano. Ikiwa njia inarudi uongo, hitilafu ya wakati wa kukimbia hutokea na utekelezaji wa 1C: moduli ya Biashara imekoma. Kumbukumbu kwa safu ya vigezo imetengwa na 1C: Enterprise. Ikiwa thamani ya kurejesha ni mfuatano au aina ya data ya jozi, kijenzi hugawa kumbukumbu na chaguo la kukokotoa Kumbukumbu ya Alloc meneja wa kumbukumbu, anaandika data huko na kuhifadhi anwani hii katika uwanja unaofanana wa muundo. 1C: Biashara itafungua kumbukumbu hii kwa kupiga simu Kumbukumbu ya Bure.
Maelezo kamili ya mbinu, ikiwa ni pamoja na orodha ya vigezo, inaelezwa kwa undani katika nyaraka zinazotolewa kwenye diski ya ITS.
Hebu fikiria utekelezaji wa mbinu zilizoelezwa hapo juu.
Katika nambari ya sehemu, safu mbili zinafafanuliwa:
tuli wchar_t *g_MethodNames = (L"Wezesha", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); tuli wchar_t *g_MethodNamesRu = (L"Wezesha", L"Zima", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
na hesabu:
Mbinu za enum ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Daima mwisho);
Zinatumika katika kazi GetNMethods, FindMethod Na GetMethodName, kwa mlinganisho na maelezo ya mali.
Mbinu GetNParams, PataParamDefValue, HasRetVal kutekeleza kubadili, kulingana na vigezo vilivyopitishwa na mantiki ya maombi, kurudi thamani inayohitajika. Njia HasRetVal katika nambari yake ina orodha ya njia pekee zinazoweza kurudisha matokeo. Kwao anarudi kweli. Kwa njia zote za chuma zinarudi uongo.
Mbinu CallAsProc Na CallAsFunc ina nambari inayoweza kutekelezwa ya njia moja kwa moja.
Ili kuongeza njia ambayo inaweza kuitwa tu kama chaguo za kukokotoa, unahitaji kufanya mabadiliko yafuatayo kwa msimbo wa chanzo wa sehemu ya nje:
  1. Ongeza jina la mbinu kwenye safu g_MethodNames Na g_MethodNamesRu(faili AddInNative.cpp)
  2. Ongeza kitambulisho cha njia cha maana kwenye hesabu ya Mbinu (faili AddInNative.h)
  3. Fanya mabadiliko kwenye msimbo wa chaguo la kukokotoa GetNParams kulingana na mantiki ya programu
  4. Ikiwa ni lazima, fanya mabadiliko kwa msimbo wa njia PataParamDefValue, ikiwa unataka kutumia maadili ya msingi ya vigezo vya njia.
  5. Fanya mabadiliko kwenye kipengele cha kukokotoa HasRetVal
  6. Fanya mabadiliko kwa mantiki ya vitendakazi CallAsProc au CallAsFunc, ikiweka nambari inayoweza kutekelezwa moja kwa moja ya njia hapo
Wacha tuwasilishe safu g_MethodNames Na g_MethodNamesRu, pamoja na kuorodhesha Mbinu kwa fomu:
tuli wchar_t *g_MethodNames = (L"Wezesha", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); tuli wchar_t *g_MethodNamesRu = (L"Wezesha", L"Zima", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test");

Mbinu za Enum ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Daima mwisho );
Hebu tuhariri kitendakazi GetNProps ili irudishe idadi ya vigezo vya njia ya "Mtihani":
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default: return 0; ) return 0; )
Wacha tufanye mabadiliko kwa kazi:
bool CAddInNative::GetParamDefValue(consst long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) ( ​​TV_VT(pvarParamDefValue)= VTYPE_EMPTY; badilisha(lMethodNum) ( case eMethEthEnable caseMethMethMethMeth:Sho eMethEnable caseMethMethMeth: kesi eMethEnable: mer: kesi eMethStopTimer: kesi eMethTest : / / Hakuna maadili ya kigezo kwa kuvunja chaguo-msingi; chaguo-msingi: rudisha sivyo; ) rudisha sivyo;)
Shukrani kwa mstari ulioongezwa
kesi eMethTest:
ikiwa hoja moja au zaidi haipo, vigezo vinavyolingana vitakuwa na thamani tupu ( VTYPE_TUPU) Ikiwa unahitaji thamani ya msingi kwa parameter, unapaswa kuiweka katika sehemu eMethTest taarifa ya kubadili kazi CAddInNative::GetParamDefValue.
Kwa kuwa mbinu ya Jaribio inaweza kurudisha thamani, unahitaji kufanya mabadiliko kwenye msimbo wa chaguo la kukokotoa HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) rudisha sivyo; )
Na ongeza nambari inayoweza kutekelezwa ya njia kwenye kazi CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethLoadPicture: breakest kesi: ... ikiwa (!lSizeArray || !paParams) inarudi sivyo; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = kweli ; mapumziko; ) kurudi nyuma;)
Wacha tukusanye sehemu na tulete nambari ya usanidi kwa fomu:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Hujambo," "Dunia!"); Ripoti (kwa); Mwisho wa Utaratibu
Baada ya kuzindua usanidi, tutapokea ujumbe: "Halo, Ulimwengu!", Ambayo inaonyesha kuwa njia hiyo ilifanya kazi kwa mafanikio.

Kipima muda

Kazi:
  1. Soma utekelezaji wa kipima saa kwenye onyesho la VK
  2. Rekebisha mbinu ya "StartTimer" kwa kuongeza uwezo wa kupitisha katika vigezo muda wa majibu ya kipima muda (katika milisekunde)
  3. Hakikisha mabadiliko unayofanya yanafanya kazi.

Katika WinAPI, unaweza kutumia ujumbe kufanya kazi na wakati WM_TIMER. Ujumbe huu utatumwa kwa programu yako kwa muda ambao umeweka wakati wa kuunda kipima muda.
Ili kuunda kipima muda, tumia kitendakazi SetTimer:
UINT SetTimer(HWND hWnd, // kifafanuzi cha dirisha UINT nIDevent, // kitambulisho cha kipima saa (nambari) UINT nElapse, // kuchelewesha TIMERPROC lpTimerFunc); // pointer kufanya kazi
Mfumo wa uendeshaji utatuma ujumbe WM_TIMER kwenye programu na muda ulioainishwa kwenye hoja nElapse(katika milliseconds). Katika parameter ya mwisho unaweza kutaja kazi ambayo itatekelezwa kila wakati timer inawaka. Kichwa cha kazi hii kinapaswa kuonekana kama hii (jina linaweza kuwa chochote):
utupu __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Hebu fikiria utekelezaji wa timer katika demo VC.
Kwa kuwa tunazingatia mchakato wa kuendeleza sehemu ya nje ya familia ya Windows OS, hatutazingatia utekelezaji wa timer katika mifumo mingine ya uendeshaji. Kwa GNU/Linux OS, haswa, utekelezaji utatofautiana katika syntax ya chaguo la kukokotoa SetTimer Na TimerProc.
Nambari inayoweza kutekelezwa huita mbinu SetTimer, ambayo kazi hupitishwa MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Kitambulisho cha kipima muda kilichoundwa kinawekwa kwenye kigezo m_uiTimer ili iweze kuzimwa baadaye.
Kazi MyTimerProc kama ifuatavyo:
VOID CALLBACK MyTimerProc(HWND hwnd, // mpini wa dirisha kwa ujumbe wa kipima muda UINT uMsg, // WM_TIMER ujumbe wa UINT idEvent, // kitambulisho cha kipima saa DWORD dwTime // wakati wa mfumo wa sasa) ( ikiwa (!pAsyncEvent) itarudi; wchar_t *who = L "ComponentNative", *what = L"Time"; wchar_t *wstime = new wchar_t; ikiwa (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(nani , nini, wstime); futa wstime; ))
Kiini cha kazi ni kwamba njia inaitwa Tukio la nje, ambayo hutuma ujumbe kwa 1C: Mfumo wa Biashara.
Ili kupanua utendaji wa njia StartTimer Hebu tufanye yafuatayo:
Kurekebisha msimbo wa mbinu GetNParams ili iwe kwa mbinu eMethStartTimer thamani iliyorejeshwa 1:
kesi eMethStartTimer: kurudi 1;
Hapa kuna nambari ya njia CallAsProc kwa fomu:
kesi eMethStartTimer: ikiwa (!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;
Sasa hebu tuangalie utendaji. Ili kufanya hivyo, tutaandika msimbo katika moduli ya programu iliyosimamiwa ya usanidi:
kutofautiana DemoComp; Utaratibu Wakati Mfumo Unaanza() Unganisha Kipengele cha Nje("...", "DemoVK", Aina ya Kipengele cha Nje.Native); DemoComp = Mpya("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); Mwisho wa Utaratibu
Baada ya kuanza usanidi, programu itapokea ujumbe kwa vipindi vya sekunde 2, ambayo inaonyesha kuwa timer inafanya kazi kwa usahihi.

Mwingiliano na 1C: Mfumo wa Biashara

Kuingiliana kati ya sehemu ya nje na 1C: Mfumo wa Biashara, njia za darasa la IAddInDefBase, zilizoelezewa kwenye faili. AddInDefBase.h. Tunaorodhesha zile zinazotumiwa sana:
Inazalisha Ujumbe wa Hitilafu
bool virtual ADDIN_API AddError(wcode fupi isiyo na saini, const WCHAR_T* chanzo, const WCHAR_T* descr, msimbo mrefu)
wcode, kanuni- nambari za makosa (orodha ya nambari za makosa na maelezo zinaweza kupatikana kwenye diski ya ITS)
chanzo- chanzo cha makosa
descr- maelezo ya makosa
Inatuma ujumbe kwa 1C: Mfumo wa Biashara
bool pepe ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszChanzo- chanzo cha ujumbe
wszMessage- Nakala ya ujumbe
wszData- data iliyopitishwa
Uzuiaji wa ujumbe unafanywa na utaratibu wa Uchakataji wa Tukio la Nje
Usajili wa sehemu ya nje katika 1C: Mfumo wa Biashara
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- jina la sehemu.
Njia hizi ni za kutosha kwa mwingiliano kamili kati ya VK na 1C. Ili kupokea data kutoka kwa sehemu ya nje kutoka kwa 1C: Mfumo wa Biashara na kinyume chake, sehemu ya nje hutuma ujumbe maalum, ambao kwa upande wake unachukuliwa na mfumo wa 1C na, ikiwa ni lazima, huita njia za sehemu ya nje ili kusambaza data nyuma. .

Aina ya data ya tVariant

Wakati wa kubadilishana data kati ya sehemu ya nje na 1C: Mfumo wa Biashara, aina ya data ya tVariant hutumiwa. Imeelezewa katika faili za type.h, ambazo zinaweza kupatikana kwenye diski YAKE:
muundo _tVariant ( _ANONYMOUS_UNION muungano ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint2_t_uVal; uint2l_t_t_t_t; int32_t errCode; hRes ndefu; fltVal ya kuelea; dblVal mbili; bool bVal; char chVal; wchar_t wchVal; TAREHE; IID IDVal; muundo _tVariant *pvarVal; muundo tm tmVal; _ANONYMOUS_STRUCT muundo ( batili* pInterfaceVal; IID InterfaceID; ) __VARUS_IANT_NAME_NAME; strVal; uint3 2_t strLen ; //idadi ya baiti ) __VARIANT_NAME_3/*str*/; muundo _ANONYMOUS_STRUCT ( WCHAR_T* pwstrVal; uint32_t wstrLen; //hesabu ya ishara ) __VARIANT_NAME_4/*wstr*/; ) ___pensheni2;b_1; - safu ya mwelekeo katika pvarVal TYPEVAR vt;
Aina tVariant ni muundo unaojumuisha:
  • mchanganyiko (muungano) unaokusudiwa moja kwa moja kuhifadhi data
  • kitambulisho cha aina ya data
Kwa ujumla, kufanya kazi na vigezo vya aina tVariant hutokea kulingana na algorithm ifuatayo:
  1. Kuamua aina ya data iliyohifadhiwa kwa sasa katika kigezo
  2. Fikia sehemu inayolingana ya mchanganyiko ili kufikia data moja kwa moja
Kutumia aina tVariant hurahisisha mwingiliano wa 1C: Mfumo wa Biashara na vifaa vya nje

Maombi

Saraka ya "mifano" ina mifano ya makala
mifano/1 - zindua sehemu ya onyesho
mifano/2 - maonyesho ya upanuzi wa orodha ya mali
mifano/3 - maonyesho ya kupanua orodha ya mbinu
Kila saraka ina mradi wa VS 2008 na usanidi tayari wa 1C.

Teknolojia ya vipengele vya nje inakuwezesha kuunda programu (vipengele vya nje) ambavyo vitaunganisha kwa nguvu na kuingiliana kwa karibu na mfumo wa 1C:Enterprise 8, kupanua uwezo wake. Teknolojia hii inakuwezesha kuunganisha vifaa mbalimbali vya rejareja kwenye mfumo wa 1C:Enterprise 8: scanners barcode, printers lebo, nk.

API asili

Teknolojia hutumiwa kuunda vipengele vya nje API asili- kiolesura chake cha programu cha mfumo 1C:Enterprise 8. Inasaidia mifumo ya uendeshaji ya Windows na Linux, na inafanya uwezekano wa kuunda vipengele vya nje vinavyofanya kazi chini ya mfumo mmoja na mwingine wa uendeshaji. Vipengele vilivyoundwa kwa kutumia teknolojia ya Native API vinaweza kuunganishwa katika mteja mnene, kwa mteja mwembamba, katika mteja wa wavuti, kwenye muunganisho wa nje na kwenye seva ya programu.

Kiendelezi cha lugha kilichojumuishwa

Vipengele vya nje hukuruhusu kupanua lugha iliyojengwa ndani na vitu vipya. Miundo ya taratibu za vipengele vya nje ni karibu iwezekanavyo kwa miundo ya ndani ya mfumo wa 1C: Enterprise 8, ambayo huongeza ufanisi wa uendeshaji.

Kuita utaratibu wa kushughulikia matukio yanayodhibitiwa na sehemu ya nje

Sehemu ya nje inaweza kuibua matukio ambayo huchakatwa kwa utaratibu wa lugha ulioainishwa Kushughulikia Matukio ya Nje. Hii hukuruhusu kuunganisha vichanganuzi na vifaa vingine vinavyohitaji ubadilishanaji wa data kisawazisha kwenye mfumo wa 1C:Enterprise 8.

Kuongeza ukurasa wa mali kwa 1C:Enterprise 8 vigezo

Vipengele vya nje vinaweza kuongeza kurasa zao za mali kwenye kidirisha cha vigezo vya mfumo 1C:Enterprise 8. Kwa hivyo, vifaa vya rejareja vinaweza kujumuishwa kwenye mfumo na kudhibitiwa kwa njia ya kawaida ya mfumo wa 1C:Enterprise 8.

Kuhifadhi vigezo vya sehemu kupitia utaratibu wa kuokoa kigezo cha "1C:Enterprise 8".

Wakati wa kuhifadhi vigezo vyake, kijenzi cha nje kinaweza kutumia taratibu za mfumo wa 1C:Enterprise 8.

Kufikia upau wa hali

Wakati wa operesheni, hali ya sehemu ya nje inaweza kuonyeshwa kwenye paneli ya hali ya mfumo wa 1C:Enterprise 8.