"1C: Savdoni boshqarish" ning yangi nashrlari: ishlab chiqmasdan yangilash. Operatsion buxgalteriya hisobi tartibga solinadi


Bu ConnectExternalComponent() global kontekst funksiyasining ba'zi o'ziga xos xususiyatlari bilan bog'liq.

Ko'pincha dasturchilar foydalanuvchilar 1C bilan ishlashda, terminal orqali serverga ulanishda tashqi komponentlarni (masalan, tijorat uskunalari uchun drayverlarni) ulashda muammolarga duch kelishadi.

Bunday holda, foydalanuvchilar, masalan, ushbu rasmni ko'rishadi:

Mahalliy kompyuterlardan ishlashda tashqi komponentlarni ulashda hech qanday muammo bo'lmaydi.

Bu nima bilan bog'liq? Buning sababi shundaki, foydalanuvchilar terminal serveri orqali ishlaganda, ular mahalliy kompyuterda ishlashga qaraganda kamroq huquqlarga ega.

Agar siz ma'muriy huquqlarga ega hisob qaydnomasi ostida terminal serveriga kirsangiz, buni osongina tekshirishingiz mumkin.

Bu farqning sababi shundaki, foydalanuvchi terminalda normal huquqlar ostida ishlayotganida 1C tashqi komponentni ro'yxatga olish kitobida ro'yxatdan o'tkaza olmaydi, chunki oddiy foydalanuvchi tizim ro'yxatga olish bo'limiga yozish uchun ruxsatga ega emas HKEY_CLASSES_ROOT.

Terminalda tashqi komponentlarni ulash mavzusidagi nashrlar ushbu muammoni hal qilishning turli usullarini taklif qiladi.

Masalan, bular:

1. Ma'muriy huquqlar ostida birinchi marta 1C ni ishga tushiring.

Bu variant har doim ham ishlamaydi. Buning sababini quyida tushuntiraman.

2. Oddiy terminal foydalanuvchilariga tizim registrlari bo'limiga yozish uchun ruxsat bering HKEY_CLASSES_ROOT.

Etarli darajada rivojlangan foydalanuvchilar buni qilmasliklari kerak, aks holda muammolar bo'lishi mumkin.

3. Turli gadjetlardan foydalanib, VK-ni to'liq huquqlarga ega bo'lgan foydalanuvchi nomidan ro'yxatdan o'tkazing.

Bu ham yaxshi emas.

Xo'sh, bu vaziyatdan chiqishning eng yaxshi yo'li qanday?

Men bu muammoga o'z yechimimni taklif qilaman. Menimcha - oddiy va chiroyli.

Ushbu muammoni o'rganayotganda, men o'zimga savol berdim: nega 1C hatto VKni yangi yo'l yordamida ro'yxatdan o'tkazishga harakat qilmoqda? Axir, u allaqachon tizimda ro'yxatdan o'tgan.

Gap shundaki, odatiy 1C konfiguratsiyalarida (masalan, "Savdoni boshqarish") quyidagi sintaksis global kontekst usuli Connect External Component() uchun ishlatiladi:

ConnectExternalComponent("Directory.ConnectedEquipment.Layout.DriverATOLBarcodeScanner", "ATOLScanner");

Ko'rib turganingizdek, VC drayveri "Connected Equipment" katalogining "ATOLBarcode Scanner Driver" tartibidan ulangan.

Keyin nima bo'ladi?

1C komponentni foydalanuvchining vaqtinchalik papkasida saqlaydi, masalan, "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

va uni ro'yxatga olish bo'limida ro'yxatdan o'tkazishga harakat qiladi HKEY_CLASSES_ROOT aynan shu yo'lda.

Terminalda oddiy foydalanuvchilar ushbu ro'yxatga olish bo'limini o'zgartirish huquqiga ega emaslar, shuning uchun komponent ularga ulanmaydi.

Endi bu vaziyatdan qanday chiqish haqida gapiraylik.

Global kontekst usuli ConnectExternalComponent() bir nechta sintaksis variantlariga ega. Bu biz foydalanadigan narsadir.

Shunday qilib, bosqichma-bosqich:

1. regsvr32.exe yordam dasturi yordamida tashqi komponentni 32-bitli OT uchun C:\WINDOWS\SYSTEM32 papkasida yoki 64-bitli OT uchun C:\WINDOWS\SYSWOW64 jildida terminal serverida ro'yxatdan o'tkazing.

2. ConnectExternalComponent() usuli uchun ikkita qo‘shimcha sintaksis opsiyalaridan birini ishlating:

Variant 1:

ConnectExternalComponent("C:\WINDOWS\SysWOW64\Scaner1C.dll", "ATOLScanner", ExternalComponentType.COM);

DriverObject = Yangi ("AddIn.ATOLScanner.Scaner45");

Variant 2:

ProgID = "AddIn.Scaner45";

ConnectExternalComponent (ProgID);

DriverObject = Yangi (ProgID);

Menimcha, 2-variant afzalroq.

Shu bilan birga, 1C registrdagi yangi yo'l yordamida VK-ni qayta ro'yxatdan o'tkazishga urinmaydi va shu bilan barcha muammolar hal qilinadi.

Xo'sh, hammasi shu. Ishda omad!

[havolani ko'rish uchun ro'yxatdan o'tishingiz kerak]

Savol: 1C 8.3 da Linux (Ubuntu x64) uchun C++ da Native Api tashqi komponenti


Men VK-ga yozyapman, lekin ubuntu-da 1c-ga ulana olmayapman. Hatto 1c dan bajariladigan fayl ham ulanmaydi. Shunday qilib, bu haqda savol:

1) Men maqolada keltirilgan VNCOMPS misolidan VK ni ulashga harakat qilaman

(havolani eng oxirida topish mumkin: "Nusxa olish").
NativeApi loyihasi ichida makefile mavjud. Uning yordami bilan men Ununtu-da .so kutubxonasini qurmoqdaman.
Ammo "Tashqi komponentni ulash" 1c ishlamay qolganda.
Xuddi shunday, agar men "build.sh" yordamida qursam (loyihaning ildizida).

Makefile-ning o'zida men bayroqni m32 dan m64 ga o'zgartiraman, chunki 1c va x64 tizimining o'zi. (m32 parametri bilan u baribir ulanmaydi)
1C 8.3 dan VK ga qo'ng'iroq qilish misoli:
Ulanish tugadi = ConnectExternalComponent("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Aynan shu mavzuda maqola bor.
Ammo, men ko'rganimdek, bu fikrlarning barchasi allaqachon VNCOMPS misolida hisobga olingan va tuzatilgan.

Lekin, aslida, bu kompilyatsiya parametrlari masalasidir. MB 32-bitli tashqi komponent odatda 32-bit 1c ga ulanadi, lekin men uni Ubuntu x64 1c Enterprise83 8.3.5-1486 amd64 da oʻrnatdim. Va men u bilan VKda bog'lanmoqchiman.

Kimda bu muammoni hal qilish bo'yicha biron bir fikr bormi?)
VNCOMPS misoli ishlashi kerak, lekin qurish parametrlarini sozlash kerak yoki men sinab ko'rayotgan platformaning o'zi noto'g'ri.

Javob: Qiziq, Javada tashqi komponent yozish mumkinmi?

Savol: Tashqi komponentni (Native) ulash mumkin emas


Men 64 va 32 bitli tizimlar uchun ITS bilan misol tuzdim.

Men shunday ulanaman:
Ulanish natijasi = ConnectExternalComponent(KDLLPath, "Comp", ExternalComponentType.Native); Ulanish bir kompyuterda ishlaydi, lekin boshqasida emas. OSda farq bor. Ulanish amalga oshirilgan joyda Win7 mavjud, Win10 yo'q. Shu bilan birga, mening komponentim ishlamayotgan kompyuterda standart komponentlar ishlaydi.

Turli platformalarda sinovdan o'tgan (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Nima uchun u ulanmasligini qanday tushunish mumkin?

Javob: vc_redist unutdingizmi?

Savol: 1C8 va Native turiga ega tashqi komponent


Hayrli kun.
Menda BP 3.0.50.12 konfiguratsiyasi bor va unga UniServerAuto yordamida Vesy-Soft kompaniyasidan tortishni amalga oshirish istagi bor.
Ishlab chiquvchilar komponentni Windows 32 va 64 uchun Native-da kompilyatsiya qilishdi va uni eng muhim fayl bilan arxivlashdi. Og'irlikni qanday hisoblash mumkinligi haqida 1C uchun misol ham mavjud. Unda ikkilik ma'lumotlarga ega tartibdan foydalangan holda, men tushunganimdek, ushbu arxiv ko'rsatilgan. Misolda, hamma narsa yaxshi: komponent o'rnatiladi, ulanadi, keyin ulanish o'rnatiladi va og'irlik o'qiladi.
Ammo siz uni 1C ga o'tkazishni boshlashingiz bilanoq, vazn o'qilmaydi. Hamma narsa oddiygina yozilganga o'xshaydi, lekin men rake qayerda ekanligini tushunmayapman.
Kimning vaqti oz bo'lsa - yordam bering, bir ko'z bilan qarang, ehtimol yechim sirtda, lekin men noto'g'ri joyga borib, noto'g'ri ish qilyapman. Men ilgari hech qachon Native texnologiyasi bilan ishlashga majbur bo'lmaganman ...

Va ilovada mening qayta ishlash matnim

Javob:

Xo'sh, menda yangilik bor ...
Men faqat bosqichma-bosqich u qaysi nuqtada muvaffaqiyatsiz bo'lishini ko'ra boshladim. Buning uchun men bo'sh ma'lumotlar bazasini yaratdim va uni buyruq bilan qayta ishladim. Yetkazib beruvchining misoliga o'xshab, men tartibni yangi konfiguratsiyaga o'tkazdim - u ikkinchi marta ishlaydi. Bular. birinchi marta yo'q, lekin ikkinchi marta ha. Bu bizning qayta ishlashimizda har xil protseduralar bo'yicha komponent va ob'ektning ulanishini ajratish kerak bo'ladi degan fikrni uyg'otdi.
Keyin uni maket ulanishi bilan ma'lumotlar bazasiga o'tkazdim - u ishlaydi. Oh, bu yaxshi.... Lekin men konfiguratsiyaga o'zgartirish kiritmasdan xohlayman, shuning uchun davom etaylik

Men tartibni qayta ishlashga qo'shishga harakat qilaman. Uning o'lchami darhol 10 kb dan 3 mb gacha ko'tariladi va ishda sezilarli sekinlashuv seziladi - bu mos emas. Men komponentlarni dll orqali ulash uchun qazishni boshlayapman. Bular. asosan men boshlagan joy bilan bir xil. Ammo bitta "BUT" bor: foydalanuvchi papkasida dll nomini qidirayotganda, men ushbu dll 1C da ro'yxatdan o'tgan DLL-lar qo'shilgan joyda joylashganligini payqadim:
C:\Users\USER\AppData\Rouming\1C\1cv8\ExtCompT
Shunga ko'ra, dll-ga to'liq yo'lni ishlatishning hojati yo'q, siz shunchaki uning nomini kiritishingiz mumkin:
ConnectExternalComponent("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

Men harakat qilaman ... ro'yxatga olishda qasam ichadi, lekin tortish natijasini qaytaradi. Ma'lum bo'lishicha, dll allaqachon ro'yxatdan o'tgan va bu shunchaki uni ulash kerakligini anglatadi. Men uni olib tashlayman va hamma narsa ishlaydi.
Xulosa qilish uchun:
1. Taroziga ishlov berishda AtOpening protsedurasi tashqi komponentni ulash va ob'ektga ulanishni o'z ichiga oladi.
2. Dll-ga yo'l Men uni yozmadim, faqat uning nomini ko'rsatdim.

Endi men o'tiraman va o'ylayman, dll qachon 1C da o'rnatilgan? Dasturiy ta'minotni o'rnatish vaqtida? Qiyin... Ushbu dll ning ishlab chiquvchi konfiguratsiyasini ishga tushirish vaqtida, forma ochilganda u qayerga o'rnatiladi? Bilmayman, lekin menga yaqin ko'rinadi ... Nima deb o'ylaysiz?
Ikkinchidan, yangi joyda, xuddi shu terminalni o'rnatish zarurati tug'ilganda, hamma narsa ishlashi uchun nima qilish kerak? Men dasturiy ta'minotni to'liq o'rnatishim kerakmi, operatsiyani tekshirish uchun sotuvchining konfiguratsiyasini ishga tushirishim kerakmi va keyin (nazariy jihatdan) mening qayta ishlashim ishlashi kerakmi? Nimadir murakkab... Yoki dasturiy ta'minotni o'rnatgandan so'ng tashqi komponentni bir marta o'rnatishim kerakmi?

Men sizning fikringizni ushbu masala bo'yicha eshitmoqchiman ...

Savol: Tashqi komponent.dll


Hammaga xayrli kun.
Savol.
1C 7.7 da ajoyib ishlaydigan dll komponenti
1s 8.1 umuman yuklashni xohlamaydi...
Men uni C:\Program Files\1cv81\bin\cache1c.dll-ga joylashtirishga harakat qildim.
Men regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll" yordamida ro'yxatdan o'tishga harakat qildim.
Muammosiz ro'yxatdan o'tadi.
Men unga kirishni xohlaganimda xato xabarini olaman:

Tashqi komponentni yuklashda xatolik yuz berdi! cache1c.dll
Protsedura tugmasiExecutePress(tugmasi) Tashqi komponentni yuklashga urinish( "C:\Program Files\1cv81\bin\cache1c.dll"); Istisno hisoboti( "Tashqi komponentni yuklashda xatolik yuz berdi!"+ "cache1c.dll" ); EndAttempt; Urinish // Komponent ob'ektini oling. // m = Yangi ("cache1c.GTMcmd" ); m = Yangi COMObject("cache1c.GTMcmd" ); Istisno hisoboti(); EndAttempt; EndProcedure

Javob: Bu imkonsiz darajada oddiy...
Qo'ng'iroqlar orasida pauza qilishingiz kerak (millisekundlar)...
Protsedura ButtonExecutePress(Button) urinishi // Komponent obyektini oling. m = Yangi COMObject("cache1c.GTMcmd" ); Istisno hisoboti( "Tashqi komponent ob'ektini yaratib bo'lmadi"); EndAttempt; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.Pauza(100); ...... va hokazo
1c 7.7 uchun - bu kerak emas, ishlov berish tezroq ekanligi ma'lum bo'ldi.

Savol: 1C serveri bilan tashqi komponent bilan ishlash...


Hayrli kun,

C++ da yozilgan tashqi komponent mavjud bo'lib, uning vazifasi tashqi ma'lumotlar bazasidan ma'lumot olish va so'rov natijasini 1C da qiymatlar jadvali shaklida qaytarishdir.
Hozirgi vaqtda qiymatlar jadvalini yaratish uchun Init() funksiyasida parametr sifatida qabul qilingan IDispatch* pBackConnection interfeysi ishlatiladi. Keyinchalik, men oddiygina qiymatlar jadvalini yaratish, uni to'ldirish va CallAsFunc(...) da ikkinchi parametrga qaytarish uchun 1C funktsiyalaridan foydalanaman.
Muammolar 1C nozik mijozlarga o'tish bilan boshlandi. Server tomonida tashqi komponent aslida ishga tushmaydi. Siz uni mijoz tomonida ishga tushirishingiz mumkin, ammo barchasi tayoqchaga o'xshaydi va 1Cda umumiy "mijoz-server" mantig'idan chiqib ketadi. Masalan, mijoz qiymatlar jadvali nima ekanligini, "global" o'zgaruvchilar bilan bog'liq muammolar, sessiyalar va boshqalarni tushunmaydi.
NativeAPI bu borada yanada cheklangan.
Daf bilan raqsga tushish men 1C serveri ostida tashqi komponentni ishga tushirishga muvaffaq bo'lganimga olib keldi, LEKIN ish pBackConnection-da Invoke-ga qo'ng'iroq qilishga urinmaguncha davom etadi. 8.2 serverning 64-bitli versiyasi vaqt tugamaguncha biror narsa qilishga harakat qiladi, 32-bitli versiya (VK tabiiy ravishda 32-bit) darhol tushib ketadi.
1C serveri ushbu ish rejimini qo'llab-quvvatlamaydi deb o'ylayman.
Shunga ko'ra, savollar tug'iladi: bu vaqtinchalikmi yoki 1C mantig'i ushbu ish sxemasini bekor qilish uchun qaynaydimi? Agar shu tarzda ichki 1C tuzilmalarini (qiymatlar jadvali) yaratishning iloji bo'lmasa, uni C++ da yaratishga harakat qilish uchun, printsipial jihatdan, tizim darajasida qiymatlar jadvalining tavsifi mavjudmi? uni to'ldiring va keyin uni qaytarish parametri sifatida 1C ga o'tkazing? Men hech bo'lmaganda qaysi yo'nalishda qazish kerakligini aniqlamoqchiman.

Rahmat.

Javob:

Siz bir narsani yozasiz va boshqa narsani nazarda tutasiz.
1C muhitida turli seanslarda ko'rinadigan o'zgaruvchilarni e'lon qilish hozir imkonsiz emas va ilgari bunday imkoniyat yo'q edi. Yana bir seans jismoniy jihatdan boshqacha jarayondir.
Seans - bu ma'lumotlar bazasiga ulanadigan sessiya, ya'ni. foydalanuvchi sessiyasi. Yoki siz ushbu kontseptsiyaga o'zingizning biror narsangizni kirityapsizmi?

Bir seans ichida seans modulida yashash va turli joylardan ko'rinadigan o'zgaruvchilarni seans modulida e'lon qilish mumkin edi va endi ham mumkin... aslida ulardan 4 tasi bor.
- sessiya moduli;
- oddiy dastur moduli;
- Boshqariladigan dastur moduli;
- Tashqi ulanish moduli.

Albatta, siz kontekstni eslab qolishingiz kerak. Server konteksti mijoz tomonida bevosita mavjud emas va aksincha.

Aslida, 1C arxitekturasi ma'lumotlar almashinuvi quyidagicha amalga oshirilishini nazarda tutadi:
- protseduralar/funksiyalar parametrlari/qaytishi orqali;
- sessiya parametrlari (ob'ektlar bo'lishi mumkin emas, lekin aslida palitrada ko'rinadigan) yordamida.

Shakldagi jadval... u qandaydir ob'ekt jadvaliga ulanganmi (masalan, ishlov berish)? yoki yo'q. Ha bo'lsa, u serverda (&OnServer) mavjud va u erda tahrirlang....

Va shunga qaramay, ha, qiymat jadvali mijoz tomonida UVda mavjud emas. Xo'sh, 1C shunday qaror qildi.

Qo'ysangchi; qani endi! U Excel bilan ishlaydi, FSO va boshqa bir qancha narsalar bilan ishlaydi, lekin bu erda ishlamaydi. Xatoni toping va tahlil qiling....

Urinish
...
sizning harakatlaringiz
...
Istisno
str = ErrorDescription();
EndAttempt;

Zamonaviy apparat imkoniyatlari bilan bu umuman argument emas.

To'g'ri shaxsiy fikringiz. Haqiqatga hech qanday aloqasi yo'q. Hech qanday tarzda emas. Yana bir bor takrorlayman, 1C COM bilan ajoyib ishlaydi. In-proc va out-proc bilan ham.

Iltimos, yuklab olish uchun foydalanadigan kodni kiriting va VK bilan bog'laning.

Aytgancha, VK... sizning holatingizda bu COM yoki Native APImi?
Agar MAQOMOTI bo'lsa, siz uni regsvr32 orqali... sifatida ro'yxatdan o'tkazasiz... qanday qilib bit chuqurligi masalasini "hal qilasiz"?

Savol: Tashqi komponentni o'rnatish


Iltimos, menga tashqi komponentni qanday o'rnatishni ayting. Quyidagi kodni bajarishda xatolik yuzaga keladi. Tartibda NameDecl.dll ni toping

ExternalComponent ("GeneralLayout.Layout") o'rnatishga urinish; Istisno EndTry ;
Xato: tashqi komponentni o'rnatish amalga oshmadi!

Javob: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) FALSEni qaytaradi.
New("AddIn.NameDecl.CNameDecl", Undefined) = (()): Turi undefined (AddIn.NameDecl.NameDecl)

Savol: Mahalliy dll 1c 8.1 (fptrwin32_fz54_9_11_0_5549.dll) ga ulanmagan


Salom.
1C ffd 1.05 uchun atol onlayn kassa apparatlari uchun dll-ni yangiladi (fptrwin32_fz54_9_11_0_5549.dll texnik xizmat ko'rsatishga kiritilgan).
Menda eski 1C 8.1 bor. 8.2 dan farqli o'laroq, u 8.2 kabi tashqi uskunalar bilan ishlashni qo'llab-quvvatlamaydi, shuning uchun avval Windows-da dll-ni ro'yxatdan o'tkazishingiz kerak va keyin uni faqat 1C ga ulashingiz kerakmi?

ProgID = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent (progID); Haydovchi = Yangi (ProgID);

Biroq, eski ishlov berish com "texnologiyasi" da yozilgan, yangisi esa mahalliy. Shunga ko'ra, regsvr32 ni ro'yxatdan o'tkazishda xatolik yuz beradi:
Modul yuklangan, lekin DllRegisterServer kirish nuqtasi topilmadi. Va bu fayl to'g'ri DLL yoki OCX fayli ekanligini tekshirishni taklif qiladi.
Kimdir shunga o'xshash vaziyatga duch keldi va qanday qilib chiqdingiz? 7.7 da shunga o'xshash muammo bo'lishini tushunaman.
Kod 8.2:

Layout = GetLayout ("IntegrationComponent"); Manzil = PlaceInTemporaryStorage(Layout); ConnectExternalComponent(Manzil, "IntegrationComponent", ExternalComponentType.Native); Haydovchi = Yangi("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1C 8.2:
ConnectExternalComponent(<Местоположение>, <Имя>, <Тип>)
1C 8.1:
ConnectExternalComponent(<Идентификатор объекта>)
Variantlar:
<Идентификатор объекта>(majburiy)
Turi: String. Tashqi komponent ob'ektining ProgID (Dastur identifikatori). Tizimning ro'yxatga olish ma'lumotlar bazasidagi (Reestr) ma'lumotlarga mos kelishi kerak.
Tavsif:
Tashqi komponent ob'ektlarini 1C: Enterprise ga ulaydi.
1C: Enterprise serverida mavjud emas. Tashqi ulanish modulida ishlatilmaydi.
Eslatma:
Tashqi komponentlar 1C: Enterprise 7.7 komponentlari bilan mos keladi.
Misol:
Urinish
ConnectExternalComponent("AddinObject.Scanner");
Hisobot ("Shtrix-kod skaneri uchun komponent yuklangan");
Istisno
Hisobot ("Shtrix-kod skaneri uchun komponent yuklanmagan");
EndAttempt

Ushbu dll ni 8.1 ga ulashning biron bir usuli bormi yoki yo'qmi?

Rahmat!

Javob:

Men ham yaqinda bu muammoga duch keldim. 1c ning keyingi versiyasiga aylantirish mumkin emas edi, chunki... Ushbu konfiguratsiya ishlaydigan dll oddiygina ishlashni to'xtatdi va 1c xato bilan qulab tushdi.
Muammoni quyidagicha hal qildim:
Men bo'sh 8.3 ma'lumotlar bazasini yaratdim, unda men komponentni ishga tushirishni qayta ishladim va keyin 8.1 dan MAQOMOTI ulanishi orqali avval yaratilgan ma'lumotlar bazasiga kirdim va u erda komponentni ishga tushirdim. Keyin, allaqachon 8.1 da, men ushbu komponentning usullarini chaqirdim.
Albatta, bu tayoq, lekin men haligacha boshqa yo'l topa olmadim(

Kod misoli 8.3:
O'zgaruvchan drayverlarni eksport qilish;
Funktsiya ConnectionComponentsKKT() eksporti
Urinish

Layout = GetLayout ("IntegrationComponent");
Manzil = PlaceInTemporaryStorage(Layout);
ConnectExternalComponent(Manzil, "IntegrationComponent", ExternalComponentType.Native);
Drayv = Yangi ("AddIn.IntegrationComponent.SMDrvFR1C20");
Natija = To'g'ri;

Istisno

Natija = noto'g'ri;

EndAttempt;
Natijani qaytarish
EndFunction

Kod misoli 8.1

Funktsiya CreateDriverObject(Driver) eksporti

Natija = rost;

Urinish

ConnectionString="File="""Ma'lumotlar bazasiga yo'l""";
ComObject = Yangi COMObject("V83.ComConnector");
Ulanish = ComObject.Connect(ConnectionString);

Qayta ishlash = Connect.Processing.ConnectExternalComponent.Create();
Ulanish natijasi = Processing.ConnectionCCPComponents();
Agar ulanish natijasi bo'lsa
Driver = Processing.Driver;
EndIf;

Istisno
Kim buni qilgan yoki shunga o'xshash qarorlarga duch kelgan bo'lsa, oddiy misol yordamida printsipning o'zini tushuntirib bering. Tashqi komponentlarni ulash bilan hamma narsa aniq ko'rinadi.

// Qiymatlar jadvalini to'ldirishga misol TK.Clear(); So'rov = Yangi so'rov; Query.Text = "SELECT | Nomenklatura.Link QANDAY Nomenklatura |FROM | Directory.Nomenclature AS Nomenklatura"; So'rov natijasi = Query.Execute(); Selection = Query Result.Select(); while Selection.Next() Cycle Page = TK.Add(); FillPropertyValues(Page, Selection); EndCycle;
Kodning qaysi qismi odatda olib tashlanishini tushuntirish uchun ushbu misoldan foydalana olasizmi? So'rov bilan qismni olib tashlash mantiqan to'g'ri bo'lar edi, lekin keyin platformani chetlab o'tib, tashqi komponentdan ma'lumotlar bazasiga qanday kira olamiz? Matnni olib chiqishning ma'nosi yo'q. Yoki jadval qismining shakllanishini olib tashlang. Bunga duch kelgan har bir kishi bilan tajribangizni baham ko'ring.

Javob: Va "Mos kelmaydigan" so'zi har doim "Yomon" so'zini anglatadimi? Ha, menimcha, agar men o'z uslubimni "1C: Tabiatda mavjud bo'lgan ushbu skript dvigatelidagi eng yomon dasturlash (adabiy tilga tarjima qilingan)!" va keyin, ehtimol, bu hayvonni tekshirishni xohlaydigan odamlar bo'ladi. Va bu klassikaga o'xshaydi: "Men Pasternakni o'qimaganman, lekin men u bilan mutlaqo rozi emasman!"

Savol: 1s 8.3.6 va Win8 da tashqi komponentni ulash


Tashqi komponentni vk_rs232.dll ni maxsus konfiguratsiyaga ulashingiz kerak. Bu regsvr32.exe orqali ro'yxatdan o'tganga o'xshaydi. "Ko'rinadi", chunki men "komponent ro'yxatdan o'tgan, ammo xavfsizlik devorida nimadir noto'g'ri" degan xabarni oldim. Xabarning birinchi yarmiga tayanib, kodni 1C da yozaman
AfterConnecting = Yangi ogohlantirish tavsifi ("AfterConnectingVK", ThisForm); StartInstallingExternalComponents(,"C:\Controller\vk_rs232.dll"); StartConnectingExternalComponents(AfterConnecting,"C:\Controller\vk_rs232.dll","DLL_Scales");
va men bu xatoni olaman
"Tashqi komponentni o'rnatish muvaffaqiyatsiz tugadi! Siz foydalanayotgan mijoz ilovasi uchun komponent etishmayotgan bo'lishi mumkin!".

Va endi men tushunmayapman:
1. Ehtimol, komponent registrda ro'yxatdan o'tmagandir - u erda uni qanday tekshirish mumkin?
2. Ehtimol, uning "versiyasi" Win8 ostida ishlamaydi, garchi menda 32-bit bo'lsa.
3. Ehtimol, 1C o'zi juda yangi, ya'ni. Shunga ko'ra, bu DLL bilan ishlay olmaydimi?
4. Xo'sh, bu ahamiyatsiz - men noto'g'ri narsa yozyapman.

Javob: Va bularning barchasi meni keyingi muammoga olib keldi. VneshComp o'rnatildi, endi siz uni ulashingiz kerak. Va bu erda ikkala variant ham mavjud
ConnectExternalComponent("C:\Controller\vk_rs232.dll", "Libra")
ConnectExternalComponent("GeneralLayout.Layout", "Libra")

Sintaksis varianti: nomi va joylashuvi bo'yicha

Sintaksis:

ConnectExternalComponent(<Местоположение>, <Имя>, <Тип>)
Variantlar:

<Местоположение>(majburiy)

Turi: String.
Tashqi komponentning joylashuvi.
Joylashuvdan foydalanish mumkin:
fayl tizimidagi tashqi komponent fayliga yo'l (veb-mijozda mavjud emas), ZIP arxivi emas;
ikkilik ma'lumotlar yoki ZIP arxivini saqlaydigan tartibning to'liq malakali nomi;
GetNavigationLink-ga o'xshash formatdagi tashqi komponentning URL manzili, ikkilik ma'lumotlar yoki ZIP arxivi.
<Имя>(majburiy)

Turi: String.
Ulanadigan tashqi komponentning ramziy nomi.
Ism o'rnatilgan tilning nomlash qoidalariga muvofiq bo'lishi kerak.
<Тип>(ixtiyoriy)

Turi: ExternalComponentType.
Ulanadigan tashqi komponent turi.
Agar komponent ZIP arxiviga o'rnatilgan bo'lsa, foydalanilmaydi.
Usul variantining tavsifi:

Native va COM texnologiyasidan foydalangan holda tayyorlangan komponentlarni ulaydi.
Komponent ma'lumotlar bazasida yoki konfiguratsiya tartibida ikkilik ma'lumotlar yoki ZIP arxivida saqlanishi mumkin.
"Thin Client" va "Web Client" ishga tushirish rejimlari uchun komponent birinchi navbatda tashqi komponentni o'rnatish usuli yordamida o'rnatilishi kerak.
Sintaksis varianti: ID bo'yicha

Sintaksis:

ConnectExternalComponent(<ИдентификаторОбъекта>)
Variantlar:

<ИдентификаторОбъекта>(majburiy)

Turi: String.
MS Windows registrining ProgID (Dasturli Identifikator) ko'rinishidagi tashqi komponent ob'ektining identifikatori (masalan: "AddIn.Scanner").
Tizimning ro'yxatga olish ma'lumotlar bazasidagi (Reestr) ma'lumotlarga mos kelishi kerak.
Usul variantining tavsifi:

Komponent COM texnologiyasidan foydalangan holda amalga oshirilishi va MS Windows reestrida ro'yxatdan o'tkazilishi kerak.
Ushbu komponentlar 1C: Enterprise 7.7 komponentlari bilan mos keladi.
Diqqat! Usul opsiyasi serverda va tashqi ulanishda ishlamaydi.
Qaytish qiymati:

Turi: mantiqiy.
To'g'ri - ulanish muvaffaqiyatli bo'ldi.
Tavsif:

Tashqi komponentni 1C: Enterprise ga ulaydi.
Tashqi komponentlar ma'lumotlar bazasida yoki konfiguratsiya sxemalarida ZIP arxivi yoki ikkilik ma'lumotlar sifatida yoki fayl tizimi faylida saqlanishi mumkin.
Yupqa mijoz va veb-mijoz ustida ishlaganda komponentni oldindan o'rnatish kerak.

Mavjudligi:

Yupqa mijoz, veb-mijoz, server, tashqi ulanish.
Eslatma:

Tashqi komponentlar Native API yoki COM texnologiyasi yordamida amalga oshirilishi mumkin. COM texnologiyasidan foydalangan holda tayyorlangan komponentlar 1C: Enterprise 7.7 komponentlari bilan mos keladi.
Veb-mijoz faqat ma'lumot bazasidagi arxivga joylashtirilgan komponentlar bilan ishlashi mumkin.
Yupqa mijoz infobazadagi, arxivga qadoqlangan komponentlar va fayl tizimida joylashgan komponentlar bilan ishlashi mumkin.
Qalin mijoz barcha komponentlarni saqlash imkoniyatlarini boshqarishi mumkin. Bunday holda, agar komponent tashqi komponentni o'rnatish usuli yordamida o'rnatilgan bo'lsa, u holda o'rnatilgan komponentdan foydalaniladi va o'rnatilmagan bo'lsa, komponent ulanish vaqtida qabul qilinadi.
Server barcha komponentlar bilan ishlashi mumkin. Komponent har bir server seansida keshlanadi.
Misol:

ConnectExternalComponent("AddinObject.Scanner") bo'lsa
Hisobot ("Shtrix-kod skaneri uchun komponent yuklangan");
Aks holda
Hisobot ("Shtrix-kod skaneri uchun komponent yuklanmagan");
endIf;

  • Oʻquv qoʻllanma

Kirish

Ushbu maqola tashqi komponentlar 1C: Enterprise tizimida qanday ishlashi haqida fikr beradi.
Fayl ish rejimiga ega Windows OS ostida ishlaydigan 1C: Enterprise tizimining 8.2 versiyasi uchun tashqi komponentni ishlab chiqish jarayoni ko'rsatiladi. Ushbu parametr kichik biznes uchun mo'ljallangan ko'pgina echimlarda qo'llaniladi. VK C++ dasturlash tilida amalga oshiriladi.

"1C: Enterprise" tashqi komponentlari

"1C: Enterprise" kengaytiriladigan tizimdir. Tashqi komponentlar (EC) tizimning funksionalligini kengaytirish uchun ishlatiladi. Ishlab chiquvchi nuqtai nazaridan, VC bu xususiyatlar va usullarga ega bo'lgan tashqi ob'ekt bo'lib, 1C: Enterprise tizimi tomonidan qayta ishlash uchun hodisalarni ham yaratishi mumkin.
Tashqi komponentlar 1C: Enterprise-ga o'rnatilgan dasturlash tilida amalga oshirish qiyin yoki hatto imkonsiz bo'lgan muammolarni hal qilish uchun ishlatilishi mumkin. Xususan, bu sinf operatsion tizim bilan past darajadagi o'zaro ta'sirni talab qiladigan vazifalarni o'z ichiga oladi, masalan, muayyan uskunalar bilan ishlash.
1C: Enterprise tizimi tashqi komponentlarni yaratish uchun ikkita texnologiyadan foydalanadi:
  • Native API yordamida
  • COM texnologiyasidan foydalanish
Berilgan cheklovlarni hisobga olgan holda, yuqorida aytib o'tilgan ikkita texnologiya o'rtasidagi farq unchalik katta emas, shuning uchun biz Native API yordamida video o'yinlarni ishlab chiqishni ko'rib chiqamiz. Agar kerak bo'lsa, amalga oshirilgan ishlanmalar COM texnologiyasidan foydalangan holda kompyuter dasturlarini ishlab chiqishda qo'llanilishi mumkin, shuningdek, kichik o'zgartirishlar bilan 1C: Enterprise tizimida faylning ishlash rejimidan tashqari boshqa operatsion variantlari bilan foydalanish uchun qo'llanilishi mumkin.
VK tuzilishi
1C: Enterprise tizimining tashqi komponenti DLL kutubxonasi ko'rinishida taqdim etilgan. Kutubxona kodi IComponentBase avlod sinfini tavsiflaydi. Yaratilgan sinf tashqi komponentning funktsiyalarini amalga oshirish uchun mas'ul bo'lgan usullarni belgilashi kerak. Material taqdim etilganda, bekor qilingan usullar quyida batafsilroq tavsiflanadi.

VK demosini ishga tushirish

Vazifa:
  1. ITS obunasi bilan ta'minlangan va 1Cda tashqi komponent mexanizmining asosiy imkoniyatlarini namoyish qilish uchun mo'ljallangan tashqi komponentni yig'ing.
  2. Namoyish komponentini 1C konfiguratsiyasiga ulang
  3. E'lon qilingan funktsiyalar to'g'ri ishlashiga ishonch hosil qiling
Jamlama
Demo VK ITS obuna diskida “/VNCOMP82/example/NativeAPI” katalogida joylashgan.
Demo VC yaratish uchun biz Microsoft Visual Studio 2008 dan foydalanamiz. Ushbu mahsulotning boshqa versiyalari ishlatiladigan Visual Studio loyihasi formatini qo'llab-quvvatlamaydi.


AddInNative loyihasini oching. Loyiha sozlamalarida biz loyihani yaratish uchun zarur bo'lgan sarlavha fayllari bilan katalogni kiritamiz. Odatiy bo'lib, ular katalogdagi ITS diskida joylashgan /VNCOMP82/include.
Qurilish natijasi fayldir /bind/AddInNative.dll. Bu 1C konfiguratsiyasiga ulanish uchun tuzilgan kutubxona.
VK ni 1C konfiguratsiyasiga ulash
Keling, bo'sh 1C konfiguratsiyasini yarataylik.
Quyida boshqariladigan dastur moduli uchun kod keltirilgan.
o'zgaruvchan DemoComp; Tizim ishga tushganda protsedura() Tashqi komponentni ulash("...\bind\AddInNative.dll", "DemoVK", Tashqi komponent turi.Native); DemoComp = Yangi ("AddIn.DemoVK.AddInNativeExtension"); EndProcedure
Agar 1C konfiguratsiyasini ishga tushirishda xatolik haqida xabar berilmagan bo'lsa, u holda VK muvaffaqiyatli ulangan.
Yuqoridagi kodni bajarish natijasida konfiguratsiyaning global ko'rinishida ob'ekt paydo bo'ladi DemoComp, tashqi komponentning kodida aniqlangan xususiyatlar va usullarga ega.
O'rnatilgan funksionallikni namoyish qilish
Keling, VK demosining funksionalligini tekshirib ko'raylik. Buning uchun ba'zi xususiyatlarni o'rnatish va o'qish, ba'zi VK usullarini chaqirish, shuningdek, VK xabarini qabul qilish va qayta ishlashga harakat qilaylik.
ITS diskida taqdim etilgan hujjatlar demo VC ning quyidagi funksiyalarini bildiradi:
  1. Komponent ob'ekt holatini boshqarish
    Usullari: Yoqish; ishga tushirish, O'chiring
    Xususiyatlari: Kiritilgan
  2. Taymerni boshqarish
    Har soniyada komponent 1C: Enterprise tizimiga parametrlari bilan xabar yuboradi Komponent, Taymer va tizim soati hisoblagich liniyasi.
    Usullari: Taymerni ishga tushirish, Taymerni to'xtatish
    Xususiyatlari: Taymer mavjud
  3. Usul ShowInStatusLine, u holat qatorida parametr sifatida usulga o'tkazilgan matnni ko'rsatadi
  4. Usul Rasmni yuklash. Belgilangan fayldan rasmni yuklaydi va uni ikkilik ma'lumotlar ko'rinishida 1C: Enterprise tizimiga o'tkazadi.
Keling, ushbu funktsiyalar ishlashiga ishonch hosil qilaylik. Buning uchun quyidagi kodni ishga tushiring:
o'zgaruvchan DemoComp; Tizim ishga tushganda protsedura() ConnectExternalComponent(...); DemoComp = Yangi ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable(); Hisobot (DemoComp.Enabled); DemoComp.Enable(); Hisobot (DemoComp.Enabled); DemoComp.StartTimer(); Jarayonning tugashi protsedurasi Tashqi hodisani qayta ishlash (Manba, hodisa, ma'lumotlar) hisoboti (Manba + " " + Voqea + " " + Ma'lumotlar); EndProcedure
Konfiguratsiyani ishga tushirish natijasi rasmda ko'rsatilgan


"Xabarlar" paneli usul chaqiruvlari natijalarini ko'rsatadi DemoComp.Disable() Va Demo.Comp.Enable(). Xuddi shu paneldagi keyingi qatorlar VK-dan olingan xabarlarni qayta ishlash natijalarini o'z ichiga oladi - Manba, Tadbir Va Ma'lumotlar mos ravishda.

Maxsus tashqi komponent nomi

Vazifa: tashqi komponent nomini o'zboshimchalik bilan o'zgartiring.
Oldingi bo'limda identifikator ishlatilgan AddInNativeExtension, uning ma'nosi tushuntirilmagan. Ushbu holatda AddInNativeExtension- bu kengaytmaning nomi.
VK kodi usulni belgilaydi RegisterExtensionAs, ismni 1C: Enterprise tizimiga qaytarish, bu tizimda VKni keyinchalik ro'yxatdan o'tkazish uchun zarurdir. Tashqi komponentning mohiyatini ma'lum darajada ochib beradigan identifikatorni ko'rsatish tavsiya etiladi.
Mana usulning to'liq kodi RegisterExtensionAs kengaytma nomi o'zgartirilganda:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; agar (hay_haymay) ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, iActualSize) false qaytaradi;
Berilgan misolda VK nomi o'zgartirilgan Ba'zi ism. Keyin VK-ni ulashda siz yangi nom ko'rsatishingiz kerak:
DemoComp = Yangi ("AddIn.DemoVK.SomeName");

VK xususiyatlari ro'yxatini kengaytirish

Vazifa:
  1. VK xususiyatlarini amalga oshirishni o'rganish
  2. String turidagi o'qish/yozish xususiyatini qo'shing
  3. Oxirgi xususiyatlar to'plamining ma'lumotlar turini saqlaydigan o'qish/yozish string xususiyatini qo'shing. Mulk qiymatini belgilashda hech qanday chora ko'rilmaydi

Yaratilayotgan komponentning xususiyatlarini aniqlash uchun ishlab chiquvchi AddInNative.cpp kutubxona kodida quyidagi usullarni amalga oshirishi kerak:
GetNProps
Ushbu kengaytmaning xossalari sonini qaytaradi, agar xossalar bo'lmasa 0
FindProp
Parametrlarda nomi berilgan xususiyatning seriya raqamini qaytaradi
GetPropName
Seriya raqami va o'tkazilgan til identifikatori bo'yicha mulk nomini qaytaradi
GetPropVal
Belgilangan tartib raqami bilan mulk qiymatini qaytaradi
SetPropVal
Belgilangan tartib raqami bilan mulk qiymatini o'rnatadi
IsPropReadable
Belgilangan tartib raqami bilan xususiyatning o'qilishi bayrog'ini qaytaradi
IsPropWritable
Belgilangan tartib raqami bilan xususiyatning yoziluvchanlik belgisini qaytaradi


Yuqoridagi sinf usullarini amalga oshirishni ko'rib chiqamiz CADdInNative.
Demo VCda 2 xususiyat aniqlanadi: Kiritilgan Va Taymer mavjud (Yoqilgan Va IsTimerPresent).
Kutubxona kodining global miqyosida ikkita massiv aniqlanadi:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Yoqilgan", L"Taymer bor");
qaysi rus va ingliz mulk nomlari saqlanadi. Sarlavha faylida AddInNative.h ro'yxat belgilanadi:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Har doim oxirgi );
ePropIsEnabled Va ePropIsTimerPresent, mos ravishda 0 va 1 qiymatlariga ega bo'lgan xususiyatlarning seriya raqamlarini mazmunli identifikatorlar bilan almashtirish uchun ishlatiladi. Xususiyatlar sonini olish uchun 2 qiymatiga ega ePropLast ishlatiladi (GetNProps usuli yordamida). Bu nomlar faqat komponent kodi ichida ishlatiladi va tashqaridan mavjud emas.
FindProp va GetPropName usullari massiv qidiruvlarini amalga oshiradi g_PropNames Va g_PropNamesRu.
Kutubxona modulidagi maydonlarning qiymatlarini saqlash uchun CADdInNative klassi komponent xususiyatlarining qiymatini saqlaydigan xususiyatlarga ega. Usullari GetPropVal Va SetPropVal qaytaring va shunga mos ravishda ushbu xususiyatlarning qiymatini o'rnating.
Usullari IsPropReadable Va IsPropWritable va qaytish rost yoki yolg'on, ilova mantiqiga muvofiq mulkning o'tgan tartib raqamiga qarab.
Shaxsiy xususiyatni qo'shish uchun sizga kerak:

  1. Massivlarga qo'shilayotgan xususiyat nomini qo'shing g_PropNames Va g_PropNamesRu(fayl AddInNative.cpp)
  2. Ro'yxatga olish Taqdimotlar(fayl AddInNative.h) oldin ePropLast qo'shilayotgan xususiyatni noyob tarzda aniqlaydigan nom qo'shing
  3. Xususiyat qiymatlarini saqlash uchun xotirani tashkil qiling (tegishli qiymatlarni saqlaydigan modul komponentlari maydonlarini yarating)
  4. Usullarga o'zgartirishlar kiriting GetPropVal Va SetPropVal oldingi bosqichda ajratilgan xotira bilan ishlash uchun
  5. Ilova mantig'iga muvofiq usullarga o'zgartirishlar kiriting IsPropReadable Va IsPropWritable
1, 2, 5-bandlar tushuntirishga muhtoj emas. Ushbu bosqichlarni amalga oshirish tafsilotlarini maqolaga ilovani o'rganish orqali topish mumkin.
Test xususiyatlariga nom beraylik Sinov Va Tekshirish turi mos ravishda. Keyin, 1-bosqich natijasida bizda:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Enabled", L"Taymer bor", L"Test", L"Type Check");
Transfer Taqdimotlar quyidagicha ko'rinadi:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Har doim oxirgi );
Kodni sezilarli darajada soddalashtirish uchun biz STL C++ dan foydalanamiz. Xususan, torlar bilan ishlash uchun WCHAR, kutubxonani ulaymiz wstring.
Usulning qiymatini saqlash uchun Sinov, biz sinfda aniqlaymiz CADdInNative xususiy soha doirasida:
string test1;
1C: Enterprise va tashqi komponentlar o'rtasida qator parametrlarini uzatish uchun 1C: Enterprise xotira menejeri ishlatiladi. Keling, uning ishini batafsil ko'rib chiqaylik. Funktsiyalar mos ravishda xotirani ajratish va bo'shatish uchun ishlatiladi AllocMemory Va Bepul xotira faylda belgilangan ImemoryManager.h. Agar 1C: Enterprise tizimiga satr parametrini o'tkazish kerak bo'lsa, tashqi komponent funktsiyani chaqirish orqali unga xotira ajratishi kerak. AllocMemory. Uning prototipi quyidagicha ko'rinadi:
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
Qayerda pXotira- ajratilgan xotira maydoni manzili joylashtiriladigan ko'rsatgichning manzili,
ulCountByte- ajratilgan xotira maydoni hajmi.
Satr uchun xotira ajratishga misol:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Satrli ma'lumotlar turlari bilan ishlash qulayligi uchun biz funktsiyani tavsiflaymiz wstring_to_p. U parametr sifatida wstring satrini oladi. Funktsiyaning natijasi to'ldirilgan strukturadir tVariant. Funktsiya kodi:
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) -> pstrVal = t1; str.length(); rostini qaytaring)
Keyin usulning switch bayonotining mos keladigan holat bo'limi GetPropVal shaklni oladi:
case ePropTest1: wstring_to_p(test1, pvarPropVal); sindirish;
Usul SetPropVal:
case ePropTest1: agar (TV_VT(varPropVal) != VTYPE_PWSTR) false qaytarsa; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); sindirish;
Ikkinchi xususiyatni amalga oshirish uchun biz sinf maydonini aniqlaymiz CaddInNative
uint8_t last_type;
unda biz oxirgi o'tkazilgan qiymatning turini saqlaymiz. Buning uchun buyruqni CaddInNative::SetPropVal usuliga qo'shing:
oxirgi_tur = TV_VT(varPropVal);
Endi, ikkinchi xususiyatning qiymatini o'qishni so'raganda, biz qiymatni qaytaramiz oxirgi_turi, belgilangan vazifa nimani talab qiladi.
Keling, kiritilgan o'zgarishlarning funksionalligini tekshirib ko'ramiz.
Buning uchun 1C konfiguratsiyasining ko'rinishini quyidagicha taqdim etamiz:
o'zgaruvchan DemoComp; Tizim ishga tushganda protsedura() Tashqi komponentni ulash("...", "DemoVK", tashqi komponent turi.Native); DemoComp = Yangi ("AddIn.DemoVK.SomeName"); DemoComp.TypeCheck = 1; Hisobot (String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Hisobot (String(DemoComp.Test)); DemoComp.Test = "Petya"; Hisobot (String(DemoComp.Test)); Hisobot (String(DemoComp.TypeCheck)); EndProcedure
Ishga tushirish natijasida biz xabarlar ketma-ketligini olamiz:
3
Vasya
Piter
22

Ikkinchi va uchinchi xabarlar oldingi bosqichda o'rnatilgan xususiyatni o'qish natijasidir. Birinchi va ikkinchi xabarlar oxirgi xususiyat to'plamining tip kodini o'z ichiga oladi. 3 butun son qiymatiga, 22 qator qiymatiga mos keladi. Turlarning muvofiqligi va ularning kodlari faylda o'rnatiladi turlari.h, ITS diskida joylashgan.

Usullar ro'yxatini kengaytirish

Vazifa:
  1. Quyidagi funksiyalar bilan tashqi komponentning funksionalligini kengaytiring:
  2. Tashqi komponent usullarini amalga oshirish yo'llarini o'rganing
  3. Funktsiya usulini qo'shing Funktsiya 1, bu parametr sifatida ikkita satrni (“Parameter1” va “Parameter2”) oladi. Natijada quyidagi qator paydo bo'ladi: “Tekshirish. Parametr1, Parametr2"
  4. Siz kiritgan o'zgarishlar ishlayotganiga ishonch hosil qiling.

Yaratilayotgan komponentning usullarini aniqlash uchun ishlab chiquvchi AddInNative kutubxona kodida quyidagi usullarni amalga oshirishi kerak:
GetNMethods, Find Method, GetMethodName
Tegishli miqdordagi usullarni olish, usulning raqami va nomini qidirish uchun mo'ljallangan. Xususiyatlar uchun mos keladigan usullarga o'xshash
GetNParams
Belgilangan tartib raqami bilan usul parametrlari sonini qaytaradi; agar bu raqamga ega bo'lgan usul bo'lmasa yoki parametrlari bo'lmasa, 0 ni qaytaradi
GetParamDefValue
Belgilangan usulning belgilangan parametrining standart qiymatini qaytaradi
HasRetVal
Belgilangan tartibli qaytarish qiymatiga ega usul mavjud bo'lgan bayroqni qaytaradi: qaytariladigan qiymatga ega usullar uchun true va yolg'on aks holda
CallAsProc
yolg'on, ish vaqti xatosi yuzaga keladi va 1C: Enterprise modulining bajarilishi tugatiladi. Parametrlar massivi uchun xotira 1C: Enterprise tomonidan ajratiladi va chiqariladi.
CallAsFunc
Belgilangan tartib raqami bilan usulni bajaradi. Agar usul qaytsa yolg'on, ish vaqti xatosi yuzaga keladi va 1C: Enterprise modulining bajarilishi tugatiladi. Parametrlar massivi uchun xotira 1C: Enterprise tomonidan ajratilgan. Qaytish qiymati satr yoki ikkilik ma'lumotlar turi bo'lsa, komponent xotirani funksiya bilan ajratadi AllocMemory xotira menejeri, u erda ma'lumotlarni yozadi va ushbu manzilni strukturaning tegishli maydonida saqlaydi. 1C: Korxona ushbu xotirani qo'ng'iroq qilish orqali bo'shatadi Bepul xotira.
Usullarning to'liq tavsifi, jumladan, parametrlar ro'yxati ITS diskida taqdim etilgan hujjatlarda batafsil tavsiflangan.
Keling, yuqorida tavsiflangan usullarni amalga oshirishni ko'rib chiqaylik.
Komponent kodida ikkita massiv aniqlanadi:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Enable", L"O'chirish", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
va ro'yxatga olish:
enum usullari (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Har doim oxirgi);
Ular funktsiyalarda qo'llaniladi GetNMethods, Find Method Va GetMethodName, xususiyatlar tavsifi bilan o'xshashlik bo'yicha.
Usullari GetNParams, GetParamDefValue, HasRetVal o'tkazilgan parametrlar va dastur mantig'iga qarab amalga oshirish kaliti kerakli qiymatni qaytaradi. Usul HasRetVal uning kodida natijani qaytara oladigan faqat usullar ro'yxati mavjud. Ular uchun u qaytib keladi rost. Barcha po'lat usullari uchun qaytib keladi yolg'on.
Usullari CallAsProc Va CallAsFunc Usulning bevosita bajariladigan kodini o'z ichiga oladi.
Faqat funktsiya sifatida chaqirilishi mumkin bo'lgan usulni qo'shish uchun siz tashqi komponentning manba kodiga quyidagi o'zgarishlarni kiritishingiz kerak:
  1. Massivlarga usul nomini qo'shing g_Usul nomlari Va g_MethodNamesRu(fayl AddInNative.cpp)
  2. Usullar ro'yxatiga mazmunli usul identifikatorini qo'shing (fayl AddInNative.h)
  3. Funktsiya kodiga o'zgartirishlar kiriting GetNParams dastur mantig'iga ko'ra
  4. Agar kerak bo'lsa, usul kodiga o'zgartirishlar kiriting GetParamDefValue, agar siz usul parametrlarining standart qiymatlaridan foydalanmoqchi bo'lsangiz.
  5. Funktsiyaga o'zgartirishlar kiriting HasRetVal
  6. Funktsiyalar mantiqiga o'zgartirishlar kiriting CallAsProc yoki CallAsFunc, u erda usulning to'g'ridan-to'g'ri bajariladigan kodini joylashtirish
Keling, massivlarni taqdim qilaylik g_Usul nomlari Va g_MethodNamesRu, shuningdek ro'yxatga olish Usullari shaklga:
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"O'chirish", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test");

Raqamlash usullari (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Har doim oxirgi );
Funktsiyani tahrir qilaylik GetNProps Shunday qilib, u "Test" usuli parametrlari sonini qaytaradi:
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; )
Funktsiyaga o'zgartirish kiritamiz:
bool CAddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) (TV_VT(pvarParamDefValue)= VTYPE_EMPTY; switch(lMethodNum) ( case eMethable: eMeth thStartTimer : case eMethStopTimer: case eMethTest : / / sukut bo'yicha hech qanday parametr qiymatlari yo'q: sukut bo'yicha false;
Qo'shilgan qator uchun rahmat
eMethTest holati:
agar bir yoki bir nechta argumentlar etishmayotgan bo'lsa, mos keladigan parametrlar bo'sh qiymatga ega bo'ladi ( VTYPE_EMPTY). Agar parametr uchun standart qiymat kerak bo'lsa, uni bo'limda o'rnatishingiz kerak eMethTest funktsiyani almashtirish bayonoti CAddInNative::GetParamDefValue.
Test usuli qiymatni qaytarishi mumkinligi sababli, siz funktsiya kodiga o'zgartirish kiritishingiz kerak HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) return false; )
Va funktsiyaga usulning bajariladigan kodini qo'shing CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethodNum: case eMethodPic; if (!lSizeArray || !paParams) qaytar s1 = (paParams) -> pwstrVal; ;
Komponentni kompilyatsiya qilamiz va konfiguratsiya kodini formaga keltiramiz:
o'zgaruvchan DemoComp; Tizim ishga tushganda protsedura() Tashqi komponentni ulash("...", "DemoVK", tashqi komponent turi.Native); DemoComp = Yangi ("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Salom", "Dunyo!"); Hisobot (boshiga); EndProcedure
Konfiguratsiyani ishga tushirgandan so'ng, biz "Salom, dunyo!" Xabarini olamiz, bu usul muvaffaqiyatli ishlaganligini ko'rsatadi.

Taymer

Vazifa:
  1. VK demosida taymerni amalga oshirishni o'rganing
  2. Taymerning javob oralig'ini parametrlarga o'tkazish qobiliyatini qo'shish orqali "StartTimer" usulini o'zgartiring (millisekundlarda)
  3. Siz kiritgan o'zgarishlar ishlayotganiga ishonch hosil qiling.

WinAPI-da siz vaqt bilan ishlash uchun xabardan foydalanishingiz mumkin WM_TIMER. Ushbu xabar taymer yaratishda siz o'rnatgan vaqt oralig'ida dasturingizga yuboriladi.
Taymer yaratish uchun funksiyadan foydalaning Taymerni sozlash:
UINT SetTimer(HWND hWnd, // oyna deskriptori UINT nIDevent, // taymer identifikatori (raqam) UINT nElapse, // TIMERPROC lpTimerFunc kechikishi); // funktsiyaga ko'rsatgich
Operatsion tizim xabar yuboradi WM_TIMER argumentda belgilangan interval bilan dasturga nElapse(millisekundlarda). Oxirgi parametrda siz taymer har safar ishga tushirilganda bajariladigan funksiyani belgilashingiz mumkin. Ushbu funktsiyaning sarlavhasi quyidagicha ko'rinishi kerak (nomi har qanday bo'lishi mumkin):
bekor __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Keling, demo VCda taymerni amalga oshirishni ko'rib chiqaylik.
Biz Windows OS oilasi uchun tashqi komponentni ishlab chiqish jarayonini ko'rib chiqayotganimiz sababli, biz boshqa operatsion tizimlarda taymerni amalga oshirishni ko'rib chiqmaymiz. GNU/Linux OS uchun, xususan, amalga oshirish funksiya sintaksisida farqlanadi. Taymerni sozlash Va TimerProc.
Bajariladigan kod usulni chaqiradi Taymerni sozlash, funksiya uzatiladigan MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Yaratilgan taymerning identifikatori o'zgaruvchiga joylashtiriladi m_uiTimer keyin uni o'chirib qo'yish uchun.
Funktsiya MyTimerProc quyida bayon qilinganidek:
VOID QO'NG'IROQ MyTimerProc(HWND hwnd, // taymer xabarlari uchun oyna dastasi UINT uMsg, // WM_TIMER xabar UINT idEvent, // taymer identifikatori DWORD dwTime // joriy tizim vaqti) ( agar (!pAsyncEvent) qaytish; wchar_t *who L = "ComponentNative", *what = L"Timer" wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(kim , nima, wstime);
Funktsiyaning mohiyati shundaki, usul chaqiriladi Tashqi hodisa, bu 1C: Enterprise tizimiga xabar yuboradi.
Usulning funksionalligini kengaytirish uchun Taymerni ishga tushirish Keling, quyidagilarni bajaramiz:
Usul kodini o'zgartirish GetNParams shunday qilib, bu usul uchun eMethStartTimer Qaytgan qiymat 1:
case eMethStartTimer: qaytish 1;
Mana usul kodi CallAsProc shaklga:
case eMethStartTimer: agar (!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;
Endi funksionallikni tekshiramiz. Buning uchun biz kodni konfiguratsiyaning boshqariladigan dastur moduliga yozamiz:
o'zgaruvchan DemoComp; Tizim ishga tushganda protsedura() Tashqi komponentni ulash("...", "DemoVK", tashqi komponent turi.Native); DemoComp = Yangi ("AddIn.DemoVK.SomeName"); DemoComp.StartTimer (2000); EndProcedure
Konfiguratsiyani ishga tushirgandan so'ng, dastur 2 soniya oralig'ida xabarlarni oladi, bu taymerning to'g'ri ishlayotganligini ko'rsatadi.

1C: Enterprise tizimi bilan o'zaro aloqa

Tashqi komponent va 1C: Enterprise tizimi o'rtasida o'zaro ta'sir qilish uchun faylda tasvirlangan IAddInDefBase sinfining usullari AddInDefBase.h. Biz eng ko'p ishlatiladiganlarni sanab o'tamiz:
Xato xabarini yaratish
virtual bool ADDIN_API AddError(imzosiz qisqa kod, const WCHAR_T* manba, const WCHAR_T* tavsif, uzun kod)
wcode, kod- xato kodlari (tavsiflari bilan xato kodlari ro'yxatini ITS diskida topish mumkin)
manba- xatolik manbai
tavsif- xato tavsifi
1C: Enterprise tizimiga xabar yuborish
virtual bool ADDIN_API tashqi hodisasi (WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszSource- xabar manbai
wszMessage- Xabar matni
wszData- uzatilgan ma'lumotlar
Xabarni ushlash tashqi hodisalarni qayta ishlash protsedurasi orqali amalga oshiriladi
1C: Enterprise tizimida tashqi komponentni ro'yxatdan o'tkazish
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- komponent nomi.
Ushbu usullar VK va 1C o'rtasidagi to'liq o'zaro ta'sir qilish uchun etarli. 1C: Enterprise tizimidan tashqi komponent tomonidan ma'lumotlarni olish uchun va aksincha, tashqi komponent maxsus xabarni yuboradi, bu esa o'z navbatida 1C tizimi tomonidan ushlanadi va kerak bo'lganda ma'lumotlarni uzatish uchun tashqi komponentning usullarini chaqiradi. .

tVariant ma'lumotlar turi

Tashqi komponent va 1C: Enterprise tizimi o'rtasida ma'lumot almashishda tVariant ma'lumotlar turi qo'llaniladi. U ITS diskida joylashgan type.h faylida tasvirlangan:
struct _tVariant ( _ANONYMOUS_UNION birlashmasi ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint8_Val; uintul6; uintul2; t ; float fltVal; struct tm tmVal; pInterfaceVal __VARIANT_NAME_2/*iface*/; //belgilar soni ) __VARIANT_NAME_1 pvarVal TYPEVAR vt da o'lchovli massiv;
Turi tVariant tarkibiga quyidagilar kiradi:
  • to'g'ridan-to'g'ri ma'lumotlarni saqlash uchun mo'ljallangan aralash (birlashma).
  • ma'lumotlar turi identifikatori
Umuman olganda, turdagi o'zgaruvchilar bilan ishlash tVariant quyidagi algoritm bo'yicha sodir bo'ladi:
  1. O'zgaruvchida hozirda saqlangan ma'lumotlar turini aniqlash
  2. Ma'lumotlarga bevosita kirish uchun mos keladigan aralash maydoniga kiring
Turidan foydalanish tVariant 1C: Enterprise tizimi va tashqi komponentlarning o'zaro ta'sirini sezilarli darajada soddalashtiradi

Ilova

"Misollar" katalogida maqola uchun misollar mavjud
misollar/1 - demo komponentni ishga tushirish
misollar/2 - mulk ro'yxatini kengaytirishni namoyish qilish
misollar/3 - usullar ro'yxatini kengaytirishni ko'rsatish
Har bir katalogda VS 2008 loyihasi va tayyor 1C konfiguratsiyasi mavjud.