გარე კომპონენტების ტექნოლოგია (). გარე კომპონენტების ტექნოლოგია () კომპონენტის შაბლონი ITS-ზე

ანსმირნოვი 2013 წლის 22 სექტემბერი დაახლოებით 14:12

გარე კომპონენტები 1C 8.2

  • პროგრამირება,
  • C++
  • სახელმძღვანელო

შედი

ამ სტატიაში მოცემულია ინფორმაცია გარე კომპონენტების მუშაობის შესახებ 1C: Enterprise სისტემაში.
ნაჩვენები იქნება 1C: Enterprise სისტემის 8.2 ვერსიის გარე კომპონენტების შემუშავების პროცესი, რომელიც მუშაობს Windows OS-ის კონტროლის ქვეშ სამუშაოს ფაილური ვერსიით. ეს ვარიანტი ხელმისაწვდომია მცირე ბიზნესისთვის შესაფერისი გადაწყვეტილებების უმეტესობაში. VK განხორციელდება ჩემი C++ პროგრამირების გამოყენებით.

"1C: Enterprise"-ის გარე კომპონენტები

„1C: Enterprise“ არის სისტემა, რომელიც ფართოვდება. სისტემის ფუნქციონალური შესაძლებლობების გასაფართოებლად გამოიყენება გარე კომპონენტები (EC). საცალო ვაჭრობის თვალსაზრისით, VK არის გარე ობიექტი, რომელსაც აქვს სიმძლავრე და მეთოდები და ასევე შეუძლია მონაცემების შექმნა 1C: Enterprise სისტემის მიერ დამუშავებისთვის.
გარე კომპონენტები შეიძლება გამოყენებულ იქნას ამოცანების განსაბლოკად, რომელთა განხორციელება რთული და შეუძლებელია პროგრამის "1C: Entrepreneurship" გამოყენებით. ასე რომ, ამ კლასში ჩვენ შეგვიძლია შევიტანოთ დავალებები, რომლებიც მოითხოვს დაბალი დონის ურთიერთქმედებას ოპერაციულ სისტემასთან, მაგალითად, კონკრეტულ აღჭურვილობასთან მუშაობისთვის.
სისტემა "1C: Enterprise" იყენებს გარე კომპონენტების მიერ შექმნილ ორ ტექნოლოგიას:
  • Wikoristannyam Native API-დან
  • vikoristannym ტექნოლოგიებით COM
ორ უაღრესად მნიშვნელოვან ტექნოლოგიას შორის საზღვრების განსაზღვრისას, განსხვავება უმნიშვნელოა, რაც ჩანს VK-ის შემუშავებაში Native API-ით. საჭიროების შემთხვევაში, დანერგვა შეიძლება შედგეს VK-ის განვითარებისთვის სხვა COM ტექნოლოგიით, ასევე, მცირე ცვლილებებით, შეიძლება შეინახოს 1C: Enterprise სისტემაში გამოსაყენებლად სხვა ოპერაციული პარამეტრებით, ადმინისტრირებული ფაილის რეჟიმში.
VK სტრუქტურა
1C-ის გარე კომპონენტი: წარმომადგენლობების საწარმო სისტემა DLL ბიბლიოთეკის სახით. ბიბლიოთეკის კოდი აღწერს IComponentBase კლასს. შექმნილ კლასს შეიძლება ჰქონდეს კონკრეტული მეთოდები, რომლებიც შეესაბამება გარე კომპონენტების ფუნქციას. უფრო დეტალური მეთოდები ქვემოთ იქნება აღწერილი მასალის გამოქვეყნებისას.

დემო VK-ის გაშვება

ზავდანნია:
  1. Vikonati დაკეცილი გარე კომპონენტები, რომლებიც მოყვება ITS გამოწერას და გამიზნულია 1C-ში გარე კომპონენტების მექანიზმის ძირითადი შესაძლებლობების დემონსტრირებისთვის.
  2. შეაერთეთ დემო კომპონენტი 1C კონფიგურაციასთან
  3. შეამოწმეთ დეკლარირებული ფუნქციების სისწორე
კომპილაცია
VK-ის დემო ვერსია დაინსტალირებულია ITS სააბონენტო დისკზე დირექტორიაში "/VNCOMP82/example/NativeAPI".
დემო VK-ის შესაქმნელად ჩვენ გამოვიყენებთ Microsoft Visual Studio 2008-ს. ამ პროდუქტის სხვა ვერსიები არ უჭერს მხარს ვიზუალური სტუდიის პროექტის ფორმატს, რომელიც გამოიყენება.


ჩვენ ვიწყებთ AddInNative პროექტს. პროექტის დაყენებისას ჩვენ ვიცავთ დირექტორიას სათაურის ფაილებით, რომლებიც აუცილებელია პროექტის შედგენისთვის. სუნის დასაბანად ის კატალოზში მოთავსებულია ITS დისკზე /VNCOMP82/შეიცავს.
კოლექციის შედეგი არის ფაილი /bind/AddInNative.dll. ეს მოიცავს შედგენილ ბიბლიოთეკას 1C კონფიგურაციასთან დასაკავშირებლად.
VK კავშირები 1C კონფიგურაციამდე
შეიძლება შეიქმნას ცარიელი კონფიგურაციით 1C.
ქვემოთ მოცემულია პროგრამის მოდულის კოდი.
ცვლადი DemoComp; პროცედურა OnEarthRobotSystem() Attach ExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.AddInNativeExtension"); კინეტების პროცედურები
ვინაიდან 1C კონფიგურაციის დაწყებისას არ იყო შეტყობინება გადატვირთვის შესახებ, VK წარმატებით იყო დაკავშირებული.
შეყვანილი კოდის შეყვანის შედეგად, კონფიგურაციის გლობალური ხილვადობა ჩნდება როგორც ობიექტი DemoCompრამდენად ძლიერია გარე კომპონენტების კოდში განსაზღვრული მეთოდები?
ჩაშენებული ფუნქციონირების დემონსტრირება
მოდით შევამოწმოთ VK დემონსტრირების მიზანშეწონილობა. ამისათვის შევეცადოთ დააინსტალიროთ და წაიკითხოთ ხელისუფლების ნაბიჯები, დააწკაპუნეთ VK მეთოდის ნაბიჯებზე და ასევე გააუქმეთ და შედით VK შეტყობინებებზე.
ITS დისკზე მოწოდებულ დოკუმენტაციაში მითითებულია დემო VK-ის ფუნქციონირება:
  1. კომპონენტის ობიექტის მცენარეული კონტროლი
    მეთოდი: იკბინე, ვიმკნუტი
    ავტორიტეტი: შედის
  2. კონტროლირებადი ტაიმერი
    კომპონენტის ყოველი წამი გაძლიერებულია "1C: Enterprise" სისტემის შეტყობინებით პარამეტრებით. Კომპონენტი, ტაიმერიდა სისტემური ერთი წლის ექიმის გვერდით.
    მეთოდი: StartTimer, StopTimer
    ავტორიტეტი: Є ტაიმერი
  3. მეთოდი ShowRowStatus, რომელიც აჩვენებს ტექსტს მწკრივის სტატუსში, მეთოდით გადაცემული პარამეტრების სახით
  4. მეთოდი VantagePicture. ის იღებს სურათებს მინიჭებული ფაილიდან და გადასცემს მას "1C: Enterprise" სისტემაში ორმაგი მონაცემების სახით.
ჩვენ განვიხილავთ ამ ფუნქციების სარგებლიანობას. ვისი ანგარიშისთვის არის შეურაცხმყოფელი კოდი:
ცვლადი DemoComp; პროცედურა AtStartRobotSystem()ConnectExternalComponent(...); DemoComp = New ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Wimcnuti(); ჩვენება (DemoComp.Enabled); DemoComp.Enable(); ჩვენება (DemoComp.Enabled); DemoComp.StartTimer(); EndProceduresProcedureProcedureProcessExternalPod(Dzherelo, Podiya,Dani) Show(Dzherelo + " " + Podiya + " " +Dani); კინეტების პროცედურები
კონფიგურაციის დაწყების შედეგი ნაჩვენებია სურათზე


შეფასების მეთოდების შედეგები ნაჩვენებია "ანგარიშის" პანელზე DemoComp.Wimcnuti()і Demo.Comp.Enable(). იმავე პანელზე მომდევნო სტრიქონები აჩვენებს VK-დან ამონაწერების დამუშავების შედეგებს. ძერელო, პოდიაі დანიაშკარად.

მეტი გარე კომპონენტები

მოთხოვნა: შეცვალეთ გარე ნაწილების სახელი უფრო მეტად.
წინა განყოფილებას აქვს vikory ID AddInNative Extensionყოველგვარი ახსნა-განმარტების გარეშე. ამ ვიდეოში AddInNative Extension- ეს სახელი გაფართოვდა.
VK კოდს აქვს მინიჭებული მეთოდი RegisterExtensionAs, რომელიც გადასცემს სახელებს 1C: Enterprise სისტემაში, რომელიც აუცილებელია VK-ის შემდგომი რეგისტრაციისთვის სისტემაში. რეკომენდებულია იდენტიფიკატორის მითითება, რომელიც ნათლად ავლენს გარე კომპონენტების არსს.
დაამატეთ ახალი კოდი მეთოდს RegisterExtensionAsგაფართოების შეცვლილი სახელების გამო:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T*(vo-SomeSe,Dest*Name) (WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); დაბრუნება true; ) ცრუ დაბრუნება;
არჩეული აპლიკაციის VK სახელი შეიცვალა SomeName. თუ დაკავშირებული ხართ VK-თან, უნდა შეიყვანოთ ახალი სახელი:
DemoComp = New ("AddIn.DemoVK.SomeName");

VK ავტორიტეტების სიის გაფართოება

ზავდანნია:
  1. განიხილეთ VK ავტორიტეტების განხორციელება
  2. დაამატეთ ძალა ჩვეულებრივ ტიპს, რომელიც ხელმისაწვდომია კითხვისა და წერისთვის
  3. ჩვეულებრივ ტიპზე სიმძლავრის დამატებისას, ჩანაწერი ხელმისაწვდომია წასაკითხად, რაც ინახავს დარჩენილი დაინსტალირებული სიმძლავრის მონაცემთა ტიპს. ძალაუფლების დადგენილი ღირებულებით, არანაირი ქმედება არ ჩავარდება

შექმნილი კომპონენტის სიმძლავრის გასაკონტროლებლად, დეველოპერმა უნდა განახორციელოს შემდეგი მეთოდები AddInNative.cpp ბიბლიოთეკის კოდში:
GetNProps
აბრუნებს ამ გაფართოების ძალაუფლების რაოდენობას, 0 – ძალაუფლების რაოდენობას
FindProp
აქცევს ავტორიტეტის სერიულ ნომერს, რომლის სახელიც გადაცემულია პარამეტრებში
GetPropName
აბრუნებს ავტორიტეტის სახელს მისი სერიული ნომრით და გადაცემული ფილმის იდენტიფიკატორით
GetPropVal
აბრუნებს სიმძლავრის მნიშვნელობებს მინიჭებული რიგითი ნომრიდან
SetPropVal
ადგენს სიმძლავრის მნიშვნელობას დანიშნული რიგითი ნომრიდან
IsPropReadable
ნიშანი აბრუნებს ნიშანს დანიშნულ სერიული ნომრიდან წაკითხვის სიმძლავრის შესაძლებლობის შესახებ
IsPropWritable
აბრუნებს სიგნალის ნიშანს სიმძლავრის ჩაწერის შესაძლებლობის განსაზღვრული სერიული ნომრიდან


მოდით შევხედოთ კლასში ინექციის მეთოდების დანერგვას CAddInNative.
დემონსტრაცია VK-ს აქვს 2 ძალა: შედისі Є ტაიმერი (ჩართულიაі IsTimerPresent).
ბიბლიოთეკის კოდის გლობალურ ფარგლებს აქვს ორი მასივი მინიჭებული:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); სტატიკური wchar_t *g_PropNamesRu = (L"გამორთული", L"ტაიმერი");
რომლებიც ინარჩუნებენ ავტორიტეტების რუსულ და ინგლისურ სახელებს. სათაურის ფაილში AddInNative.hზედაზღვევა მითითებულია:
enum Props(ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Always last);
ePropIsEnabledі ePropIsTimerPresent 0 და 1 მნიშვნელობები ნამდვილად შეიძლება გამოყენებულ იქნას ავტორიტეტების რიგითი ნომრების იდენტიფიკატორის მნიშვნელობით შესაცვლელად. ePropLast, მნიშვნელობით 2, გამოიყენება რიგი ავტორიტეტების მოსაშორებლად (GetNProps მეთოდის გამოყენებით). ეს სახელები ჩამოთვლილია მხოლოდ კომპონენტის კოდისა და მიუწვდომელი ზარების შუაში.
FindProp და GetPropName მეთოდები ეძებს მასივებს g_PropNamesі g_PropNamesRu.
ბიბლიოთეკის მოდულში ველების მნიშვნელობების შესანახად, CAddInNative კლასს აქვს სიმძლავრის მნიშვნელობები, რომლებიც ინახავს კომპონენტების სიმძლავრის მნიშვნელობებს. მეთოდები GetPropValі SetPropValაშკარაა ამ ავტორიტეტების როტაცია და მნიშვნელობის დადგენა.
მეთოდები IsPropReadableі IsPropWritableდა როტაცია მართალიაან კიდევ ყალბი, ყურადღებით გადაცემული სიმძლავრის სერიული ნომრიდან შეესაბამება პროგრამის ლოგიკას.
საკმარისი სიმძლავრის დასამატებლად საჭიროა:

  1. დაუმატეთ ხელისუფლებას ის, რაც ხელმისაწვდომია მასივში g_PropNamesі g_PropNamesRu(ფაილი AddInNative.cpp)
  2. პერელიკში რეკვიზიტები(ფაილი AddInNative.h) ადრე ePropLastდაამატეთ რაღაც, რაც ნათლად განსაზღვრავს ხელისუფლებას, რა არის საჭირო
  3. მეხსიერების ორგანიზება ავტორიტეტების მნიშვნელობების შესანახად (შეიტანეთ ველები კომპონენტურ მოდულში, რომელიც ინახავს კონკრეტულ მნიშვნელობებს)
  4. შეიტანეთ ცვლილებები მეთოდებში GetPropValі SetPropValწინა მხარეს დანახულ მეხსიერებასთან ურთიერთობისთვის
  5. მნიშვნელოვანია პროგრამის ლოგიკის შეცვლა მეთოდებზე IsPropReadableі IsPropWritable
1, 2, 5 პუნქტები განმარტებას არ საჭიროებს. ამ პირობების განხორციელების დეტალები შეგიძლიათ იხილოთ სტატისტიკის დანამატის წაკითხვით.
დამო დაურეკე გამოცდის ორგანოებს ტესტიі ტიპის შეცვლააშკარად. მაშასადამე, შემდეგი 1 პუნქტის შედეგად:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"დამატებულია", L"Timer", L"Test", L"TypeCheck");
პერელიკი რეკვიზიტებიმატიმე ვიგლიადი:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // ყოველთვის ბოლო);
კოდის მნიშვნელოვანი სიმარტივისთვის გამოიყენეთ STL C++. Zokrema, რიგებში რობოტებისთვის WCHAR, დააკავშირეთ ბიბლიოთეკა სტრიქონი.
მეთოდის ღირებულების შესანახად ტესტიკლასში მნიშვნელოვანი CAddInNativeხილვადობის ზონის კერძო ველში:
სიმებიანი ტესტი1;
მწკრივის პარამეტრების გადასატანად „1C:Enterprise“-სა და გარე კომპონენტს შორის, გამოიყენება „1C:Enterprise“ მეხსიერების მენეჯერი. მოდით შევხედოთ მის მოხსენებას. მეხსიერების სანახავად და შესანახად გამოიყენეთ შემდეგი ფუნქციები: AllocMemoryі თავისუფალი მეხსიერება, მინიჭებული ფაილზე ImemoryManager.h. თუ საჭიროა რიგის პარამეტრის გადატანა 1C: Entrepreneurship სისტემაში, გარე კომპონენტს შეუძლია დაინახოს მის ქვეშ არსებული მეხსიერება ფუნქციის დაჭერით. AllocMemory. პროტოტიპი ასე გამოიყურება:
ვირტუალური bool ADDIN_API AllocMemory (void** pMemory, ხელმოუწერელი გრძელი ulCountByte) = 0;
დე p მეხსიერება- დეპოზიტორის მისამართი, რომელიც შეიცავს ხილული მეხსიერების ბლოკის მისამართს,
ulCountByte- მეხსიერების ყუთის ზომა, რომელიც ჩანს.
ზედიზედ მეხსიერების ხედის მაგალითი:
WCHAR_T * t1 = NULL, * ტესტი = L "TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
რიგის მონაცემთა ტიპებთან მუშაობის გამარტივებისთვის, ჩვენ აღვწერთ ფუნქციას wstring_to_p. ვონი შლის wstring-row პარამეტრს. ფუნქციის შედეგია სტრუქტურის შევსება tVariant. ფუნქციის კოდი:
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(); დაბრუნება true;
ეს ასევე არის მეთოდის შეცვლა განაცხადის შემთხვევაში GetPropValᲕნახავ:
case ePropTest1: wstring_to_p(test1, pvarPropVal); შესვენება;
მეთოდი SetPropVal:
შემთხვევა ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) დააბრუნებს false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); შესვენება;
სხვა უფლებამოსილებების განსახორციელებლად მნიშვნელოვანია კლასის ველი CaddInNative
uint8_t ბოლო_ტიპი;
ამ შემთხვევაში შეინახება დარჩენილი გადაცემული მნიშვნელობის ტიპი. CaddInNative::SetPropVal მეთოდის გამოსაყენებლად დაამატეთ შემდეგი ბრძანება:
ბოლო_ტიპი = TV_VT(varPropVal);
ახლა, როდესაც ჩაწერთ სხვა სიმძლავრის წაკითხვის მნიშვნელობას, თქვენ დაატრიალებთ მნიშვნელობას ბოლო_ტიპირას წარმოადგენს დასახული დავალება?
მოდით შევამოწმოთ ცვლილებების მიზანშეწონილობა.
ამ მიზნით, მოდით მოვიყვანოთ მიმდინარე 1C კონფიგურაცია ასე გამოიყურებოდეს:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Show(Row(DemoComp.CheckType)); DemoComp.Test = "ვასია"; Show(Row(DemoComp.Test)); DemoComp.Test = "პეტია"; Show(Row(DemoComp.Test)); Show(Row(DemoComp.CheckType)); კინეტების პროცედურები
შედეგად, გაშვებას ეძლევა შემდეგი შეტყობინებების თანმიმდევრობა:
3
ვასია
პეტრო
22

მეორე მესამე ინფორმაცია პირველ რიგში დამკვიდრებული ძალაუფლების კითხვის შედეგია. პირველი, რაც უნდა გააკეთოთ, არის შურისძიება დარჩენილი ჩამოყალიბებული ძალაუფლების ტიპზე. 3 შეესაბამება მთელ მნიშვნელობას, 22 მწკრივის მნიშვნელობას. ფაილში დამონტაჟებულია ტიპების მრავალფეროვნება და მათი კოდები ტიპები.თ, რომელიც არის ITS დისკზე.

მეთოდების გაფართოებული სია

ზავდანნია:
  1. გააფართოვეთ გარე კომპონენტების ფუნქციონირება დამატებითი ფუნქციებით:
  2. ისწავლეთ როგორ დანერგოთ მეთოდები გარე კომპონენტებში
  3. დაამატეთ ფუნქციის მეთოდი ფუნქცია 1, ვინაიდან პარამეტრი იღებს ორ რიგს („Parameter1“ და „Parameter2“). შედეგად, რიგი ასე იქცევა: „ხელახალი შემოწმება. პარამეტრი 1, პარამეტრი 2"
  4. გადაიყვანეთ ამ ცვლილებების სარგებლიანობაზე

შექმნილი კომპონენტის მეთოდების განსახორციელებლად, დეველოპერმა უნდა განახორციელოს ასეთი მეთოდები AddInNative ბიბლიოთეკის კოდში:
GetNMethods, FindMethod, GetMethodName
განკუთვნილია რამდენიმე მეთოდის არჩევისთვის მეთოდის ნომრისა და სახელის ძიებით. ხელისუფლების მსგავსი მეთოდების მსგავსი
GetNParams
აბრუნებს მეთოდის პარამეტრების რაოდენობას მინიჭებული სერიული ნომრიდან; თუ ასეთი რიცხვის მქონე მეთოდი ყოველდღიურია ან არ აქვს პარამეტრები, დაატრიალეთ 0
GetParamDefValue
აბრუნებს მითითებული მეთოდის შეყვანილი პარამეტრის მნიშვნელობას
HasRetVal
აბრუნებს მეთოდის ხილვადობის მიმდევრობას დასაბრუნებელი მნიშვნელობის მითითებულ რიგითი რიცხვით: ჭეშმარიტი შემბრუნებელი მნიშვნელობების მქონე მეთოდებისთვის ყალბისხვა შემთხვევაში
CallAsProc
ყალბი 1C მოდული: Enterprises გამოიყენება საათის წყალობის გამო. პარამეტრების მასივის მეხსიერება ჩანს და ხელმისაწვდომია 1C: Enterprise-ში.
CallAsFunc
მეთოდი იდენტიფიცირებულია მინიჭებული სერიული ნომრით. მეთოდი გარდამტეხია ყალბი 1C მოდული: Enterprises გამოიყენება საათის წყალობის გამო. ავტორიტეტების მასივის მეხსიერება განიხილება როგორც 1C: Enterprise. ვინაიდან შებრუნებული მნიშვნელობა არის მწკრივი ან ორმაგი მონაცემთა ტიპი, კომპონენტი ხედავს მეხსიერების ფუნქციას AllocMemoryმეხსიერების მენეჯერი იქ წერს მონაცემებს და ინახავს ამ მისამართს სტრუქტურის სპეციალურ ველში. 1C: საწარმო ამ მეხსიერების დაწკაპუნებით ამოიღებს თავისუფალი მეხსიერება.
მეთოდების სრული აღწერა, პარამეტრების ჩამონათვალის ჩათვლით, ანგარიშების აღწერა დოკუმენტაციაში, რომელიც მოწოდებულია ITS დისკზე.
მოდით შევხედოთ აღწერილი მეთოდების განხორციელებას.
კომპონენტის კოდს აქვს ორი მასივი:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Turn on", L"Vimknuti", L"Show in rowStatus", L"StartTimer", L"StopTimer", L"EnterBaby");
ეს გადაჭარბებული რეაქცია:
enum მეთოდები (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // ყოველთვის ბოლო);
სუნი არის vikorystvuyutsya ფუნქციები GetNMethods, FindMethodі GetMethodName, ავტორიტეტების აღწერის ანალოგიით.
მეთოდები GetNParams, GetParamDefValue, HasRetValგადართვის განსახორციელებლად მნიშვნელოვანია პარამეტრების გადაცემა და პროგრამის ლოგიკა საჭირო მნიშვნელობების დასატრიალებლად. მეთოდი HasRetValთქვენს კოდს ასევე აქვს მეთოდების სია, რომლებსაც შეუძლიათ შედეგის როტაცია. მათთვის ღვინო ბრუნდება მართალია. ფოლადის ყველა მეთოდისთვის, როტაცია ყალბი.
მეთოდები CallAsProcі CallAsFuncშურისძიება არასწორი კოდის მეთოდზე.
მეთოდის დასამატებლად, რომელიც შეიძლება გამოიძახოთ როგორც ფუნქცია, თქვენ უნდა შეიტანოთ ცვლილებები გარე კომპონენტის გამომავალ კოდში:
  1. დაამატეთ მეთოდების სახელები მასივებში g_MethodNamesі g_MethodNamesRu(ფაილი AddInNative.cpp)
  2. მეთოდის გადაცემამდე დაამატეთ ინფორმაცია იდენტიფიკატორის შესახებ (ფაილი AddInNative.h)
  3. შეიტანეთ ცვლილებები ფუნქციის კოდში GetNParamsპროგრამის ლოგიკაზეა დამოკიდებული
  4. საჭიროების შემთხვევაში, შეიტანეთ ცვლილებები მეთოდის კოდში GetParamDefValue, თუ გჭირდებათ მეთოდის პარამეტრების უკან არსებული მნიშვნელობების გაგება.
  5. შეიტანეთ ცვლილებები ფუნქციაში HasRetVal
  6. შეიტანეთ ცვლილებები რობოტის ფუნქციების ლოგიკაში CallAsProcან კიდევ CallAsFunc, იქ მოათავსეთ კოდი უშუალოდ დაკავშირებული მეთოდისთვის.
ხელმძღვანელობით მასივი g_MethodNamesі g_MethodNamesRu, ასევე გადაჭარბებული ექსპოზიცია მეთოდებისანამ არ ვნახავ:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Enable", L"Vimknuti", L"ShowInRowStatus", L"StartTimer", L"StopTimer", L"ZavantazhitiMalyunok", L"Test");

Enum Methods (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // ყოველთვის ბოლო);
არჩევადი ფუნქცია GetNPropsპარამეტრების რაოდენობის შესაცვლელად "ტესტი" მეთოდით:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default:)
გთხოვთ შეიტანოთ ცვლილებები ფუნქციაში:
Bool Caddinnative :: getparamdefvalue (Consta Long Lmethodnum, Cost Long lparamnum, TVariant *pvarparamdefvalue (tv_vt (PvarparamDeFvalue) = VTYPE_EMPTY; SWITCH (LMETHODN UM) Statusline: EmertHemart: /Casestopeet პარამეტრის მნიშვნელობები არ არის ნაგულისხმევი შესვენება ნაგულისხმევი: დაბრუნების ცრუ;) დაბრუნება ყალბი;
ზავდიაკი მოცემულ რიგზე
საქმე eMethTest:
თუ არსებობს ერთი ან მეტი არგუმენტი, შესაბამის პარამეტრებს ექნება ცარიელი მნიშვნელობები ( VTYPE_EMPTY). პარამეტრის პარამეტრების შეყვანა აუცილებელია განყოფილებაში მისი მითითების შემდეგ eMethTestგადართვის ფუნქციის განცხადება CAddInNative::GetParamDefValue.
ვინაიდან „ტესტის“ მეთოდს შეუძლია მნიშვნელობების როტაცია, თქვენ უნდა შეიტანოთ ცვლილებები ფუნქციის კოდში HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; ნაგულისხმევი: return false; ) return false; )
მე ვამატებ კოდს მეთოდს და ფუნქციას CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(LoMethodNum) (შემთხვევა eMeSparay if|s! დაბრუნება false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; break;) დაბრუნება ret;
მოდით შევადგინოთ კომპონენტი და დავაყენოთ კონფიგურაციის კოდი ასე გამოიყურებოდეს:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); lane = DemoComp.Test ("Hello", "Light!"); Povidomity (ტრანს); კინეტების პროცედურები
კონფიგურაციის დაწყების შემდეგ ჩნდება შეტყობინება: „გამარჯობა, სინათლე!“, რათა დაადასტუროს, რომ მეთოდი წარმატებით დასრულდა.

ტაიმერი

ზავდანნია:
  1. წაიკითხეთ ტაიმერის განხორციელება დემო VK-დან
  2. შეცვალეთ "StartTimer" მეთოდი, დაამატეთ ტაიმერის მოთხოვნის ინტერვალის პარამეტრებში გადაცემის შესაძლებლობა (მილიწამებში)
  3. გადაიყვანეთ ამ ცვლილებების სარგებლიანობაზე

WinAPI რობოტებისთვის საშუალებას გაძლევთ სწრაფად მიიღოთ შეტყობინებები ერთ საათში WM_TIMER. გთხოვთ, გაითვალისწინოთ, რომ თქვენი პროგრამა დასრულდება ერთსაათიანი ინტერვალის შემდეგ, რომელიც თქვენ დააყენეთ ტაიმერისთვის.
ტაიმერის შესაქმნელად გამოიყენება შემდეგი ფუნქცია: SetTimer:
UINT SetTimer(HWND hWnd, // ფანჯრის აღწერა UINT nIDevent, // ტაიმერის ID (ნომერი) UINT nElapse, // დაგვიანებით TIMERPROC lpTimerFunc); // ფუნქციის მაჩვენებელი
ოპერაციული სისტემა დამატებითი ინფორმაციისთვის WM_TIMERპროგრამას ინტერვალებით ვაძლევთ არგუმენტს გასვლა(მილიწამებში). დანარჩენ პარამეტრში შეგიძლიათ მიუთითოთ ფუნქცია, რომელიც შეიძლება გამორთოთ კანის ტაიმერის გააქტიურებისას. ამ ფუნქციის სათაური შეიძლება ასე გამოიყურებოდეს (ეს შეიძლება იყოს მსგავსი):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
მოდით შევხედოთ ტაიმერის განხორციელებას დემო VK-ზე.
ასე რომ, როდესაც ჩვენ ვუყურებთ Windows ოპერაციული სისტემის გარე კომპონენტების შემუშავების პროცესს, ჩვენ არ ვუყურებთ ტაიმერის დანერგვას სხვა ოპერაციულ სისტემებში. მოკლედ რომ ვთქვათ, GNU/Linux OS-ისთვის დანერგვა განსხვავდება ფუნქციის სინტაქსის მიხედვით SetTimerі TimerProc.
შემდეგი კოდი იწოდება მეთოდით SetTimer, ფუნქციის გადაცემამდე MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
შექმნილი ტაიმერის ID მდებარეობს მენიუში m_uiTimerასე რომ თქვენ შეგიძლიათ ჩართოთ იგი.
ფუნქცია MyTimerProcუყურებს მომავალ წოდებას:
ბათილი გამოძახება MyTimerProc(HWND hwnd, // ტაიმერის შეტყობინებების ფანჯრის სახელური UINT uMsg, // WM_TIMER შეტყობინება UINT idEvent, // ტაიმერის იდენტიფიკატორი DWORD dwTime // სისტემის მიმდინარე დრო) ( if (!pAsyncEvent) დაბრუნების; wCompon *what = L"Timer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); , what, wstime); წაშალე wstime; ) )
ფუნქციის არსი არის ის, რომ ის უწოდებს მეთოდს გარე ღონისძიება, რას იძლევა 1C: Enterprise სისტემის შეტყობინება.
მეთოდის ფუნქციონირების გაფართოება StartTimerვცადოთ შემდეგი:
მეთოდის კოდის შეცვლა GetNParamsასე რომ, მეთოდისთვის eMethStartTimerბრუნვის მნიშვნელობა 1:
საქმე eMethStartTimer: დაბრუნება 1;
მოდით მივუთითოთ კოდი მეთოდზე CallAsProcსანამ არ ვნახავ:
შემთხვევა 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;
ახლა შევამოწმოთ უპირატესობა. ამისათვის ჩვენ ჩავწერთ კოდს კონფიგურაციის დამატებით მოდულში:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); კინეტების პროცედურები
კონფიგურაციის დაწყების შემდეგ, პროგრამამდე უნდა იყოს შეტყობინება 2 წამის ინტერვალით, რაც ნიშნავს, რომ ტაიმერი მუშაობს სწორად.

ურთიერთქმედება 1C: Enterprise სისტემასთან

გარე კომპონენტსა და 1C: Enterprise სისტემას შორის ურთიერთქმედებისთვის გამოიყენება ფაილში აღწერილი IAddInDefBase კლასის მეთოდები. AddInDefBase.h. ყველაზე ხშირად შეურაცხმყოფელი ინტერპრეტაციებია:
გაფიცვის შესახებ შეტყობინების გენერაცია
ვირტუალური bool ADDIN_API AddError (ხელმოუწერელი მოკლე wcode, const WCHAR_T* წყარო, const WCHAR_T* descr, long scode)
wcode, კოდი- კომპილაციის კოდები (კომპილაციის კოდების სია აღწერილობით შეგიძლიათ იხილოთ ITS დისკზე)
წყარო-ძერელო პატიობს
აღწერ- ცვლილებების აღწერა
გაძლიერებული შეტყობინება „1C: Entrepreneurship“ სისტემის შესახებ
ვირტუალური bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszწყარო- აღნიშნავს ძერელო
wszმესიჯი- განცხადების ტექსტი
wszData- მონაცემთა გადაცემა
ხელახალი ექსპოზიცია ხორციელდება გარე გრუნტის დამუშავების პროცედურით
გარე კომპონენტების რეგისტრაცია 1C: Enterprise სისტემაში
ვირტუალური bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- კომპონენტი მე ვარ.
ეს მეთოდები უზრუნველყოფს საკმარის ურთიერთქმედებას VK-სა და 1C-ს შორის. 1C: Enterprise სისტემის გარე კომპონენტიდან მონაცემების ამოსაღებად, გარე კომპონენტი აგზავნის სპეციალურ ინფორმაციას 1C სისტემის მუშაობის შესახებ და, საჭიროების შემთხვევაში, უწოდებს გარე მეთოდებს ახალ კომპონენტებს კარიბჭის მონაცემთა გადაცემისთვის.

მონაცემთა ტიპი tVariant

გარე კომპონენტსა და 1C: Enterprise სისტემას შორის მონაცემთა გაცვლისას არჩეულია tVariant მონაცემთა ტიპი. აქ მოცემულია ფაილის ტიპების.h აღწერილობები, რომლებიც შეგიძლიათ იხილოთ ITS დისკზე:
struct _tVariant ( _ANONYMOUS_UNION გაერთიანება ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; ხელმოუწერელი int uintVal; int64_t llVal; uint8_t ui8Val; uint8_t ui8Val; uint_Vrrtalt ხანგრძლივი h Res; float fltVal; ორმაგი dblVal; bool bVal; char chVal; wchar_t wchVal; DATE თარიღი; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; al;uint32_t strLen; //ბაიტების რაოდენობა) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUV_t; / სიმბოლოების რაოდენობა ) განზომილებიანი მასივი pvarVal TYPEVAR vt;);
ტიპი tVariantარის სტრუქტურა, რომელიც მოიცავს:
  • sumish (გაერთიანება), აღიარებულია შუაში მონაცემთა შენახვისთვის
  • მონაცემთა ტიპის იდენტიფიკატორი
ცვალებადი ტიპის რობოტის zagalnym ტიპის რობოტში tVariantმიჰყევით მომავალ ალგორითმს:
  1. მონაცემების ტიპის მიხედვით, რომელიც ამჟამად ინახება ცვლილებასთან ერთად
  2. გადაახვიეთ სუმიშას ხილულ ველზე, მონაცემების დაუყოვნებელი წვდომისთვის
ვიკორისტანნია ტიპი tVariantმნიშვნელოვნად გაამარტივებს ურთიერთქმედებას 1C: Enterprise სისტემასა და გარე კომპონენტებს შორის

დანამატი

მაგალითების კატალოგი სტატისტიკაზე კონდახის განთავსებისთვის
მაგალითები/1 - დემო კომპონენტის გაშვება
მაგალითები/2 - ავტორიტეტების სიის გაფართოების დემონსტრირება
მაგალითები/3 - მეთოდების გაფართოებული სიის დემონსტრირება
Kozhen-ის კატალოგი, VS 2008 პროექტი და მზა 1C კონფიგურაცია.

ოლეგ ფილიპივი ANT-Inform, განათლების დეპარტამენტის უფროსის შუამავალი, [ელფოსტა დაცულია]

1C: Enterprises-ის გაფართოებადი ფუნქციონირება
ნაწილი 1. COM-ის გარე კომპონენტები

1C კანის დეველოპერის ცხოვრებაში დგება მომენტი, როდესაც მის წინაშე დაყენებული დავალება აღემატება 1C პლატფორმის შესაძლებლობებს. მოდით გადავხედოთ "მოჟლივის კიდეების განკურნების" გზებს

დასრულებული 1C დეველოპერები უკვე, მელოდიური, სტატიის სათაურის პირველი სამი სიტყვის შემდეგ, მიხვდნენ, რომ იყო ახალი კომპონენტები 1C: Enterprise-სთვის. ეს ტექნოლოგია არსებობს 1C:Enterprise 7.7 პლატფორმიდან (ან უფრო ადრე). ისტორიულად, ის ძირითადად გამოჩნდა კომერციულ აღჭურვილობასთან ურთიერთქმედების უმაღლეს დონეზე (შტრიხკოდების სკანერები, ელექტრონული სარდაფები, სალარო აპარატები), რაც საჭიროებს 1C პლატფორმის მიერ სიმღერების პროცესების დამუშავებას, რომლებიც იწყებენ საკუთრებას. ეს იგივეა, რაც ბაიტების თანმიმდევრობა, რომლებიც მიდიან COM/LPT პორტებში. რა თქმა უნდა, არ იქნება სწორი 1C პლატფორმის ადაპტირება ასეთი დაბალი სიჩქარის მექანიზმებთან მუშაობისთვის, ასე რომ, შეიძლება გამოვიცნოთ უახლესი კომპონენტების ტექნოლოგია 1C: Enterprise-ისთვის.

სტატიების ეს სერია არანაკლებ ეხება გარე კომპონენტებს: გარე კომპონენტებმა უნდა დაასრულონ დაძაბულობა და დასაკეცი მექანიზმი, ამიტომ მათი როლი ყველაზე მნიშვნელოვანი ამოცანების შესრულებად ითვლება "იარაღიდან კეხზე სროლა". ეს გარე კომპონენტები ყველაზე უნივერსალური გზაა სხვადასხვა ამოცანების შესასრულებლად, რომლებიც სცილდება 1C:Enterprise პლატფორმის ფარგლებს და, შესაბამისად, ჩვენ შეგვიძლია მათი ჩართვაც. სტატისტიკა განიხილავს ახალი კომპონენტების უძველეს, ხშირად შესწორებულ და ხელახლა გადამოწმებულ ტექნოლოგიას - COM-ზე დაფუძნებული.

რა არის გარე კომპონენტები?

გარე კომპონენტები, როგორც ზემოთ აღინიშნა, გამოჩნდა 1C: Enterprise-ში 7.7 ვერსიით. ტრადიციიდან დაწყებული, 1C პლატფორმის დეველოპერები „არ მოტყუებულან“, ხოლო გარე კომპონენტები წარმოადგენდნენ ობიექტს, რომელსაც აქვს სავალდებულო ავტორიტეტები და მეთოდები. კომპონენტები, როგორც ჩანს, ნათელი და სრულია. ეს კომპონენტები, დაწერილი 1C: Enterprise 7.7-ისთვის, (თეორიულად) მუშაობს 1C: Enterprise 8.3-თან.

პრაქტიკაში, არსებობს მთელი რიგი დახვეწილობა: ვინაიდან გარე კომპონენტი აქტიურად ურთიერთქმედებს თავად პლატფორმასთან, მისი ფუნქციები სპეციალიზირებული იქნება კონკრეტული ვერსიისთვის.

8.2 ვერსიით 1C:Enterprise-ში გამოჩნდა გარე კომპონენტების შემუშავების ახალი ტექნოლოგია, ე.წ. NativeAPI. ამ ტექნოლოგიის გამოყენებით დაწერილი კომპონენტები არ არის COM ობიექტები. ერთის მხრივ, ეს პლიუსი - ეს კომპონენტები არ საჭიროებს რეგისტრაციას, მეორეს მხრივ, შეუძლებელია მათი ვიკორისტანი, გარდა 1C:Enterprise პლატფორმისა. გარე კომპონენტების შემუშავება კიდევ უფრო რთული გახდა, ბრალია კიდევ რამდენიმე ირიბი ინტერფეისი. მის შესახებ ინფორმაცია ახლანდელ სტატისტიკაშიც არის.

გარე კომპონენტები და ტექნოლოგია COM

მე დეტალურად არ აღვწერ თავად COM ტექნოლოგიას, რადგან ამ თემაზე უამრავი ლიტერატურა არსებობს. ადვილია იმის თქმა, რომ საწყისი inproc სერვერის შექმნა „დაბნეულია“ 1C:Enterprise-ისთვის გარე კომპონენტების შექმნით, მაგრამ ეს არც ისე შორს არის სიმართლისგან. ხშირად შეგიძლიათ გაუმკლავდეთ მხოლოდ ამ ფუნქციონირებას. როგორ შევქმნათ COM ობიექტი Visual Studio-ში, აღწერილია სხვადასხვა გზით. ზოკრემა, ადამიანმა დაწერა დეტალურად, თუ როგორ უნდა გააკეთოს ეს, 1C: Enterprise ვებსაიტის კონდახით.

თუ მაინც გსურთ 1C:Enterprise-ისთვის სრულფასოვანი COM გარე კომპონენტის შემუშავება (ოფციონებიდან, რომლებიც შეიძლება დაგჭირდეთ, მე შემიძლია მოვიფიქრო მხოლოდ ერთი - კომპონენტს შეუძლია აქტიურად იმოქმედოს სისტემასთან 1C პლატფორმაზე, აცნობოს კორისტუვაჩოვს, შეცვალოს სტატუსის მწკრივი, დიალოგური ფანჯრების ჩვენება და ა.შ.), მაშინ აუცილებელია გარე კომპონენტების ტექნოლოგიის დაჩქარება. მოდი, ვნახოთ.

  • სახელმძღვანელო

შედი

ამ სტატიაში მოცემულია ინფორმაცია გარე კომპონენტების მუშაობის შესახებ 1C: Enterprise სისტემაში.
ნაჩვენები იქნება 1C: Enterprise სისტემის 8.2 ვერსიის გარე კომპონენტების შემუშავების პროცესი, რომელიც მუშაობს Windows OS-ის კონტროლის ქვეშ სამუშაოს ფაილური ვერსიით. ეს ვარიანტი ხელმისაწვდომია მცირე ბიზნესისთვის შესაფერისი გადაწყვეტილებების უმეტესობაში. VK განხორციელდება ჩემი C++ პროგრამირების გამოყენებით.

"1C: Enterprise"-ის გარე კომპონენტები

„1C: Enterprise“ არის სისტემა, რომელიც ფართოვდება. სისტემის ფუნქციონალური შესაძლებლობების გასაფართოებლად გამოიყენება გარე კომპონენტები (EC). საცალო ვაჭრობის თვალსაზრისით, VK არის გარე ობიექტი, რომელსაც აქვს სიმძლავრე და მეთოდები და ასევე შეუძლია მონაცემების შექმნა 1C: Enterprise სისტემის მიერ დამუშავებისთვის.
გარე კომპონენტები შეიძლება გამოყენებულ იქნას ამოცანების განსაბლოკად, რომელთა განხორციელება რთული და შეუძლებელია პროგრამის "1C: Entrepreneurship" გამოყენებით. ასე რომ, ამ კლასში ჩვენ შეგვიძლია შევიტანოთ დავალებები, რომლებიც მოითხოვს დაბალი დონის ურთიერთქმედებას ოპერაციულ სისტემასთან, მაგალითად, კონკრეტულ აღჭურვილობასთან მუშაობისთვის.
სისტემა "1C: Enterprise" იყენებს გარე კომპონენტების მიერ შექმნილ ორ ტექნოლოგიას:
  • Wikoristannyam Native API-დან
  • vikoristannym ტექნოლოგიებით COM
ორ უაღრესად მნიშვნელოვან ტექნოლოგიას შორის საზღვრების განსაზღვრისას, განსხვავება უმნიშვნელოა, რაც ჩანს VK-ის შემუშავებაში Native API-ით. საჭიროების შემთხვევაში, დანერგვა შეიძლება შედგეს VK-ის განვითარებისთვის სხვა COM ტექნოლოგიით, ასევე, მცირე ცვლილებებით, შეიძლება შეინახოს 1C: Enterprise სისტემაში გამოსაყენებლად სხვა ოპერაციული პარამეტრებით, ადმინისტრირებული ფაილის რეჟიმში.
VK სტრუქტურა
1C-ის გარე კომპონენტი: წარმომადგენლობების საწარმო სისტემა DLL ბიბლიოთეკის სახით. ბიბლიოთეკის კოდი აღწერს IComponentBase კლასს. შექმნილ კლასს შეიძლება ჰქონდეს კონკრეტული მეთოდები, რომლებიც შეესაბამება გარე კომპონენტების ფუნქციას. უფრო დეტალური მეთოდები ქვემოთ იქნება აღწერილი მასალის გამოქვეყნებისას.

დემო VK-ის გაშვება

ზავდანნია:
  1. Vikonati დაკეცილი გარე კომპონენტები, რომლებიც მოყვება ITS გამოწერას და გამიზნულია 1C-ში გარე კომპონენტების მექანიზმის ძირითადი შესაძლებლობების დემონსტრირებისთვის.
  2. შეაერთეთ დემო კომპონენტი 1C კონფიგურაციასთან
  3. შეამოწმეთ დეკლარირებული ფუნქციების სისწორე
კომპილაცია
VK-ის დემო ვერსია დაინსტალირებულია ITS სააბონენტო დისკზე დირექტორიაში "/VNCOMP82/example/NativeAPI".
დემო VK-ის შესაქმნელად ჩვენ გამოვიყენებთ Microsoft Visual Studio 2008-ს. ამ პროდუქტის სხვა ვერსიები არ უჭერს მხარს ვიზუალური სტუდიის პროექტის ფორმატს, რომელიც გამოიყენება.


ჩვენ ვიწყებთ AddInNative პროექტს. პროექტის დაყენებისას ჩვენ ვიცავთ დირექტორიას სათაურის ფაილებით, რომლებიც აუცილებელია პროექტის შედგენისთვის. სუნის დასაბანად ის კატალოზში მოთავსებულია ITS დისკზე /VNCOMP82/შეიცავს.
კოლექციის შედეგი არის ფაილი /bind/AddInNative.dll. ეს მოიცავს შედგენილ ბიბლიოთეკას 1C კონფიგურაციასთან დასაკავშირებლად.
VK კავშირები 1C კონფიგურაციამდე
შეიძლება შეიქმნას ცარიელი კონფიგურაციით 1C.
ქვემოთ მოცემულია პროგრამის მოდულის კოდი.
ცვლადი DemoComp; პროცედურა OnEarthRobotSystem() Attach ExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.AddInNativeExtension"); კინეტების პროცედურები
ვინაიდან 1C კონფიგურაციის დაწყებისას არ იყო შეტყობინება გადატვირთვის შესახებ, VK წარმატებით იყო დაკავშირებული.
შეყვანილი კოდის შეყვანის შედეგად, კონფიგურაციის გლობალური ხილვადობა ჩნდება როგორც ობიექტი DemoCompრამდენად ძლიერია გარე კომპონენტების კოდში განსაზღვრული მეთოდები?
ჩაშენებული ფუნქციონირების დემონსტრირება
მოდით შევამოწმოთ VK დემონსტრირების მიზანშეწონილობა. ამისათვის შევეცადოთ დააინსტალიროთ და წაიკითხოთ ხელისუფლების ნაბიჯები, დააწკაპუნეთ VK მეთოდის ნაბიჯებზე და ასევე გააუქმეთ და შედით VK შეტყობინებებზე.
ITS დისკზე მოწოდებულ დოკუმენტაციაში მითითებულია დემო VK-ის ფუნქციონირება:
  1. კომპონენტის ობიექტის მცენარეული კონტროლი
    მეთოდი: იკბინე, ვიმკნუტი
    ავტორიტეტი: შედის
  2. კონტროლირებადი ტაიმერი
    კომპონენტის ყოველი წამი გაძლიერებულია "1C: Enterprise" სისტემის შეტყობინებით პარამეტრებით. Კომპონენტი, ტაიმერიდა სისტემური ერთი წლის ექიმის გვერდით.
    მეთოდი: StartTimer, StopTimer
    ავტორიტეტი: Є ტაიმერი
  3. მეთოდი ShowRowStatus, რომელიც აჩვენებს ტექსტს მწკრივის სტატუსში, მეთოდით გადაცემული პარამეტრების სახით
  4. მეთოდი VantagePicture. ის იღებს სურათებს მინიჭებული ფაილიდან და გადასცემს მას "1C: Enterprise" სისტემაში ორმაგი მონაცემების სახით.
ჩვენ განვიხილავთ ამ ფუნქციების სარგებლიანობას. ვისი ანგარიშისთვის არის შეურაცხმყოფელი კოდი:
ცვლადი DemoComp; პროცედურა AtStartRobotSystem()ConnectExternalComponent(...); DemoComp = New ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Wimcnuti(); ჩვენება (DemoComp.Enabled); DemoComp.Enable(); ჩვენება (DemoComp.Enabled); DemoComp.StartTimer(); EndProceduresProcedureProcedureProcessExternalPod(Dzherelo, Podiya,Dani) Show(Dzherelo + " " + Podiya + " " +Dani); კინეტების პროცედურები
კონფიგურაციის დაწყების შედეგი ნაჩვენებია სურათზე


შეფასების მეთოდების შედეგები ნაჩვენებია "ანგარიშის" პანელზე DemoComp.Wimcnuti()і Demo.Comp.Enable(). იმავე პანელზე მომდევნო სტრიქონები აჩვენებს VK-დან ამონაწერების დამუშავების შედეგებს. ძერელო, პოდიაі დანიაშკარად.

მეტი გარე კომპონენტები

მოთხოვნა: შეცვალეთ გარე ნაწილების სახელი უფრო მეტად.
წინა განყოფილებას აქვს vikory ID AddInNative Extensionყოველგვარი ახსნა-განმარტების გარეშე. ამ ვიდეოში AddInNative Extension- ეს სახელი გაფართოვდა.
VK კოდს აქვს მინიჭებული მეთოდი RegisterExtensionAs, რომელიც გადასცემს სახელებს 1C: Enterprise სისტემაში, რომელიც აუცილებელია VK-ის შემდგომი რეგისტრაციისთვის სისტემაში. რეკომენდებულია იდენტიფიკატორის მითითება, რომელიც ნათლად ავლენს გარე კომპონენტების არსს.
დაამატეთ ახალი კოდი მეთოდს RegisterExtensionAsგაფართოების შეცვლილი სახელების გამო:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T*(vo-SomeSe,Dest*Name) (WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); დაბრუნება true; ) ცრუ დაბრუნება;
არჩეული აპლიკაციის VK სახელი შეიცვალა SomeName. თუ დაკავშირებული ხართ VK-თან, უნდა შეიყვანოთ ახალი სახელი:
DemoComp = New ("AddIn.DemoVK.SomeName");

VK ავტორიტეტების სიის გაფართოება

ზავდანნია:
  1. განიხილეთ VK ავტორიტეტების განხორციელება
  2. დაამატეთ ძალა ჩვეულებრივ ტიპს, რომელიც ხელმისაწვდომია კითხვისა და წერისთვის
  3. ჩვეულებრივ ტიპზე სიმძლავრის დამატებისას, ჩანაწერი ხელმისაწვდომია წასაკითხად, რაც ინახავს დარჩენილი დაინსტალირებული სიმძლავრის მონაცემთა ტიპს. ძალაუფლების დადგენილი ღირებულებით, არანაირი ქმედება არ ჩავარდება

შექმნილი კომპონენტის სიმძლავრის გასაკონტროლებლად, დეველოპერმა უნდა განახორციელოს შემდეგი მეთოდები AddInNative.cpp ბიბლიოთეკის კოდში:
GetNProps
აბრუნებს ამ გაფართოების ძალაუფლების რაოდენობას, 0 – ძალაუფლების რაოდენობას
FindProp
აქცევს ავტორიტეტის სერიულ ნომერს, რომლის სახელიც გადაცემულია პარამეტრებში
GetPropName
აბრუნებს ავტორიტეტის სახელს მისი სერიული ნომრით და გადაცემული ფილმის იდენტიფიკატორით
GetPropVal
აბრუნებს სიმძლავრის მნიშვნელობებს მინიჭებული რიგითი ნომრიდან
SetPropVal
ადგენს სიმძლავრის მნიშვნელობას დანიშნული რიგითი ნომრიდან
IsPropReadable
ნიშანი აბრუნებს ნიშანს დანიშნულ სერიული ნომრიდან წაკითხვის სიმძლავრის შესაძლებლობის შესახებ
IsPropWritable
აბრუნებს სიგნალის ნიშანს სიმძლავრის ჩაწერის შესაძლებლობის განსაზღვრული სერიული ნომრიდან


მოდით შევხედოთ კლასში ინექციის მეთოდების დანერგვას CAddInNative.
დემონსტრაცია VK-ს აქვს 2 ძალა: შედისі Є ტაიმერი (ჩართულიაі IsTimerPresent).
ბიბლიოთეკის კოდის გლობალურ ფარგლებს აქვს ორი მასივი მინიჭებული:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); სტატიკური wchar_t *g_PropNamesRu = (L"გამორთული", L"ტაიმერი");
რომლებიც ინარჩუნებენ ავტორიტეტების რუსულ და ინგლისურ სახელებს. სათაურის ფაილში AddInNative.hზედაზღვევა მითითებულია:
enum Props(ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Always last);
ePropIsEnabledі ePropIsTimerPresent 0 და 1 მნიშვნელობები ნამდვილად შეიძლება გამოყენებულ იქნას ავტორიტეტების რიგითი ნომრების იდენტიფიკატორის მნიშვნელობით შესაცვლელად. ePropLast, მნიშვნელობით 2, გამოიყენება რიგი ავტორიტეტების მოსაშორებლად (GetNProps მეთოდის გამოყენებით). ეს სახელები ჩამოთვლილია მხოლოდ კომპონენტის კოდისა და მიუწვდომელი ზარების შუაში.
FindProp და GetPropName მეთოდები ეძებს მასივებს g_PropNamesі g_PropNamesRu.
ბიბლიოთეკის მოდულში ველების მნიშვნელობების შესანახად, CAddInNative კლასს აქვს სიმძლავრის მნიშვნელობები, რომლებიც ინახავს კომპონენტების სიმძლავრის მნიშვნელობებს. მეთოდები GetPropValі SetPropValაშკარაა ამ ავტორიტეტების როტაცია და მნიშვნელობის დადგენა.
მეთოდები IsPropReadableі IsPropWritableდა როტაცია მართალიაან კიდევ ყალბი, ყურადღებით გადაცემული სიმძლავრის სერიული ნომრიდან შეესაბამება პროგრამის ლოგიკას.
საკმარისი სიმძლავრის დასამატებლად საჭიროა:

  1. დაუმატეთ ხელისუფლებას ის, რაც ხელმისაწვდომია მასივში g_PropNamesі g_PropNamesRu(ფაილი AddInNative.cpp)
  2. პერელიკში რეკვიზიტები(ფაილი AddInNative.h) ადრე ePropLastდაამატეთ რაღაც, რაც ნათლად განსაზღვრავს ხელისუფლებას, რა არის საჭირო
  3. მეხსიერების ორგანიზება ავტორიტეტების მნიშვნელობების შესანახად (შეიტანეთ ველები კომპონენტურ მოდულში, რომელიც ინახავს კონკრეტულ მნიშვნელობებს)
  4. შეიტანეთ ცვლილებები მეთოდებში GetPropValі SetPropValწინა მხარეს დანახულ მეხსიერებასთან ურთიერთობისთვის
  5. მნიშვნელოვანია პროგრამის ლოგიკის შეცვლა მეთოდებზე IsPropReadableі IsPropWritable
1, 2, 5 პუნქტები განმარტებას არ საჭიროებს. ამ პირობების განხორციელების დეტალები შეგიძლიათ იხილოთ სტატისტიკის დანამატის წაკითხვით.
დამო დაურეკე გამოცდის ორგანოებს ტესტიі ტიპის შეცვლააშკარად. მაშასადამე, შემდეგი 1 პუნქტის შედეგად:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"დამატებულია", L"Timer", L"Test", L"TypeCheck");
პერელიკი რეკვიზიტებიმატიმე ვიგლიადი:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // ყოველთვის ბოლო);
კოდის მნიშვნელოვანი სიმარტივისთვის გამოიყენეთ STL C++. Zokrema, რიგებში რობოტებისთვის WCHAR, დააკავშირეთ ბიბლიოთეკა სტრიქონი.
მეთოდის ღირებულების შესანახად ტესტიკლასში მნიშვნელოვანი CAddInNativeხილვადობის ზონის კერძო ველში:
სიმებიანი ტესტი1;
მწკრივის პარამეტრების გადასატანად „1C:Enterprise“-სა და გარე კომპონენტს შორის, გამოიყენება „1C:Enterprise“ მეხსიერების მენეჯერი. მოდით შევხედოთ მის მოხსენებას. მეხსიერების სანახავად და შესანახად გამოიყენეთ შემდეგი ფუნქციები: AllocMemoryі თავისუფალი მეხსიერება, მინიჭებული ფაილზე ImemoryManager.h. თუ საჭიროა რიგის პარამეტრის გადატანა 1C: Entrepreneurship სისტემაში, გარე კომპონენტს შეუძლია დაინახოს მის ქვეშ არსებული მეხსიერება ფუნქციის დაჭერით. AllocMemory. პროტოტიპი ასე გამოიყურება:
ვირტუალური bool ADDIN_API AllocMemory (void** pMemory, ხელმოუწერელი გრძელი ulCountByte) = 0;
დე p მეხსიერება- დეპოზიტორის მისამართი, რომელიც შეიცავს ხილული მეხსიერების ბლოკის მისამართს,
ulCountByte- მეხსიერების ყუთის ზომა, რომელიც ჩანს.
ზედიზედ მეხსიერების ხედის მაგალითი:
WCHAR_T * t1 = NULL, * ტესტი = L "TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
რიგის მონაცემთა ტიპებთან მუშაობის გამარტივებისთვის, ჩვენ აღვწერთ ფუნქციას wstring_to_p. ვონი შლის wstring-row პარამეტრს. ფუნქციის შედეგია სტრუქტურის შევსება tVariant. ფუნქციის კოდი:
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(); დაბრუნება true;
ეს ასევე არის მეთოდის შეცვლა განაცხადის შემთხვევაში GetPropValᲕნახავ:
case ePropTest1: wstring_to_p(test1, pvarPropVal); შესვენება;
მეთოდი SetPropVal:
შემთხვევა ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) დააბრუნებს false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); შესვენება;
სხვა უფლებამოსილებების განსახორციელებლად მნიშვნელოვანია კლასის ველი CaddInNative
uint8_t ბოლო_ტიპი;
ამ შემთხვევაში შეინახება დარჩენილი გადაცემული მნიშვნელობის ტიპი. CaddInNative::SetPropVal მეთოდის გამოსაყენებლად დაამატეთ შემდეგი ბრძანება:
ბოლო_ტიპი = TV_VT(varPropVal);
ახლა, როდესაც ჩაწერთ სხვა სიმძლავრის წაკითხვის მნიშვნელობას, თქვენ დაატრიალებთ მნიშვნელობას ბოლო_ტიპირას წარმოადგენს დასახული დავალება?
მოდით შევამოწმოთ ცვლილებების მიზანშეწონილობა.
ამ მიზნით, მოდით მოვიყვანოთ მიმდინარე 1C კონფიგურაცია ასე გამოიყურებოდეს:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Show(Row(DemoComp.CheckType)); DemoComp.Test = "ვასია"; Show(Row(DemoComp.Test)); DemoComp.Test = "პეტია"; Show(Row(DemoComp.Test)); Show(Row(DemoComp.CheckType)); კინეტების პროცედურები
შედეგად, გაშვებას ეძლევა შემდეგი შეტყობინებების თანმიმდევრობა:
3
ვასია
პეტრო
22

მეორე მესამე ინფორმაცია პირველ რიგში დამკვიდრებული ძალაუფლების კითხვის შედეგია. პირველი, რაც უნდა გააკეთოთ, არის შურისძიება დარჩენილი ჩამოყალიბებული ძალაუფლების ტიპზე. 3 შეესაბამება მთელ მნიშვნელობას, 22 მწკრივის მნიშვნელობას. ფაილში დამონტაჟებულია ტიპების მრავალფეროვნება და მათი კოდები ტიპები.თ, რომელიც არის ITS დისკზე.

მეთოდების გაფართოებული სია

ზავდანნია:
  1. გააფართოვეთ გარე კომპონენტების ფუნქციონირება დამატებითი ფუნქციებით:
  2. ისწავლეთ როგორ დანერგოთ მეთოდები გარე კომპონენტებში
  3. დაამატეთ ფუნქციის მეთოდი ფუნქცია 1, ვინაიდან პარამეტრი იღებს ორ რიგს („Parameter1“ და „Parameter2“). შედეგად, რიგი ასე იქცევა: „ხელახალი შემოწმება. პარამეტრი 1, პარამეტრი 2"
  4. გადაიყვანეთ ამ ცვლილებების სარგებლიანობაზე

შექმნილი კომპონენტის მეთოდების განსახორციელებლად, დეველოპერმა უნდა განახორციელოს ასეთი მეთოდები AddInNative ბიბლიოთეკის კოდში:
GetNMethods, FindMethod, GetMethodName
განკუთვნილია რამდენიმე მეთოდის არჩევისთვის მეთოდის ნომრისა და სახელის ძიებით. ხელისუფლების მსგავსი მეთოდების მსგავსი
GetNParams
აბრუნებს მეთოდის პარამეტრების რაოდენობას მინიჭებული სერიული ნომრიდან; თუ ასეთი რიცხვის მქონე მეთოდი ყოველდღიურია ან არ აქვს პარამეტრები, დაატრიალეთ 0
GetParamDefValue
აბრუნებს მითითებული მეთოდის შეყვანილი პარამეტრის მნიშვნელობას
HasRetVal
აბრუნებს მეთოდის ხილვადობის მიმდევრობას დასაბრუნებელი მნიშვნელობის მითითებულ რიგითი რიცხვით: ჭეშმარიტი შემბრუნებელი მნიშვნელობების მქონე მეთოდებისთვის ყალბისხვა შემთხვევაში
CallAsProc
ყალბი 1C მოდული: Enterprises გამოიყენება საათის წყალობის გამო. პარამეტრების მასივის მეხსიერება ჩანს და ხელმისაწვდომია 1C: Enterprise-ში.
CallAsFunc
მეთოდი იდენტიფიცირებულია მინიჭებული სერიული ნომრით. მეთოდი გარდამტეხია ყალბი 1C მოდული: Enterprises გამოიყენება საათის წყალობის გამო. ავტორიტეტების მასივის მეხსიერება განიხილება როგორც 1C: Enterprise. ვინაიდან შებრუნებული მნიშვნელობა არის მწკრივი ან ორმაგი მონაცემთა ტიპი, კომპონენტი ხედავს მეხსიერების ფუნქციას AllocMemoryმეხსიერების მენეჯერი იქ წერს მონაცემებს და ინახავს ამ მისამართს სტრუქტურის სპეციალურ ველში. 1C: საწარმო ამ მეხსიერების დაწკაპუნებით ამოიღებს თავისუფალი მეხსიერება.
მეთოდების სრული აღწერა, პარამეტრების ჩამონათვალის ჩათვლით, ანგარიშების აღწერა დოკუმენტაციაში, რომელიც მოწოდებულია ITS დისკზე.
მოდით შევხედოთ აღწერილი მეთოდების განხორციელებას.
კომპონენტის კოდს აქვს ორი მასივი:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Turn on", L"Vimknuti", L"Show in rowStatus", L"StartTimer", L"StopTimer", L"EnterBaby");
ეს გადაჭარბებული რეაქცია:
enum მეთოდები (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // ყოველთვის ბოლო);
სუნი არის vikorystvuyutsya ფუნქციები GetNMethods, FindMethodі GetMethodName, ავტორიტეტების აღწერის ანალოგიით.
მეთოდები GetNParams, GetParamDefValue, HasRetValგადართვის განსახორციელებლად მნიშვნელოვანია პარამეტრების გადაცემა და პროგრამის ლოგიკა საჭირო მნიშვნელობების დასატრიალებლად. მეთოდი HasRetValთქვენს კოდს ასევე აქვს მეთოდების სია, რომლებსაც შეუძლიათ შედეგის როტაცია. მათთვის ღვინო ბრუნდება მართალია. ფოლადის ყველა მეთოდისთვის, როტაცია ყალბი.
მეთოდები CallAsProcі CallAsFuncშურისძიება არასწორი კოდის მეთოდზე.
მეთოდის დასამატებლად, რომელიც შეიძლება გამოიძახოთ როგორც ფუნქცია, თქვენ უნდა შეიტანოთ ცვლილებები გარე კომპონენტის გამომავალ კოდში:
  1. დაამატეთ მეთოდების სახელები მასივებში g_MethodNamesі g_MethodNamesRu(ფაილი AddInNative.cpp)
  2. მეთოდის გადაცემამდე დაამატეთ ინფორმაცია იდენტიფიკატორის შესახებ (ფაილი AddInNative.h)
  3. შეიტანეთ ცვლილებები ფუნქციის კოდში GetNParamsპროგრამის ლოგიკაზეა დამოკიდებული
  4. საჭიროების შემთხვევაში, შეიტანეთ ცვლილებები მეთოდის კოდში GetParamDefValue, თუ გჭირდებათ მეთოდის პარამეტრების უკან არსებული მნიშვნელობების გაგება.
  5. შეიტანეთ ცვლილებები ფუნქციაში HasRetVal
  6. შეიტანეთ ცვლილებები რობოტის ფუნქციების ლოგიკაში CallAsProcან კიდევ CallAsFunc, იქ მოათავსეთ კოდი უშუალოდ დაკავშირებული მეთოდისთვის.
ხელმძღვანელობით მასივი g_MethodNamesі g_MethodNamesRu, ასევე გადაჭარბებული ექსპოზიცია მეთოდებისანამ არ ვნახავ:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Enable", L"Vimknuti", L"ShowInRowStatus", L"StartTimer", L"StopTimer", L"ZavantazhitiMalyunok", L"Test");

Enum Methods (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // ყოველთვის ბოლო);
არჩევადი ფუნქცია GetNPropsპარამეტრების რაოდენობის შესაცვლელად "ტესტი" მეთოდით:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default:)
გთხოვთ შეიტანოთ ცვლილებები ფუნქციაში:
Bool Caddinnative :: getparamdefvalue (Consta Long Lmethodnum, Cost Long lparamnum, TVariant *pvarparamdefvalue (tv_vt (PvarparamDeFvalue) = VTYPE_EMPTY; SWITCH (LMETHODN UM) Statusline: EmertHemart: /Casestopeet პარამეტრის მნიშვნელობები არ არის ნაგულისხმევი შესვენება ნაგულისხმევი: დაბრუნების ცრუ;) დაბრუნება ყალბი;
ზავდიაკი მოცემულ რიგზე
საქმე eMethTest:
თუ არსებობს ერთი ან მეტი არგუმენტი, შესაბამის პარამეტრებს ექნება ცარიელი მნიშვნელობები ( VTYPE_EMPTY). პარამეტრის პარამეტრების შეყვანა აუცილებელია განყოფილებაში მისი მითითების შემდეგ eMethTestგადართვის ფუნქციის განცხადება CAddInNative::GetParamDefValue.
ვინაიდან „ტესტის“ მეთოდს შეუძლია მნიშვნელობების როტაცია, თქვენ უნდა შეიტანოთ ცვლილებები ფუნქციის კოდში HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; ნაგულისხმევი: return false; ) return false; )
მე ვამატებ კოდს მეთოდს და ფუნქციას CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(LoMethodNum) (შემთხვევა eMeSparay if|s! დაბრუნება false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; break;) დაბრუნება ret;
მოდით შევადგინოთ კომპონენტი და დავაყენოთ კონფიგურაციის კოდი ასე გამოიყურებოდეს:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); lane = DemoComp.Test ("Hello", "Light!"); Povidomity (ტრანს); კინეტების პროცედურები
კონფიგურაციის დაწყების შემდეგ ჩნდება შეტყობინება: „გამარჯობა, სინათლე!“, რათა დაადასტუროს, რომ მეთოდი წარმატებით დასრულდა.

ტაიმერი

ზავდანნია:
  1. წაიკითხეთ ტაიმერის განხორციელება დემო VK-დან
  2. შეცვალეთ "StartTimer" მეთოდი, დაამატეთ ტაიმერის მოთხოვნის ინტერვალის პარამეტრებში გადაცემის შესაძლებლობა (მილიწამებში)
  3. გადაიყვანეთ ამ ცვლილებების სარგებლიანობაზე

WinAPI რობოტებისთვის საშუალებას გაძლევთ სწრაფად მიიღოთ შეტყობინებები ერთ საათში WM_TIMER. გთხოვთ, გაითვალისწინოთ, რომ თქვენი პროგრამა დასრულდება ერთსაათიანი ინტერვალის შემდეგ, რომელიც თქვენ დააყენეთ ტაიმერისთვის.
ტაიმერის შესაქმნელად გამოიყენება შემდეგი ფუნქცია: SetTimer:
UINT SetTimer(HWND hWnd, // ფანჯრის აღწერა UINT nIDevent, // ტაიმერის ID (ნომერი) UINT nElapse, // დაგვიანებით TIMERPROC lpTimerFunc); // ფუნქციის მაჩვენებელი
ოპერაციული სისტემა დამატებითი ინფორმაციისთვის WM_TIMERპროგრამას ინტერვალებით ვაძლევთ არგუმენტს გასვლა(მილიწამებში). დანარჩენ პარამეტრში შეგიძლიათ მიუთითოთ ფუნქცია, რომელიც შეიძლება გამორთოთ კანის ტაიმერის გააქტიურებისას. ამ ფუნქციის სათაური შეიძლება ასე გამოიყურებოდეს (ეს შეიძლება იყოს მსგავსი):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
მოდით შევხედოთ ტაიმერის განხორციელებას დემო VK-ზე.
ასე რომ, როდესაც ჩვენ ვუყურებთ Windows ოპერაციული სისტემის გარე კომპონენტების შემუშავების პროცესს, ჩვენ არ ვუყურებთ ტაიმერის დანერგვას სხვა ოპერაციულ სისტემებში. მოკლედ რომ ვთქვათ, GNU/Linux OS-ისთვის დანერგვა განსხვავდება ფუნქციის სინტაქსის მიხედვით SetTimerі TimerProc.
შემდეგი კოდი იწოდება მეთოდით SetTimer, ფუნქციის გადაცემამდე MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
შექმნილი ტაიმერის ID მდებარეობს მენიუში m_uiTimerასე რომ თქვენ შეგიძლიათ ჩართოთ იგი.
ფუნქცია MyTimerProcუყურებს მომავალ წოდებას:
ბათილი გამოძახება MyTimerProc(HWND hwnd, // ტაიმერის შეტყობინებების ფანჯრის სახელური UINT uMsg, // WM_TIMER შეტყობინება UINT idEvent, // ტაიმერის იდენტიფიკატორი DWORD dwTime // სისტემის მიმდინარე დრო) ( if (!pAsyncEvent) დაბრუნების; wCompon *what = L"Timer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); , what, wstime); წაშალე wstime; ) )
ფუნქციის არსი არის ის, რომ ის უწოდებს მეთოდს გარე ღონისძიება, რას იძლევა 1C: Enterprise სისტემის შეტყობინება.
მეთოდის ფუნქციონირების გაფართოება StartTimerვცადოთ შემდეგი:
მეთოდის კოდის შეცვლა GetNParamsასე რომ, მეთოდისთვის eMethStartTimerბრუნვის მნიშვნელობა 1:
საქმე eMethStartTimer: დაბრუნება 1;
მოდით მივუთითოთ კოდი მეთოდზე CallAsProcსანამ არ ვნახავ:
შემთხვევა 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;
ახლა შევამოწმოთ უპირატესობა. ამისათვის ჩვენ ჩავწერთ კოდს კონფიგურაციის დამატებით მოდულში:
ცვლადი DemoComp; პროცედურა RobotSystem() დაწყებისას ConnectNativeComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New ("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); კინეტების პროცედურები
კონფიგურაციის დაწყების შემდეგ, პროგრამამდე უნდა იყოს შეტყობინება 2 წამის ინტერვალით, რაც ნიშნავს, რომ ტაიმერი მუშაობს სწორად.

ურთიერთქმედება 1C: Enterprise სისტემასთან

გარე კომპონენტსა და 1C: Enterprise სისტემას შორის ურთიერთქმედებისთვის გამოიყენება ფაილში აღწერილი IAddInDefBase კლასის მეთოდები. AddInDefBase.h. ყველაზე ხშირად შეურაცხმყოფელი ინტერპრეტაციებია:
გაფიცვის შესახებ შეტყობინების გენერაცია
ვირტუალური bool ADDIN_API AddError (ხელმოუწერელი მოკლე wcode, const WCHAR_T* წყარო, const WCHAR_T* descr, long scode)
wcode, კოდი- კომპილაციის კოდები (კომპილაციის კოდების სია აღწერილობით შეგიძლიათ იხილოთ ITS დისკზე)
წყარო-ძერელო პატიობს
აღწერ- ცვლილებების აღწერა
გაძლიერებული შეტყობინება „1C: Entrepreneurship“ სისტემის შესახებ
ვირტუალური bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszწყარო- აღნიშნავს ძერელო
wszმესიჯი- განცხადების ტექსტი
wszData- მონაცემთა გადაცემა
ხელახალი ექსპოზიცია ხორციელდება გარე გრუნტის დამუშავების პროცედურით
გარე კომპონენტების რეგისტრაცია 1C: Enterprise სისტემაში
ვირტუალური bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- კომპონენტი მე ვარ.
ეს მეთოდები უზრუნველყოფს საკმარის ურთიერთქმედებას VK-სა და 1C-ს შორის. 1C: Enterprise სისტემის გარე კომპონენტიდან მონაცემების ამოსაღებად, გარე კომპონენტი აგზავნის სპეციალურ ინფორმაციას 1C სისტემის მუშაობის შესახებ და, საჭიროების შემთხვევაში, უწოდებს გარე მეთოდებს ახალ კომპონენტებს კარიბჭის მონაცემთა გადაცემისთვის.

მონაცემთა ტიპი tVariant

გარე კომპონენტსა და 1C: Enterprise სისტემას შორის მონაცემთა გაცვლისას არჩეულია tVariant მონაცემთა ტიპი. აქ მოცემულია ფაილის ტიპების.h აღწერილობები, რომლებიც შეგიძლიათ იხილოთ ITS დისკზე:
struct _tVariant ( _ANONYMOUS_UNION გაერთიანება ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; ხელმოუწერელი int uintVal; int64_t llVal; uint8_t ui8Val; uint8_t ui8Val; uint_Vrrtalt ხანგრძლივი h Res; float fltVal; ორმაგი dblVal; bool bVal; char chVal; wchar_t wchVal; DATE თარიღი; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; al;uint32_t strLen; //ბაიტების რაოდენობა) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUV_t; / სიმბოლოების რაოდენობა ) განზომილებიანი მასივი pvarVal TYPEVAR vt;);
ტიპი tVariantარის სტრუქტურა, რომელიც მოიცავს:
  • sumish (გაერთიანება), აღიარებულია შუაში მონაცემთა შენახვისთვის
  • მონაცემთა ტიპის იდენტიფიკატორი
ცვალებადი ტიპის რობოტის zagalnym ტიპის რობოტში tVariantმიჰყევით მომავალ ალგორითმს:
  1. მონაცემების ტიპის მიხედვით, რომელიც ამჟამად ინახება ცვლილებასთან ერთად
  2. გადაახვიეთ სუმიშას ხილულ ველზე, მონაცემების დაუყოვნებელი წვდომისთვის
ვიკორისტანნია ტიპი tVariantმნიშვნელოვნად გაამარტივებს ურთიერთქმედებას 1C: Enterprise სისტემასა და გარე კომპონენტებს შორის

დანამატი

მაგალითების კატალოგი სტატისტიკაზე კონდახის განთავსებისთვის
მაგალითები/1 - დემო კომპონენტის გაშვება
მაგალითები/2 - ავტორიტეტების სიის გაფართოების დემონსტრირება
მაგალითები/3 - მეთოდების გაფართოებული სიის დემონსტრირება
Kozhen-ის კატალოგი, VS 2008 პროექტი და მზა 1C კონფიგურაცია.

ეს სტატია ეძღვნება გარე კომპონენტების მუშაობას და მათ კავშირს. ამჟამად, 1C Enterprise-ის შესაძლებლობების გასაფართოებლად გამოიყენება გარე კომპონენტების ორი ტექნოლოგია:

  • 1 მეტი დახმარებისთვის Native API
  • 2 WIKORISTANNAM TECHNOLOGY COM
ამ სტატიაში მინდა გამოვყო Native API კომპონენტებთან მუშაობა.
მაშ ასე, დავიწყოთ, მარტივიდან რთულამდე:
Vityag z ITS

1. მისაღებია, რომ VK დაყენებულია დისკზე:

Mozhlive vikoristannya "ტოვსტოის კლიენტს (არაჩვეულებრივი დამატება)";

ეს არის უმარტივესი რობოტის კონდახი Native კომპონენტით. გთხოვთ გაითვალისწინოთ, რომ ეს კომპონენტი არ საჭიროებს რეგისტრაციას სისტემიდან, რაც მნიშვნელოვნად გაამარტივებს ადმინისტრირებას.

2. კონდახი, რომელსაც უყურებ, არ არის ცოცხალი. ყველაზე ხშირად კომპონენტები გადანაწილებულია განლაგებაში. განლაგება დამნაშავეა zip არქივების არასწორად განთავსებაში კომპონენტურ ფაილებთან და MANIFEST.xml ფაილთან
manifest ფაილის მაგალითი:

3. თხელ და ვებ კლიენტში მუშაობისას მარტივი მეთოდია.
ციტატა ITS-დან:

განმარტება:
%APPDATA%\1C\1Cv82\ExtCompT- დირექტორია სქელი და თხელი კლიენტებისთვის კომპონენტების დაყენებისთვის.
%APPDATA%\Roaming\Mozilla\Extensions- დირექტორია (ჩემი ვერსია) გაფართოება Mozilla FF-ისთვის/
ვიკორისტული მეთოდით დააინსტალირეთ ExternalComponent(), კლიენტიდან გამომდინარე, შესაბამის კატალოგს ექნება შეუფუთავი გაფართოებები.

გარე კომპონენტის დაყენების პროცედურის მაგალითი:

დააინსტალირეთ გარე კომპონენტი- მეთოდი უნდა იქნას გამოყენებული მხოლოდ კომპონენტის საწყისი ინსტალაციის შემდეგ, თუ საჭიროა კომპონენტის დაინსტალირებული ვერსიის განახლება.

როგორც გამხდარი, ასევე სქელი კლიენტისთვის:
საკმარისია გარე კომპონენტების დაყენების ოპერაციის ხელახლა შესრულება მსგავსი მეთოდით დააინსტალირეთ გარე კომპონენტი().

ვებ კლიენტის ვარიანტი კომპონენტის განახლებისთვის:

  • საჭიროა მოდულის დეინსტალაცია რობოტის საშუალებით ვებ ბრაუზერის დანამატებით (Mozilla FF)
  • მალსახმობის მეთოდის გამოყენებით დააინსტალირეთ გარე კომპონენტი
VK-თან დასაკავშირებლად შეგიძლიათ გამოიყენოთ შემდეგი პროცედურა:

თუ კომპონენტი არ არის დაინსტალირებული, მაშინ იქნება დამნაშავე.

2. არის სიტუაციები, როდესაც საჭიროა კომპონენტის დაინსტალირება დროზე მგრძნობიარე ასამბლეიდან (გარე მოწყობილობის უარყოფის ფაილი, გარე დამუშავება), ამ შემთხვევაში პირველი პარამეტრები უნდა იყოს მითითებული მეთოდით Connect External Component and Install External Component address of the არქივი შეხვედრის დროს. რობოტის ძლიერ კონდახს ქვემოთ მივუთითებ:

&OnClients მისამართების გადატანა კომპონენტების არქივში; &OnClients ცვლადი კომპონენტი; &კლიენტის პროცედურაზე OnVidkritti(Vidmova) //მისამართები, მოათავსეთ სტრიქონი (ნავიგაცია გაიგზავნა ორმაგ მონაცემთა zip არქივში //დრო-საათის კონვერგენციაზე) EndProcedures //OnOnVidkritti() &სერვერზე //Pi მეთოდები ჩართეთ External Component, Set გარე კომპონენტი, შეიძლება მიღებულ იქნას // როგორც პირველი რიგის პარამეტრი ფორმატში "ნავიგაციის ფოსტა" // (URL გარე კომპონენტის, ZIP არქივში შეფუთული, ფორმატში). ფუნქცია RetrieveAddressArchiveHourlyArchive()ProcessingObject = FormValueProperties("ProcessingObject"); PostingOnArchives = PlaceInHomeStorm(ProfileObject.OutlayLayout("MIKO_phone_IP"), New UniqueIdentifier); დაბრუნება არქივში; EndFunctions // ამოიღეთ ArchiveHourlyConvergence() მისამართის &OnClient // პროცედურა უნდა გამოიძახოთ მხოლოდ ერთხელ, თუ კომპონენტი ჯერ არ არის დაინსტალირებული // ან დასჭირდება განახლებული პროცედურა დააინსტალირეთ კომპონენტი (ბრძანება) სცადეთ დააინსტალირეთ External yuComponent(AddressArres) Vinyatok ჩვენება ("გარე კომპონენტი ვერ დაინსტალირდა." ); KinetsProby; პროცედურის დასასრული // Install Component() &OnClient // კომპონენტის ინიციალიზაციის ძირითადი პროცედურა. პროცედურა ინიციალიზაცია (ბრძანება) სცადეთ გარე კომპონენტის დაკავშირება (არქივის კომპონენტის მისამართი, "Comp" , აკრიფეთ External Components. Component = New (AddIn.Comp.MIKO_phone_IP) ; განცხადება ("ინიციალიზაცია. შესაძლოა, კომპონენტი ჯერ არ არის განცხადებები."); KіnetsProby; KіnetsProcedures