ХОНХ

Энэ мэдээг чамаас өмнө уншсан хүмүүс бий.
Хамгийн сүүлийн үеийн нийтлэлүүдийг авахын тулд бүртгүүлнэ үү.
Имэйл
Нэр
Овог
Та "Хонх"-ыг хэрхэн уншихыг хүсч байна вэ?
Спам байхгүй

Асуулт: 1С 8.3 дээрх Linux (Ubuntu x64)-д зориулсан C++-ийн гадаад уугуул Api бүрэлдэхүүн хэсэг


Би VK бичиж байна, би ubuntu дээр 1s-тэй холбогдож чадахгүй байна. 1-ийн жишээ хүртэл холбогдоогүй байна. Тиймээс энэ тухай асуулт:

1) Би нийтлэлд өгөгдсөн VNCOMPS жишээнээс VK-г холбохыг оролдож байна

(холбоосыг хамгийн төгсгөлд нь олж болно: "Хуулбарлах").
Дотооддоо NativeApi төсөл нь makefile-тэй. Үүний тусламжтайгаар би Ununtu дээр .so номын сан байгуулдаг.
Гэхдээ "Гадаад бүрэлдэхүүн хэсгийг холбох" 1 дээр хөөрч байна.
Үүнтэй адилаар, хэрэв би "build.sh" (төслийн үндэс) ашиглан бүтээх юм бол.

Makefile дотроо би тугийг m32-оос m64 болгон өөрчилдөг, учир нь 1c ба x64 систем өөрөө. (m32 параметртэй бол энэ нь ямар ч байсан авахгүй)
1С 8.3-аас VK руу залгах жишээ энд байна.
Холболт дууссан = Гадаад бүрэлдэхүүн хэсгийг холбоно уу("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Яг энэ сэдвээр нийтлэл байна.
Гэхдээ миний харж байгаагаар эдгээр бүх зүйлийг VNCOMPS жишээн дээр аль хэдийн анхаарч, зассан болно.

Гэхдээ үнэн хэрэгтээ эмхэтгэлийн параметрүүдийн хувьд бизнес. MB 32 битийн гадаад бүрэлдэхүүн хэсэг нь ихэвчлэн 32 бит 1c хүртэл холбогддог, гэхдээ би Ubuntu x64 1c enterprise83 8.3.5-1486 amd64 дээр суулгасан. Би түүнд VK авахыг хүсч байна.

Энэ асуудлыг хэрхэн шийдэх талаар ямар нэгэн санаа байгаа хүн байна уу?
VNCOMPS жишээ ажиллах ёстой, гэхдээ бүтээх параметрүүдийг засах шаардлагатай эсвэл миний туршиж байгаа платформ өөрөө буруу байна.

Хариулт:Сонирхолтой нь Java хэл дээр гадаад бүрэлдэхүүн хэсэг бичих боломжтой юу?

Асуулт: Гадаад бүрэлдэхүүн хэсэг (Үндсэн) холбогдоогүй байна


64 ба 32 битийн системд зориулсан ITS-ийн жишээг эмхэтгэсэн.

Би ингэж холбогдож байна:
ConnectionResult = ConnectExternalComponent(CDLLPath, "Comp", ExternalComponentType.Native); Нэг компьютер холбогддог, нөгөө нь холбогддоггүй. Үйлдлийн системд ялгаа бий. Холболт явж байгаа газар Win7, Win10 байхгүй газар байна. Үүний зэрэгцээ стандарт бүрэлдэхүүн хэсгүүд нь миний бүрэлдэхүүн хэсэг ажиллахгүй байгаа компьютер дээр ажилладаг.

Өөр өөр платформ дээр туршиж үзсэн (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Яагаад холбогдохгүй байгааг яаж ойлгох вэ?

Хариулт: vc_redist мартаагүй байна уу?

Асуулт: 1С8 ба төрөлх төрлийн гадаад бүрэлдэхүүн хэсэг


Өдрийн мэнд.
BP 3.0.50.12-ийн тохиргоо байдаг бөгөөд UniServerAuto ашиглан Scales-Soft компаниас жинлэхийг хэрэгжүүлэх хүсэл байдаг.
Хөгжүүлэгчид Windows 32 болон 64-д зориулсан Native бүрэлдэхүүн хэсгийг эмхэтгэж, хамгийн том файлтай архивт оруулсан. Мөн 1С-ийн жинг хэрхэн тооцоолох жишээ байдаг. Үүнд, хоёртын өгөгдөл бүхий байршлын тусламжтайгаар энэ архивыг миний ойлгож байгаагаар зааж өгсөн болно. Жишээн дээр бүх зүйл хэвийн байна: бүрэлдэхүүн хэсэг нь суулгаж, холбогдсон, дараа нь холболтыг тогтоож, жинг уншина.
Гэхдээ та өөрийгөө 1С руу шилжүүлж эхэлмэгц жинг уншдаггүй. Бүх зүйл зүгээр л бичсэн юм шиг санагдаж байна, гэхдээ би тармуур хаана байгааг ойлгохгүй байна.
Хэнд бага зэрэг хугацаа байх вэ - туслаач, нэг нүдээрээ хараарай, магадгүй шийдэл нь гадаргуу дээр байгаа ч би хаа нэгтээ буруу газар алхаж, буруу зүйл хийж байна. Би өмнө нь Native технологитой ажиллаж байгаагүй...

Мөн хавсралтад миний боловсруулах текст байна

Хариулт:

За, надад мэдээ байна ...
Энэ нь ямар үед бүтэлгүйтэж байгааг алхам алхмаар харж эхэлсэн. Үүнийг хийхийн тулд би хоосон мэдээллийн сан үүсгэж, командын тусламжтайгаар боловсруулалт хийсэн. Нийлүүлэгчийн жишээтэй ижил төстэй байдлаар би байршлыг шинэ тохиргоонд шилжүүлсэн - энэ нь хоёр дахь удаагаа ажиллаж байна. Тэдгээр. Эхний удаа үгүй, хоёр дахь удаагаа тийм. Энэ нь түүнийг боловсруулах явцад бүрэлдэхүүн хэсэг болон объектын холболтыг өөр өөр журмын дагуу салгах шаардлагатай хэвээр байх болно гэсэн санааг төрүүлэв.
Дараа нь би үүнийг байршлын холболтоор өөрийн мэдээллийн сан руу шилжүүлсэн - энэ нь ажилладаг. Фүх, энэ нь аль хэдийн сайн байна .... Гэхдээ би тохиргоонд өөрчлөлт оруулахгүй байхыг хүсч байна, тиймээс цааш явцгаая

Би боловсруулалтанд бүдүүвч нэмэхийг оролдож байна. Түүний хэмжээ тэр даруй 10кб-аас 3мб хүртэл нэмэгдэж, мэдэгдэхүйц удаашрал ажиглагдаж байна - энэ нь тохирохгүй байна. Би бүрэлдэхүүн хэсгийг dll-ээр дамжуулан холбохыг ухаж эхэлдэг. Тэдгээр. үндсэндээ таны эхлүүлсэнтэй ижил. Гэхдээ нэг "ГЭХДЭЭ" байгаа: хэрэглэгчийн хавтас дахь dll-ийн нэрээр хайлт хийснээр би энэ dll нь 1С-д бүртгэгдсэн dll-үүдийг (миний ойлгож байгаагаар) хаана байгааг анзаарсан.
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
Үүний дагуу dll-ийн бүрэн замыг ашиглах шаардлагагүй, та зүгээр л нэрийг нь бичиж болно:
ConnectExternalComponent("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

Би оролдох ... бүртгэл дээр тангараг өргөх боловч жинлэлтийн үр дүнг буцааж өгдөг. Dll аль хэдийн бүртгэгдсэн байгаа тул та үүнийг холбох хэрэгтэй гэсэн үг юм. Би үүнийг устгаад бүх зүйл ажилладаг.
Би дүгнэж хэлэхэд:
1. Процедур дахь жинг боловсруулахдаа нээх үед би гаднах бүрэлдэхүүн хэсгийн холболт болон объектын холболтыг нэмсэн.
2. dll-ийн замыг би бичээгүй, зүгээр л нэрийг нь зааж өгсөн.

Одоо би 1С-д dll хэзээ суулгасан бэ гэж бодоод сууж байна. Програм хангамж суулгах үед? Бараг л... Энэ dll-ийн хөгжүүлэгчийн тохиргоог ажиллуулах үед маягтыг нээх үед хаана тохируулдаг вэ? Мэдэхгүй л дээ, гэхдээ надад ойр юм шиг байна... Чи юу гэж бодож байна?
Хоёрдугаарт, шинэ газар, ижил терминал суурилуулах шаардлагатай үед бүх зүйлийг ажиллуулахын тулд юу хийх хэрэгтэй вэ? Програм хангамжийг бүрэн суулгаж, нийлүүлэгчийн тохиргоог ажиллуулж ажлыг шалгаад дараа нь (онолын хувьд) миний боловсруулалт ажиллах ёстой юу? Бага зэрэг төвөгтэй зүйл байна ... Эсвэл миний боловсруулалтанд програм хангамжийг суулгасны дараа, InstallExternalComponent-ийг нэг удаа хийх үү?

Энэ талаар таны бодлыг сонсохыг хүсч байна ...

Асуулт: Гадаад komponent.dll


Бүгдэд нь энэ өдрийн мэнд.
Нэг асуулт.
dll бүрэлдэхүүн хэсэг нь 1С 7.7 дээр сайн ажилладаг
1s-д 8.1 огт ачаалахыг хүсэхгүй байна ...
Үүнийг C:\Program Files\1cv81\bin\cache1c.dll-д буулгаж үзсэн.
Би regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll" ашиглан бүртгүүлэх гэж оролдсон.
Асуудалгүй бүртгүүлсэн.
Би үүнд хандахыг оролдох үед би алдааны мессежийг хүлээн авдаг:

Гадаад бүрэлдэхүүн хэсгийг ачаалахад алдаа гарлаа! cache1c.dll
Процедур Гүйцэтгэх товчийг дарах(товчлуур) Гадаад бүрэлдэхүүн хэсгийг ачаалах оролдлого( "C:\Program Files\1cv81\bin\cache1c.dll"); Онцгой байдлын тайлан( "Гадаад бүрэлдэхүүн хэсгийг ачаалахад алдаа гарлаа!"+ "cache1c.dll"); оролдлогын төгсгөл; оролдлого // Бүрэлдэхүүн хэсэг объектыг авах. // m = Шинэ ("cache1c.GTMcmd" ); m = Шинэ COMObject("cache1c.GTMcmd" ); Онцгой байдлын тайлан(); оролдлогын төгсгөл; Төгсгөлийн процедур

Хариулт:Боломжгүй болтлоо улиг болсон...
Дуудлагын хоорондох завсарлага (миллисекунд) байх шаардлагатай...
Процедур ButtonExecuteClick(Button) оролдлого // Бүрэлдэхүүн хэсэг объектыг авах. m = Шинэ COMObject("cache1c.GTMcmd" ); Онцгой байдлын тайлан( "Гадаад бүрэлдэхүүн хэсгийн объектыг үүсгэж чадсангүй"); оролдлогын төгсгөл; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.pause(100); ...... гэх мэт
1s 7.7-ийн хувьд - энэ нь шаардлагагүй, харьцах нь илүү хурдан болох нь харагдаж байна.

Асуулт: 1С сервертэй гадаад бүрэлдэхүүн хэсгийн ажил ...


Өдрийн мэнд,

C ++ хэл дээр бичигдсэн гадаад бүрэлдэхүүн хэсэг байдаг бөгөөд түүний даалгавар нь гадаад мэдээллийн сангаас мэдээлэл хүлээн авах, асуулгын үр дүнг 1С дахь утгын хүснэгт хэлбэрээр буцаах явдал юм.
Одоогийн байдлаар утгуудын хүснэгтийг бүрдүүлэхийн тулд Init() функцэд параметр болгон хүлээн авсан IDispatch* pBackConnection интерфейсийг ашигладаг. Цаашилбал, би зүгээр л 1С функцуудыг ашиглан утгуудын хүснэгтийг бүрдүүлж, бөглөж, CallAsFunc (...) дахь хоёр дахь параметр рүү буцаана.
Асуудал 1С нимгэн үйлчлүүлэгчид шилжихээс эхэлсэн. Серверийн тал дээр гадаад бүрэлдэхүүн хэсэг нь үнэхээр эхлэхгүй байна. Та үүнийг үйлчлүүлэгчийн тал дээр ажиллуулж болно, гэхдээ энэ нь бүгд таяг шиг харагдаж, 1С-ийн ерөнхий "клиент-сервер" логикоос унадаг. Жишээлбэл, үйлчлүүлэгч утгын хүснэгт гэж юу болохыг ойлгодоггүй, "глобал" хувьсагчидтай холбоотой асуудлууд, сессүүд гэх мэт.
NativeAPI нь үүнтэй холбоотойгоор бүр ч тасарсан.
Хэнгэрэгтэй бүжиглэснээр би 1С серверийн дор гадны бүрэлдэхүүн хэсгийг ажиллуулж чадсан ч pBackConnection дээр Invoke руу залгах оролдлого хийх хүртэл ажил үргэлжилдэг. Сервер 8.2-ын 64 битийн хувилбар нь хугацаа дуусах хүртэл ямар нэгэн зүйл хийхийг оролддог бол 32 битийн хувилбар (VK угаасаа 32 бит) нь шууд унадаг.
1С сервер энэ горимд үйлчилдэггүй гэж би бодож байна.
Үүний дагуу асуултууд гарч ирдэг, энэ нь түр зуурынх уу эсвэл 1С-ийн логик нь энэхүү ажлын схемийг цуцлахад хүргэсэн үү? Хэрэв ийм байдлаар 1С (утгагийн хүснэгт) дотоод бүтцийг бий болгох боломжгүй бол C + дээр үүсгэхийг оролдохын тулд системийн түвшинд утгын хүснэгт гэж юу болох талаар зарчмын тайлбар бий юу? +, үүнийг бөглөж, дараа нь буцах параметр болгон 1С-ийг зүгээр л гулсуулна уу? Ядаж аль зүгт ухах чиглэлээ гаргамаар байна.

Баярлалаа.

Хариулт:

Та нэг зүйлийг бичиж, өөр зүйлийг хэлж байна.
1С орчинд өөр өөр сессүүдэд харагдах хувьсагчдыг зарлах нь одоо боломжгүй зүйл биш бөгөөд өмнө нь боломжгүй байсан. Өөр сесс бол бие махбодийн хувьд өөр үйл явц юм.
Session нь мэдээллийн баазын холболтын сесс, i.e. хэрэглэгчийн сесс. Эсвэл та өөрийн гэсэн зүйл, энэ үзэл баримтлалыг тавьдаг уу?

Нэг сессийн дотор өөр өөр газраас сесс дотор харагдах, амьдрах хувьсагчдыг сессийн модульд зарлах боломжтой байсан бөгөөд одоо ч боломжтой болсон ... үнэндээ эдгээрийн 4 нь байдаг.
- хуралдааны модуль;
- Тогтмол хэрэглээний модуль;
- Удирдлагын програмын модуль;
- Гадаад холболтын модуль.

Мэдээжийн хэрэг та нөхцөл байдлын талаар санах хэрэгтэй. Серверийн контекст нь үйлчлүүлэгчийн талд шууд хандах боломжгүй ба эсрэгээр.

Ерөнхийдөө 1С архитектур нь өгөгдөл солилцох ажлыг дараах байдлаар үргэлжлүүлнэ.
- процедур/функцын параметрүүд / өгөөжийн тусламжтайгаар;
- сессийн параметрүүдийн тусламжтайгаар (тэдгээр нь объект байж болохгүй, та үүнийг палитр дээрээс харж болно).

Маягт дээрх хүснэгт ... мөн энэ нь ямар нэгэн объектын хүснэгттэй (жишээлбэл, боловсруулалт) холбогдсон байна уу? эсвэл биш. Хэрэв тийм бол энэ нь сервер (&AtServer) дээр бас боломжтой бөгөөд тэнд засварлана....

Тиймээ, ValueTable нь үйлчлүүлэгчийн тал дээр хэт ягаан туяанд байхгүй. За, 1С тэгж шийдсэн.

Аливээ! Энд Excel-тэй ажилладаг, FSO болон бусад бүх зүйлтэй ажилладаг, гэхдээ энд ажиллахгүй байна. Алдааг олж, дүн шинжилгээ хийнэ үү....

оролдлого
...
таны үйлдэл
...
Үл хамаарах зүйл
str = Тайлбар алдаа();
оролдлогын төгсгөл;

Орчин үеийн техник хангамжийн чадавхитай бол энэ нь огт маргаан биш юм.

Зөвхөн таны хувийн бодол. Бодит байдалтай ямар ч холбоогүй. Ямар ч байдлаар биш. Би дахин давтан хэлье, 1С нь COM-той маш сайн ажилладаг. In-proc болон out-proc хоёулаа.

ВК-д байршуулж, хэрэглэх кодоо өг.

Дашрамд хэлэхэд, VK ... таны хувьд COM эсвэл Native API уу?
Хэрэв COM бол regsvr32-ээр дамжуулан... гэж бүртгүүлсэн бол битийн гүнийн асуудлыг хэрхэн "шийдвэрлэх" вэ?

Асуулт: Гадаад бүрэлдэхүүн хэсгийг суулгаж байна


Гадны бүрэлдэхүүн хэсгийг хэрхэн суулгах талаар надад хэлж өгнө үү. Дараах кодыг гүйцэтгэх үед алдаа гарна. Зохион байгуулалтаас NameDecl.dll-г олоорой

SetExternalComponent ("GeneralLayout.Layout"); Exception EndTry;
Алдаа: Plugin суулгаж чадсангүй!

Хариулт: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) нь FALSE-г буцаана,
Шинэ("AddIn.NameDecl.CNameDecl", Тодорхойгүй) = (()): Төрөл тодорхойлогдоогүй (AddIn.NameDecl.NameDecl)

Асуулт: Native dll нь 1s 8.1-д холбогдоогүй байна (fptrwin32_fz54_9_11_0_5549.dll)


Сайн уу.
1С нь fdd 1.05 (fptrwin32_fz54_9_11_0_5549.dll засвар үйлчилгээнд багтсан) atol онлайн кассын машинд зориулсан dll-г шинэчилсэн.
Надад хуучин 1С 8.1 байгаа. 8.2-оос ялгаатай нь энэ нь 8.2-тэй адил гадаад төхөөрөмжтэй ажиллахыг дэмждэггүй тул та эхлээд Windows-д dll-г бүртгүүлж, дараа нь зөвхөн 1С-тэй холбох хэрэгтэй юу?

ProgID = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent(ProgID); Драйвер = Шинэ(ProgID);

Гэсэн хэдий ч, хуучин боловсруулалтыг "технологи" ком дээр бичсэн бөгөөд шинэ уугуул. Үүний дагуу бүртгүүлэх үед regsvr32 алдаа гаргадаг.
Модуль ачаалагдсан боловч DllRegisterServer нэвтрэх цэг олдсонгүй. Мөн энэ файл нь зөв dll эсвэл OCX файл эсэхийг шалгахыг санал болгож байна.
Үүнтэй төстэй нөхцөл байдалтай хэн тулгарсан бэ, яаж гарсан бэ? Үүнтэй төстэй асуудал 7.7-д байх болно гэдгийг би ойлгож байна.
Код 8.2:

Layout = GetLayout("IntegrationComponent"); Хаяг = PlaceInTempStorage(Layout); ConnectExternalComponent(Хаяг, "IntegrationComponent", ExternalComponentType.Native); Драйвер = Шинэ("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1С 8.2:
Гадаад бүрэлдэхүүн хэсгийг холбох(<Местоположение>, <Имя>, <Тип>)
1С 8.1:
Гадаад бүрэлдэхүүн хэсгийг холбох(<Идентификатор объекта>)
Сонголтууд:
<Идентификатор объекта>(шаардлагатай)
Төрөл: мөр. Гадаад бүрэлдэхүүн хэсгийн объектын ProgID (Программын танигч). Системийн бүртгэлийн мэдээллийн сан (Бүртгэл) дэх мэдээлэлтэй тохирч байх ёстой.
Тодорхойлолт:
Гадны бүрэлдэхүүн хэсгүүдийг 1C: Enterprise-тэй холбодог.
1C: Enterprise сервер дээр байхгүй. Гадаад холболтын модульд ашиглагдаагүй.
Жич:
Гадаад бүрэлдэхүүн хэсгүүд нь 1C: Enterprise 7.7 бүрэлдэхүүн хэсгүүдтэй нийцдэг.
Жишээ:
оролдлого
ConnectExternalComponent("AddinObject.Scanner");
alert("Баркод сканнерын бүрэлдэхүүн хэсэг ачаалагдсан");
Үл хамаарах зүйл
alert("Баркод сканнерын бүрэлдэхүүн хэсэг ачаалагдаагүй");
Оролцоог дуусгах

Энэ dll-г 8.1-тэй холбох арга бий юу, үгүй ​​юу?

Баярлалаа!

Хариулт:

Би ч бас саяхан ийм асуудалтай тулгарсан. 1s-ийн дараагийн хувилбар руу хөрвүүлэх боломжгүй байсан. Энэ тохиргоо нь ажилладаг dll зүгээр л ажиллахаа больсон бөгөөд 1c алдаа гарлаа.
Асуудлыг дараах байдлаар шийдсэн.
Би хоосон өгөгдлийн сан 8.3 үүсгэсэн бөгөөд үүнд би бүрэлдэхүүн хэсгийг эхлүүлж, дараа нь 8.1-ээс COM холболтоор дамжуулан өмнө нь үүсгэсэн мэдээллийн сан руу нэвтэрч, бүрэлдэхүүн хэсгийг эхлүүлсэн. Дараа нь аль хэдийн 8.1-д би энэ бүрэлдэхүүн хэсгийн аргуудыг дуудсан.
Мэдээжийн хэрэг, энэ бол таяг, гэхдээ би өөр гарц олоогүй байна (

Кодын жишээ 8.3:
Rem драйверын экспорт;
Function ConnectionComponentsCCP() Экспорт
оролдлого

Layout = GetLayout("IntegrationComponent");
Хаяг = PlaceInTempStorage(Layout);
ConnectExternalComponent(Хаяг, "IntegrationComponent", ExternalComponentType.Native);
Драйвер = Шинэ("AddIn.IntegrationComponent.SMDrvFR1C20");
үр дүн = үнэн;

Үл хамаарах зүйл

үр дүн = худал;

оролдлогын төгсгөл;
Үр дүнг буцаах
Төгсгөлийн функцууд

Кодын жишээ 8.1

Функц CreateDriverObject(Драйвер) Экспорт

үр дүн = үнэн;

оролдлого

ConnectionString="File="""Өгөгдлийн сангийн зам""";
ComObject= Шинэ COMObject("V83.ComConnector");
Холбох = ComObject.Connect(ConnectionString);

Боловсруулж байна = Connect.Processing.ConnectingExternalComponent.Create();
ConnectionResult = Processing.ConnectingKKT Components();
Хэрэв үр дүн холбогдсон бол
Driver = Processing.Driver;
EndIf;

Үл хамаарах зүйл
Үүнийг хийж байсан эсвэл үүнтэй төстэй асуудал тулгарсан хэн бүхэн тайлбарлана уу. энгийн жишээзарчим нь өөрөө. Гадны бүрэлдэхүүн хэсгүүдийн холболтоор бүх зүйл тодорхой харагдаж байна.

// Утгын хүснэгтийг бөглөх жишээ TK.Clear(); Хүсэлт = Шинэ хүсэлт; Query.Text = "СОНГОХ | Нэршил.Холбоос ХЭРХЭН Нэршил | FROM | Directory.Nomenclature AS Nomenclature"; QueryResult = Query.Execute(); Sampling = QueryResult.Select(); While Sampling.Next() Loop Str = TK.Add(); FillPropertyValues(Pr, Sampling); EndCycle;
Кодын ямар хэсгийг ихэвчлэн хасдагийг энэ жишээгээр тайлбарлаж өгнө үү. Хүсэлт бүхий хэсгийг гаргаж авах нь логик байх болно, гэхдээ бид платформыг алгасаж, гадаад бүрэлдэхүүн хэсгээс мэдээллийн санд хэрхэн нэвтрэх вэ? Текст нь утгагүй юм. Эсвэл хүснэгтийн хэсгийн хэлбэрийг гаргаж аваарай. Энэ талаар туршлагаасаа хуваалцана уу.

Хариулт:Тэгээд "Тохиромжгүй" гэдэг нь дандаа "Муу" гэсэн утгатай байдаг юм уу? Тийм ээ, хэрэв би өөрийн хэв маягийг "1С: Байгаль дээр байдаг (уран зохиолын хэл рүү орчуулсан) скриптийн систем дээрх хамгийн муу програмчлал" гэж нэрлэвэл надад санагдаж байна. тэгээд энэ араатныг шалгахыг хүсэгчид гарцаагүй олдоно. Энэ нь сонгодог шиг харагдаж байна: "Би Пастернакийг уншаагүй, гэхдээ би түүнтэй огт санал нийлэхгүй байна!" :)

Асуулт: 1s 8.3.6 болон Win8 дээр гадаад бүрэлдэхүүн хэсгийг холбож байна


Энэ нь vk_rs232.dll ExternalComponent-ийг өөрөө бичсэн тохиргоонд холбох шаардлагатай. Regsvr32.exe-ээр бүртгүүлсэн шиг. Би "бүртгэл бүртгэгдсэн, гэхдээ галт хананд ямар нэг зүйл буруу байна" гэсэн мессеж ирсэн тул "Энэ нь харагдаж байна". Зурвасын эхний хагаст тулгуурлан би кодыг 1 секундээр бичдэг
AfterConnection = New NotificationDescription("AfterConnectionVK", ThisForm); StartExternalComponentInstallation(,"C:\Controller\vk_rs232.dll"); StartConnectingExternalComponent(AfterConnecting,"C:\Controller\vk_rs232.dll","DLL_Scales");
тэгээд би ийм алдааг олж авдаг
"Гадаад бүрэлдэхүүн хэсгийг суулгаж чадсангүй! Таны ашиглаж буй клиент програмын бүрэлдэхүүн хэсэг байхгүй байж магадгүй!".

Тэгээд одоо би ойлгохгүй байна
1. Бүрэлдэхүүн хэсэг нь бүртгэлд бүртгэгдээгүй байж магадгүй - би тэнд яаж шалгах вэ?
2. Магадгүй түүний "хувилбар" нь Win8-д ажиллахгүй байж магадгүй ч надад 32-бит байгаа.
3. Магадгүй 1s өөрөө хэтэрхий шинэ, i.e. Тиймээс энэ dll-тэй ажиллах боломжгүй байна уу?
4. Яахав улиг болсон - Би буруу юм бичиж байна.

Хариулт:Энэ бүхэн намайг дараагийн асуудал руу хөтөлсөн. VneshComp суулгасан, одоо та үүнийг холбох хэрэгтэй. Мөн энд хоёр сонголт байна.
ConnectExternalComponent("C:\Controller\vk_rs232.dll","Масштаб")
ConnectExternalComponent("GeneralLayout.Layout","Scales")

Синтакс сонголт: Нэр, байршлаар

Синтакс:

Гадаад бүрэлдэхүүн хэсгийг холбох(<Местоположение>, <Имя>, <Тип>)
Сонголтууд:

<Местоположение>(шаардлагатай)

Төрөл: мөр.
Гадаад бүрэлдэхүүн хэсгийн байршил.
Байршлыг ашиглаж болно:
ZIP архив биш файлын систем дэх гадаад бүрэлдэхүүн хэсгийн файл руу очих зам (вэб клиент дээр байхгүй);
бүтэн нэрхоёртын өгөгдөл эсвэл ZIP архивыг хадгалдаг байршил;
GetNaviLink-тэй төстэй хоёртын өгөгдөл эсвэл ZIP архив хэлбэрээр гадаад бүрэлдэхүүн хэсгийн URL хаяг.
<Имя>(шаардлагатай)

Төрөл: мөр.
Залгууртай гадаад бүрэлдэхүүн хэсгийн бэлгэдлийн нэр.
Нэр нь суулгасан хэлний нэршлийн дүрмийг дагаж мөрдөх ёстой.
<Тип>(заавал биш)

Төрөл: Гадаад бүрэлдэхүүн хэсгийн төрөл.
Холбогдох гадаад бүрэлдэхүүн хэсгийн төрөл.
Бүрэлдэхүүн хэсэг нь ZIP архивт савлагдсан бол ашиглахгүй.
Аргын хувилбарын тайлбар:

Native болон COM технологи ашиглан хийсэн бүрэлдэхүүн хэсгүүдийг холбодог.
Бүрэлдэхүүн хэсэг нь мэдээллийн сан эсвэл тохиргооны байршилд хоёртын өгөгдөл эсвэл ZIP архивт хадгалагдаж болно.
"Нимгэн клиент" болон "Вэб клиент" эхлүүлэх горимуудын хувьд бүрэлдэхүүн хэсэг нь гадаад бүрэлдэхүүн хэсгийг суулгах аргыг ашиглан өмнө нь суулгасан байх ёстой.
Синтакс сонголт: ID-аар

Синтакс:

Гадаад бүрэлдэхүүн хэсгийг холбох(<ИдентификаторОбъекта>)
Сонголтууд:

<ИдентификаторОбъекта>(шаардлагатай)

Төрөл: мөр.
MS Windows бүртгэлийн ProgID (Programmatic Identifier) ​​хэлбэрийн гадаад бүрэлдэхүүн хэсгийн объект танигч (жишээ нь: "AddIn.Scanner").
Системийн бүртгэлийн мэдээллийн сан (Бүртгэл) дэх мэдээлэлтэй тохирч байх ёстой.
Аргын хувилбарын тайлбар:

Бүрэлдэхүүн хэсэг нь COM технологийг ашиглан хэрэгжиж, MS Windows бүртгэлд бүртгэгдсэн байх ёстой.
Эдгээр бүрэлдэхүүн хэсгүүд нь 1C: Enterprise 7.7 бүрэлдэхүүн хэсгүүдтэй нийцдэг.
Анхаар! Аргын хувилбар нь сервер болон гадна холболтод ажиллахгүй.
Буцах утга:

Төрөл: Boolean.
Үнэн - холболт амжилттай болсон.
Тодорхойлолт:

Гадны бүрэлдэхүүн хэсгийг 1С: Enterprise-д холбодог.
Гадаад бүрэлдэхүүн хэсгүүдийг мэдээллийн сан эсвэл тохиргооны байршилд ZIP архив эсвэл хоёртын өгөгдөл хэлбэрээр эсвэл файлын системийн файлд хадгалах боломжтой.
Нимгэн клиент болон вэб клиент дээр ажиллахдаа бүрэлдэхүүн хэсгийг урьдчилан суулгасан байх ёстой.

Боломжтой байдал:

Нимгэн клиент, вэб клиент, сервер, гадаад холболт.
Жич:

Гадаад бүрэлдэхүүн хэсгүүдийг Native API эсвэл COM технологийг ашиглан хэрэгжүүлж болно. COM технологийг ашиглан хийсэн бүрэлдэхүүн хэсгүүд нь 1C: Enterprise 7.7 бүрэлдэхүүн хэсгүүдтэй нийцдэг.
Вэб клиент нь зөвхөн архивт хадгалагдсан мэдээллийн баазын бүрэлдэхүүн хэсгүүдтэй ажиллах боломжтой.
Нимгэн үйлчлүүлэгч нь архивт хадгалагдсан мэдээллийн сан дахь бүрэлдэхүүн хэсгүүд болон файлын системд байрлах бүрэлдэхүүн хэсгүүдтэй ажиллах боломжтой.
Зузаан үйлчлүүлэгч нь бүрэлдэхүүн хэсгүүдийн бүх хадгалах сонголттой ажиллах боломжтой. Энэ тохиолдолд уг бүрэлдэхүүн хэсэг нь InstallExternalComponent аргыг ашиглан суулгасан бол суулгасан бүрэлдэхүүн хэсгийг ашиглах бөгөөд хэрэв суулгаагүй бол уг бүрэлдэхүүн хэсэг нь холбогдох үед хүлээн авах болно.
Сервер нь бүх бүрэлдэхүүн хэсгүүдтэй ажиллах боломжтой. Бүрэлдэхүүн хэсэг нь серверийн сессэд зориулж кэшлэгдсэн байна.
Жишээ:

Хэрэв ConnectExternalComponent("AddinObject.Scanner") Дараа нь
alert("Баркод сканнерын бүрэлдэхүүн хэсэг ачаалагдсан");
Үгүй бол
alert("Баркод сканнерын бүрэлдэхүүн хэсэг ачаалагдаагүй");
EndIf;

  • заавар

Оршил

Энэ нийтлэл нь 1С: Enterprise системд гадны бүрэлдэхүүн хэсгүүд хэрхэн ажилладаг талаар санаа өгдөг.
Ажлын файлын хувилбар бүхий Windows үйлдлийн систем дээр ажилладаг 1C: Enterprise 8.2 хувилбарын системийн гадаад бүрэлдэхүүн хэсгийг боловсруулах үйл явцыг харуулах болно. Энэ сонголтыг жижиг бизнест зориулагдсан ихэнх шийдлүүдэд ашигладаг. VC нь C++ програмчлалын хэл дээр хэрэгжинэ.

"1С: Enterprise" гадаад бүрэлдэхүүн хэсгүүд

"1С: Enterprise" нь өргөтгөх боломжтой систем юм. Өргөтгөх зорилгоор функциональ байдалсистем нь гадаад бүрэлдэхүүн хэсгүүдийг (VC) ашигладаг. Хөгжүүлэгчийн үүднээс авч үзвэл VC нь шинж чанар, аргуудтай гадаад объект бөгөөд мөн 1С: Enterprise системээр боловсруулах үйл явдлуудыг үүсгэж чаддаг.
Гадны бүрэлдэхүүн хэсгүүдийг 1С: Enterprise-д суулгасан програмчлалын хэлийг ашиглан хэрэгжүүлэхэд хэцүү эсвэл бүр боломжгүй даалгавруудыг шийдвэрлэхэд ашиглаж болно. Ялангуяа энэ ангид үйлдлийн системтэй бага түвшний харилцан үйлчлэл, тухайлбал тодорхой техник хангамжтай ажиллах шаардлагатай ажлууд багтана.
1С: Enterprise систем нь гадаад бүрэлдэхүүн хэсгүүдийг бий болгох хоёр технологийг ашигладаг.
  • Native API ашиглан
  • COM технологийг ашиглан
Дээрх хоёр технологийн хоорондох хязгаарлалтыг харгалзан үзвэл ялгаа нь ач холбогдолгүй тул бид Native API ашиглан VK-г хөгжүүлэх талаар авч үзэх болно. Шаардлагатай бол хэрэгжүүлсэн бүтээн байгуулалтыг COM технологийг ашиглан VC-ийн хөгжилд ашиглахаас гадна 1С: Enterprise системд файлын горимоос бусад үйлдлийн сонголттой ашиглахад бага зэрэг өөрчлөлт оруулан ашиглаж болно.
VK бүтэц
1C: Enterprise системийн гадаад бүрэлдэхүүн хэсэг нь DLL номын сан хэлбэрээр танилцуулагдсан. Номын сангийн код нь IComponentBase үүсмэл ангийг тайлбарладаг. Үүсгэж буй ангид гадаад бүрэлдэхүүн хэсгийн функцийг хэрэгжүүлэх үүрэгтэй аргуудыг тодорхойлсон байх ёстой. Дарагдсан аргуудыг дараа нь материалыг танилцуулах явцад илүү дэлгэрэнгүй тайлбарлах болно.

Демо VK-г эхлүүлж байна

Даалгавар:
  1. ITS-ийн захиалгаар нийлүүлсэн гадаад бүрэлдэхүүн хэсгийг угсарч, 1С дахь гадаад бүрэлдэхүүн хэсгийн механизмын үндсэн чадварыг харуулах зорилготой.
  2. Демо бүрэлдэхүүн хэсгийг 1С тохиргоонд холбоно уу
  3. Зарлагдсан функцууд зөв ажиллаж байгаа эсэхийг шалгаарай
Эмхэтгэл
Демо VC нь "/VNCOMP82/example/NativeAPI" лавлах дахь ITS захиалгын диск дээр байрладаг.
Бид Microsoft Visual Studio 2008 программыг VK-ийн демо-г угсрах болно. Энэ бүтээгдэхүүний бусад хувилбарууд нь ашигласан Visual Studio төслийн форматыг дэмждэггүй.


AddInNative төслийг нээнэ үү. Төслийн тохиргоонд бид уг санг төслийг бүтээхэд шаардлагатай толгой файлуудтай холбодог. Анхдагч байдлаар, тэдгээр нь лавлах дахь ITS диск дээр байрладаг /VNCOMP82/ орно.
Бүтээлийн үр дүн нь файл юм /bind/AddInNative.dll. Энэ бол 1С тохиргоонд холбогдохын тулд эмхэтгэсэн номын сан юм.
VK-г 1С тохиргоонд холбож байна
1С хоосон тохиргоог үүсгэцгээе.
Удирдлагатай програмын модулийн кодыг доор харуулав.
DemoComp; SystemStartup Procedure() ConnectExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); DemoComp = Шинэ("AddIn.DemoVK.AddInNativeExtension"); Төгсгөлийн процедур
Хэрэв 1С тохиргоог эхлүүлэхэд алдаа гараагүй бол VK амжилттай холбогдсон байна.
Дээрх кодыг гүйцэтгэсний үр дүнд тохиргооны дэлхийн харагдах байдалд объект гарч ирнэ. DemoCompГадаад шошны кодонд тодорхойлсон шинж чанар, аргуудтай.
Суулгасан функцийг харуулах
Демо VK-ийн гүйцэтгэлийг шалгацгаая. Үүнийг хийхийн тулд зарим шинж чанарыг тохируулах, унших, зарим VK аргыг дуудах, мөн VK мессеж хүлээн авах, боловсруулахыг хичээцгээе.
ITS диск дээр өгөгдсөн баримт бичигт demo VC-ийн дараах функцуудыг зааж өгсөн болно.
  1. Бүрэлдэхүүн хэсгийн объектын төлөвийн удирдлага
    Арга: Асаах, Унтраах
    Үл хөдлөх хөрөнгө: Оруулсан
  2. Таймерын удирдлага
    Секунд тутамд бүрэлдэхүүн хэсэг нь параметр бүхий 1С: Enterprise систем рүү мессеж илгээдэг Бүрэлдэхүүн хэсэг, таймерболон системийн цагийн тоолуурын мөр.
    Арга: StartTimer, StopTimer
    Үл хөдлөх хөрөнгө: Таймер байдаг
  3. Арга ShowInStatusLine, энэ нь төлөвийн мөрөнд арга руу дамжуулсан текстийг параметр болгон харуулдаг
  4. Арга Зураг байршуулах. Заасан файлаас зургийг ачаалж, 1С: Enterprise систем рүү хоёртын өгөгдөл болгон шилжүүлдэг.
Эдгээр функцууд ажиллаж байгаа эсэхийг шалгацгаая. Үүнийг хийхийн тулд бид дараах кодыг ажиллуулна.
DemoComp; SystemStart() Процедур ConnectExternalComponent(...); DemoComp = Шинэ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable(); Мэдэгдэл(DemoComp. Идэвхжүүлсэн); DemoComp.Enable(); Мэдэгдэл(DemoComp. Идэвхжүүлсэн); DemoComp.StartTimer(); EndProcedure ProcedureExternalEventHandler(Эх сурвалж, Үйл явдал, Өгөгдөл) Тайлан(Эх сурвалж + " " + Үйл явдал + " " + Өгөгдөл); Төгсгөлийн процедур
Тохиргоог ажиллуулсны үр дүнг зураг дээр харуулав


Аргын дуудлагын үр дүнг "Мессеж" самбарт харуулдаг DemoComp.Disable()болон Demo.Comp.Enable(). Ижил самбар дээрх дараагийн мөрүүд нь VK-ээс хүлээн авсан мессежийг боловсруулах үр дүнг агуулна. Эх сурвалж, Үйл явдалболон Өгөгдөлтус тус.

Гадаад бүрэлдэхүүн хэсгийн дурын нэр

Даалгавар: Гадаад бүрэлдэхүүн хэсгийн нэрийг дур зоргоороо өөрчлөх.
Өмнөх хэсэг нь танигчийг ашигласан AddInNativeExtension, утгыг нь тайлбарлаагүй. Энэ тохиолдолд AddInNativeExtensionөргөтгөлийн нэр юм.
VC код нь аргыг тодорхойлдог RegisterExtensionAs, энэ нь 1С: Аж ахуйн нэгжийн системд нэрийг буцаадаг бөгөөд энэ нь систем дэх VC-ийг дараа нь бүртгүүлэхэд шаардлагатай. Гадаад бүрэлдэхүүн хэсгийн мөн чанарыг тодорхой хэмжээгээр илчилсэн танигчийг зааж өгөхийг зөвлөж байна.
Аргын бүрэн кодыг энд оруулав RegisterExtensionAsөргөтгөлийн нэр өөрчлөгдсөн:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; хэрвээ (хожуу) (хоё) ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); үнэн буцаана; ) худал буцаана; )
Дээрх жишээнд VK нэрийг өөрчилсөн Зарим нэр. Дараа нь VK-г холбохдоо та шинэ нэрийг зааж өгөх ёстой.
DemoComp = Шинэ("AddIn.DemoVK.SomeName");

VK шинж чанаруудын жагсаалтыг өргөжүүлэх

Даалгавар:
  1. VC шинж чанаруудын хэрэгжилтийг судлах
  2. Мөрийн төрлийн унших-бичих шинж чанарыг нэмнэ үү
  3. Сүүлчийн багцын өгөгдлийн төрлийг хадгалдаг унших/бичих стринг төрлийн шинж чанарыг нэмнэ үү. Үл хөдлөх хөрөнгийн үнэ цэнийг тохируулах үед ямар ч арга хэмжээ авдаггүй

Үүсгэсэн бүрэлдэхүүн хэсгийн шинж чанарыг тодорхойлохын тулд хөгжүүлэгч AddInNative.cpp номын сангийн кодонд дараах аргуудыг хэрэгжүүлэх шаардлагатай.
GetNProps
Энэ өргөтгөлийн шинж чанаруудын тоог буцаана, хэрэв өмч байхгүй бол 0
FindProp
Параметрүүдэд нэрийг нь дамжуулсан өмчийн дарааллын дугаарыг буцаана
GetPropName
Өмчийн нэрийг дараалал болон дамжуулсан хэлний ID-аар нь буцаана
GetPropVal
Заасан дарааллын дагуу үл хөдлөх хөрөнгийн утгыг буцаана
SetPropVal
Заасан дарааллын дагуу үл хөдлөх хөрөнгийн утгыг тохируулна
PropReadable
Заасан дараалал бүхий үл хөдлөх хөрөнгийн уншигдах тугийг буцаана
IsPropWritable
Заасан дарааллын дугаар бүхий шинж чанарын бичвэрийн тугийг буцаана


Дээрх ангийн аргуудын хэрэгжилтийг авч үзье CADdInNative.
Демо VC нь 2 шинж чанарыг тодорхойлдог: Оруулсанболон Таймер байдаг (Идэвхжүүлсэнболон IsTimerPresent).
Номын сангийн кодын дэлхийн хэмжээнд хоёр массивыг тодорхойлсон:
статик wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Идэвхжүүлсэн", L"Таймер байна");
үл хөдлөх хөрөнгийн орос, англи нэрийг хадгалдаг. Толгой файлд AddInNative.hдугаарыг тодорхойлсон:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Үргэлж хамгийн сүүлд );
ePropIsEnabledболон ePropIsTimerPresent 0 ба 1 утгатай байх нь шинж чанаруудын дарааллын тоог утга учиртай танигчаар солиход хэрэглэгддэг. 2-ын утгатай ePropLast нь шинж чанаруудын тоог авахад ашиглагддаг (GetNProps аргыг ашиглан). Эдгээр нэрсийг зөвхөн бүрэлдэхүүн хэсгийн код дотор ашигладаг бөгөөд гаднаас хандах боломжгүй.
FindProp болон GetPropName аргууд нь массиваар хайдаг g_PropNamesболон g_PropNames.
Номын сангийн модульд талбаруудын утгыг хадгалахын тулд CAddInNative анги нь бүрэлдэхүүн хэсгийн шинж чанаруудын утгыг хадгалдаг шинж чанаруудтай. Арга зүй GetPropValболон SetPropValтус тус буцаах ба эдгээр шинж чанаруудын утгыг тохируулах.
Арга зүй PropReadableболон IsPropWritableмөн буцах үнэнэсвэл худлаа, хэрэглээний логикийн дагуу өмчийн дамжуулсан дарааллаас хамааран.
Тусгай өмч нэмэхийн тулд:

  1. Массив дээр нэмэх өмчийн нэрийг нэмнэ үү g_PropNamesболон g_PropNames(файл AddInNative.cpp)
  2. Тооцоолол руу тулгуур(файл AddInNative.h) өмнө ePropLastНэмэх өмчийг өвөрмөц байдлаар тодорхойлсон нэр нэмнэ үү
  3. Үл хөдлөх хөрөнгийн утгыг хадгалах санах ойг зохион байгуулах (харгалзах утгыг хадгалах бүрэлдэхүүн хэсгийн модулийн талбаруудыг үүсгэх)
  4. Арга дээр өөрчлөлт оруулах GetPropValболон SetPropValөмнөх алхамд хуваарилагдсан санах ойтой харилцах
  5. Хэрэглээний логикийн дагуу аргуудыг өөрчлөх PropReadableболон IsPropWritable
1, 2, 5-р зүйлд тайлбар шаардлагагүй. Эдгээр алхмуудын хэрэгжилтийн талаарх дэлгэрэнгүй мэдээллийг нийтлэлийн хавсралтаас олж болно.
Туршилтын шинж чанаруудыг нэрлэе Туршилтболон Шалгах төрөлтус тус. Дараа нь 1-р зүйлийн үр дүнд бид дараах байдалтай байна.
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Enabled", L"HasTimer", L"Test", L"CheckType");
Тооцоолол тулгуурхарагдах болно:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Үргэлж хамгийн сүүлд );
Кодыг ихээхэн хялбаршуулахын тулд бид STL C++ ашиглах болно. Ялангуяа утастай ажиллахад зориулагдсан WCHAR, номын санг холбоно уу wstring.
Аргын утгыг хадгалах Туршилт, ангид тодорхойлно CADdInNativeхувийн салбарт:
мөр тест1;
1C: Enterprise болон гадаад бүрэлдэхүүн хэсгүүдийн хооронд мөрийн параметрүүдийг шилжүүлэхийн тулд 1C: Enterprise санах ойн менежерийг ашигладаг. Ингээд түүний уран бүтээлийг дэлгэрэнгүй харцгаая. Санах ойг хуваарилах, суллахын тулд функцуудыг ашиглана уу AllocMemoryболон Үнэгүй санах ой, файлд тодорхойлсон MemoryManager.h. Хэрэв 1С: Enterprise системд мөр параметрийг дамжуулах шаардлагатай бол гадаад бүрэлдэхүүн хэсэг нь функцийг дуудаж санах ойг хуваарилах ёстой. AllocMemory. Түүний прототип нь дараах байдалтай байна.
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long 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 мөрийг параметр болгон авдаг. Функцийн үр дүн нь дүүргэсэн бүтэц юм 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(); үнэн буцаана ;)
Дараа нь аргын switch мэдэгдлийн харгалзах тохиолдол хэсэг GetPropValхэлбэрийг авна:
ePropTest1 тохиолдол: wstring_to_p(test1, pvarPropVal); завсарлага;
арга SetPropVal:
тохиолдол ePropTest1: хэрэв (TV_VT(varPropVal) != VTYPE_PWSTR) худал буцаана; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); завсарлага;
Хоёрдахь шинж чанарыг хэрэгжүүлэхийн тулд бид ангийн талбарыг тодорхойлно CaddInNative
uint8_t сүүлчийн_төрөл;
Бид хамгийн сүүлд дамжуулсан утгын төрлийг хадгалах болно. Үүнийг хийхийн тулд CaddInNative::SetPropVal аргад дараах тушаалыг нэмнэ үү:
сүүлийн_төрөл = TV_VT(varPropVal);
Одоо хоёр дахь үл хөдлөх хөрөнгийн үнэ цэнийг унших хүсэлт гаргахад бид утгыг буцаана сүүлчийн_төрөл, энэ нь зориулалтын даалгаварт шаардлагатай.
Хийсэн өөрчлөлтүүдийн гүйцэтгэлийг шалгацгаая.
Үүний тулд бид толилуулж байна Гадаад төрх 1С тохиргоог харахын тулд:
DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Шинэ("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Тайлан(String(DemoComp.TypeCheck)); DemoComp.Test = "Вася"; Тайлан(String(DemoComp.Test)); DemoComp.Test = "Петя"; Тайлан(String(DemoComp.Test)); Тайлан(String(DemoComp.TypeCheck)); Төгсгөлийн процедур
Эхлүүлсний үр дүнд бид дараалсан мессежийг авдаг.
3
Вася
Петя
22

Хоёр ба гурав дахь мессеж нь өмнөх алхамд заасан шинж чанарыг уншсаны үр дүн юм. Эхний болон хоёр дахь мессежүүд нь сүүлийн өмчийн багцын төрлийн кодыг агуулна. 3 нь бүхэл тоон утгатай, 22 нь мөрийн утгатай тохирч байна. Төрөл болон тэдгээрийн кодуудын харгалзах байдлыг файлд тогтооно төрөл.h, ITS диск дээр байрладаг.

Аргын жагсаалтыг өргөжүүлэх

Даалгавар:
  1. Дараах функцээр гадаад бүрэлдэхүүн хэсгийн үйл ажиллагааг өргөжүүлнэ.
  2. Гадны бүрэлдэхүүн хэсгүүдийн аргыг хэрхэн хэрэгжүүлэх талаар сурах
  3. Арга-функц нэмэх Чиг үүрэг 1, энэ нь хоёр мөрийг ("Parameter1" ба "Parameter2") параметр болгон авдаг. Үүний үр дүнд маягтын мөрийг буцаана: "Шалгах. Параметр1, Параметр2"
  4. Хийсэн өөрчлөлтүүд ажиллаж байгаа эсэхийг шалгана уу.

Үүсгэсэн бүрэлдэхүүн хэсгийн аргыг тодорхойлохын тулд хөгжүүлэгч AddInNative номын сангийн кодонд дараах аргуудыг хэрэгжүүлэх шаардлагатай.
GetNMethods, Хайлтын арга, GetMethodName
Аргын тоог тус тус олж авах, аргын тоо, нэрийг хайх зорилготой. Үл хөдлөх хөрөнгийн харгалзах аргуудтай төстэй
GetNParams
Заасан дарааллын дугаар бүхий аргын параметрүүдийн тоог буцаана; Хэрэв энэ тоо бүхий арга байхгүй эсвэл параметргүй бол 0-ийг буцаана
GetParamDefValue
Заасан аргын заасан параметрийн өгөгдмөл утгыг буцаана
HasRetVal
Заасан буцах утга бүхий аргын тугийг буцаана: буцах утгатай аргуудын хувьд үнэн ба худлааөөрөөр
CallAsProc
худлаа, ажиллах үеийн алдаа гарч, 1C: Enterprise модулийн гүйцэтгэл зогссон. Параметрүүдийн массивын санах ойг 1С: Enterprise хуваарилж, гаргадаг.
CallAsFunc
Заасан дарааллын дагуу аргыг гүйцэтгэнэ. Хэрэв арга буцаж ирвэл худлаа, ажиллах үеийн алдаа гарч, 1C: Enterprise модулийн гүйцэтгэл зогссон. Параметрүүдийн массивын санах ойг 1С: Enterprise хуваарилдаг. Хэрэв буцах утга нь стринг эсвэл хоёртын өгөгдөлтэй байвал бүрэлдэхүүн хэсэг нь санах ойг функцээр хуваарилдаг AllocMemoryсанах ойн менежер, тэнд өгөгдөл бичиж, энэ хаягийг бүтцийн харгалзах талбарт хадгалдаг. 1С: Байгууллага энэ санах ойг дуудлагаар суллах болно Үнэгүй санах ой.
Параметрүүдийн жагсаалтыг багтаасан аргуудын бүрэн тайлбарыг ITS диск дээр нийлүүлсэн баримт бичигт дэлгэрэнгүй тайлбарласан болно.
Дээр дурдсан аргуудын хэрэгжилтийг авч үзье.
Бүрэлдэхүүн хэсгийн кодонд хоёр массив тодорхойлогддог:
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"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
болон тооллого:
enum Methods ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Үргэлж сүүлчийнх);
Тэдгээрийг функцэд ашигладаг GetNMethods, Хайлтын аргаболон GetMethodName, шинж чанаруудын тайлбартай ижил төстэй байдлаар.
Арга зүй GetNParams, GetParamDefValue, HasRetValдамжуулагчийн шилжүүлэгч нь дамжуулсан параметрүүд болон хэрэглээний логикоос хамааран шаардлагатай утгыг буцаана. Арга HasRetValКод нь зөвхөн үр дүнг буцаах аргуудын жагсаалттай. Тэдний хувьд энэ нь эргэж ирдэг үнэн. Бүх ган аргуудын хувьд буцаж ирдэг худлаа.
Арга зүй CallAsProcболон CallAsFuncшууд гүйцэтгэх аргын кодыг агуулна.
Зөвхөн функцээр дуудагдах аргыг нэмэхийн тулд гадаад бүрэлдэхүүн хэсгийн эх кодонд дараах өөрчлөлтүүдийг хийх шаардлагатай.
  1. Массивуудад аргын нэрийг нэмнэ үү g_Аргын нэрболон g_Аргын нэр(файл AddInNative.cpp)
  2. Methods enum (file AddInNative.h)
  3. Функцийн кодонд өөрчлөлт оруулна уу GetNParamsпрограмын логикийн дагуу
  4. Шаардлагатай бол аргын кодонд өөрчлөлт оруулна GetParamDefValueХэрэв та аргын параметрүүдийн анхдагч утгыг ашиглахыг хүсвэл.
  5. Функцид өөрчлөлт оруулах HasRetVal
  6. Функцуудын логикт өөрчлөлт оруулах CallAsProcэсвэл CallAsFunc, аргын шууд гүйцэтгэх кодыг тэнд байрлуулснаар
Массивуудыг авчирцгаая g_Аргын нэрболон g_Аргын нэр, түүнчлэн тооллого аргуудүзэмж рүү:
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"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage", L"Test");

Тооллох аргууд ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Үргэлж сүүлчийнх);
Функцийг засъя GetNPropsИнгэснээр "Тест" аргын параметрийн тоог буцаана:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: буцах 1; case eMethLoadPicture: буцах 1; case eMethTest: буцах 2; анхдагч: буцах 0; ) буцах 0; )
Функцид өөрчлөлт оруулъя:
bool CAddInNative::GetParamDefValue(const long lMethodNum, const long lParamDefValue, tVariant *pvarParamDefValue) (TV_VT(pvarParamDefValue)= VTYPE_EMPTY; switch(lMethodNum) (caseMethMeth. : тохиолдол / Анхдагч завсарлагаанаар параметрийн утга байхгүй; анхдагч: худал буцаана; ) худал буцаана; )
Нэмсэн шугаманд баярлалаа
eMethTest тохиолдол:
нэг буюу хэд хэдэн аргумент байхгүй тохиолдолд харгалзах параметрүүд нь хоосон утгатай байх болно ( VTYPE_EMPTY). Хэрэв танд параметрийн өгөгдмөл утга хэрэгтэй бол та үүнийг хэсэгт зааж өгөх ёстой eMethTestфункцийг солих мэдэгдэл CAddInNative::GetParamDefValue.
"Туршилт" арга нь утгыг буцаах боломжтой тул функцийн кодонд өөрчлөлт оруулах шаардлагатай HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: буцаах үнэн; анхдагч: худал буцаана; ) худал буцаана; )
Мөн аргын гүйцэтгэх кодыг функцэд нэмнэ CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethodNum ... хэрэв (!lSizeArray || !paParams) худал буцаана; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = үнэн ; завсарлага; ) буцах; )
Бүрэлдэхүүн хэсгүүдийг эмхэтгэж, тохиргооны кодыг маягт руу оруулъя:
DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Шинэ("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Сайн уу, ", "Дэлхий!"); Мэдэгдэх(нэг); Төгсгөлийн процедур
Тохиргоог эхлүүлсний дараа бид "Сайн уу, Дэлхий!" гэсэн мессежийг хүлээн авах бөгөөд энэ нь арга амжилттай ажилласныг илтгэнэ.

Цаг хэмжигч

Даалгавар:
  1. Демо VK дахь таймерын хэрэгжилтийг судлаарай
  2. Таймерын интервалыг (миллисекунд) параметрт оруулах чадварыг нэмж "StartTimer" аргыг өөрчил.
  3. Хийсэн өөрчлөлтүүд ажиллаж байгаа эсэхийг шалгана уу.

WinAPI дээр та цаг хугацаатай ажиллахын тулд мессежийг ашиглаж болно WM_TIMER. Энэ мессежийг таймер үүсгэх үед заасан хугацааны интервалаар таны програм руу илгээх болно.
Таймер үүсгэхийн тулд функцийг ашиглана уу Цаг хэмжигчийг тохируулах:
UINT SetTimer(HWND hWnd, // цонхны бариул UINT nIDevent, // таймер танигч (тоо) UINT nElapse, // саатал TIMERPROC lpTimerFunc); // функцийн заагч
Үйлдлийн систем нь мессеж илгээх болно WM_TIMERаргументад заасан интервалтай програм руу nElapse(миллисекундээр). Сүүлийн параметрт та таймер асах бүрт гүйцэтгэх функцийг зааж өгч болно. Энэ функцийн толгой хэсэг нь иймэрхүү харагдах ёстой (нэр нь юу ч байж болно):
хүчингүй болсон __stdcall TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Демо VK дахь таймерын хэрэгжилтийг авч үзье.
Бид Windows OS-ийн гэр бүлийн гадаад бүрэлдэхүүн хэсгийг боловсруулах үйл явцыг авч үзэж байгаа тул бусад үйлдлийн системд таймерыг хэрэгжүүлэх талаар авч үзэхгүй. үйлдлийн системүүд. Ялангуяа GNU/Linux OS-ийн хувьд хэрэгжилт нь функцийн синтаксийн хувьд ялгаатай байх болно. Цаг хэмжигчийг тохируулахболон TimerProc.
Энэ аргыг гүйцэтгэх кодонд дууддаг Цаг хэмжигчийг тохируулах, функцийг дамжуулдаг MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Үүсгэсэн таймерын ID-г хувьсагчид байрлуулна m_uiTimerИнгэснээр та дараа нь унтрааж болно.
Чиг үүрэг MyTimerProcдараах байдлаар:
ХҮЧИН БУЦАХ ДУУДЛАГА MyTimerProc(HWND hwnd, // таймер мессежийн цонхны бариул UINT uMsg, // WM_TIMER мессеж UINT idEvent, // таймер танигч DWORD dwTime // одоогийн системийн цаг) ( хэрэв (!pAsyncEvent) буцах; 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(хэн) , юу, wstime); wstime устгах; ) )
Функцийн мөн чанар нь аргыг дууддаг явдал юм Гадаад үйл явдал, энэ нь 1С: Enterprise систем рүү мессеж илгээдэг.
Аргын функцийг өргөжүүлэх StartTimerдараах зүйлсийг хийцгээе:
Аргын кодыг өөрчилж байна GetNParamsИнгэснээр энэ нь аргын хувьд юм eMethStartTimerбуцаасан утга 1:
тохиолдол eMethStartTimer: буцах 1;
Энд аргын код байна CallAsProcүзэмж рүү:
case eMethStartTimer: хэрэв (!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; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Шинэ("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); Төгсгөлийн процедур
Тохиргоог эхлүүлсний дараа програм 2 секундын зайтай мессеж хүлээн авах бөгөөд энэ нь таймер зөв ажиллаж байгааг илтгэнэ.

1С: Enterprise системтэй харилцах

Гадны бүрэлдэхүүн хэсэг болон 1С: Enterprise системийн хооронд харилцахын тулд файлд тайлбарласан IAddInDefBase ангийн аргууд. AddInDefBase.h. Бид хамгийн түгээмэл хэрэглэгддэг зүйлсийг жагсаав:
Алдааны мессеж үүсгэх
virtual bool ADDIN_API AddError(тэмдэглэгдээгүй богино wcode, const WCHAR_T* эх, const WCHAR_T* тайлбар, урт код)
wcode, код- алдааны кодууд (тайлбар бүхий алдааны кодын жагсаалтыг ITS диск дээрээс олж болно)
эх сурвалж- алдааны эх үүсвэр
тайлбарлах- алдааны тайлбар
1С: Enterprise систем рүү мессеж илгээх
virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wsz Эх сурвалж- мессежийн эх сурвалж
wszMessage- Мессежийн текст
wszData- дамжуулсан өгөгдөл
Мессежийг таслан зогсоох ажиллагааг HandlingExternalEvent процедурын дагуу гүйцэтгэдэг
1С: Enterprise систем дэх гадаад бүрэлдэхүүн хэсгийг бүртгэх
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- бүрэлдэхүүн хэсгийн нэр.
Эдгээр аргууд нь VK болон 1C-ийн бүрэн харилцан үйлчлэлд хангалттай. 1C: Enterprise системээс гадны бүрэлдэхүүн хэсэг болон эсрэгээр өгөгдөл хүлээн авахын тулд гадаад бүрэлдэхүүн хэсэг нь тусгай мессеж илгээдэг бөгөөд энэ нь эргээд 1С системд саад болж, шаардлагатай бол гадаад бүрэлдэхүүн хэсгийн илгээх аргуудыг дууддаг. өгөгдөл буцаах.

tVariant өгөгдлийн төрөл

Гадны бүрэлдэхүүн хэсэг болон 1C: Enterprise системийн хооронд өгөгдөл солилцохдоо tVariant өгөгдлийн төрлийг ашигладаг. Үүнийг ITS дискнээс олж болох type.h файлд тайлбарласан болно.
struct _tVariant ( _ANONYMOUS_UNION union ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint16_t ushortVal; uint32_t ulVal; uint64_t ullVal; int32_t errCode; long hRes; float fltVal; double dblVal; bool bVal; char chVal; wchar_t wchVal; ОДОО огноо; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; _ANONYMOUS_STRUCT бүтэц ( хүчингүй болсон* pInterfaceVal; IID InterfaceID; ) __struce/LinterfaceVal; IID Интерфейс ID; ) __struce* ANTRU2; __struce*LINRUCT*; __ST_TRU2; /байтын тоо ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT бүтэц ( WCHAR_T* pwstrVal; uint32_t wstrLen; //тэмдэгтийн тоо ) __VARIANT_NAME_4/*wstr*/; ) __VARIANT_NAME_1-д зориулсан нэг хэмжээст __VARIANT_NAME_1t; pvarVal TYPEVAR vt; );
Төрөл tVariantнь дараахь зүйлийг багтаасан бүтэц юм.
  • мэдээлэл хадгалахад зориулагдсан хольц (нэгдэл).
  • өгөгдлийн төрлийн танигч
Ерөнхийдөө төрлийн хувьсагчтай ажиллах tVariantдараах алгоритмын дагуу явагдана.
  1. Хувьсагчид хадгалагдаж буй өгөгдлийн төрлийг тодорхойлох
  2. Хольцын харгалзах талбарт хандах, өгөгдөлд шууд хандах
Хэрэглээний төрөл tVariant 1С: Enterprise систем болон гадаад бүрэлдэхүүн хэсгийн харилцан үйлчлэлийг ихээхэн хялбаршуулдаг

Өргөдөл

"Жишээ" лавлах нь нийтлэлийн жишээг агуулдаг
жишээнүүд/1 - демо бүрэлдэхүүнийг ажиллуул
жишээнүүд/2 - үл хөдлөх хөрөнгийн жагсаалтын өргөтгөлийн демо
жишээнүүд/3 - аргын жагсаалтын өргөтгөлийн үзүүлэн
Лавлах бүр нь VS 2008 төсөл болон урьдчилан бүтээгдсэн 1С тохиргоог агуулдаг.

Хэрэглэгчид терминалаар дамжуулан сервертэй холбогдож 1С-тэй ажиллах үед програмистууд ихэвчлэн гадны бүрэлдэхүүн хэсгүүдийг (жишээлбэл, арилжааны тоног төхөөрөмжийн драйверууд) холбоход бэрхшээлтэй байдаг.

Үүний зэрэгцээ хэрэглэгчид, жишээлбэл, нийтлэлийн зарлал дээр үзүүлсэн зургийг хардаг.

Орон нутгийн компьютерээс ажиллах үед гадны бүрэлдэхүүн хэсгүүдийг холбоход асуудал гардаггүй.

Энэ нь юутай холбоотой вэ? Учир нь хэрэглэгчид Терминал серверээр дамжуулан ажиллахдаа локал компьютер дээр ажиллаж байснаасаа бага эрхтэй байдаг.

Хэрэв та терминалын серверт админ эрх бүхий бүртгэлээр нэвтэрсэн бол үүнийг шалгахад хялбар байдаг.

Энэ ялгааны шалтгаан нь хэрэглэгч терминал дээр ердийн эрхээр ажиллаж байх үед 1С нь гадаад бүрэлдэхүүн хэсгийг бүртгэлд бүртгэж чадахгүй байгаатай холбоотой юм. энгийн хэрэглэгч системийн бүртгэлийн салбар руу бичих зөвшөөрөлгүй байдаг HKEY_CLASSES_ROOT.

Терминал дахь гадаад бүрэлдэхүүн хэсгүүдийг холбох сэдэвт нийтлэлд энэ асуудлыг шийдэх олон янзын аргыг санал болгож байна.

Жишээлбэл, эдгээр:

1. Захиргааны эрхийн дагуу 1С-г анх удаа ажиллуул.

Энэ сонголт үргэлж ажилладаггүй. Яагаад гэдгийг би доор тайлбарлах болно.

2. Терминалын жирийн хэрэглэгчдэд системийн бүртгэлийн салбар руу бичих эрхийг олгох HKEY_CLASSES_ROOT.

Хангалттай "дэвшилтэт" хэрэглэгчид үүнийг хийх ёсгүй, эс тэгвээс асуудал гарч болзошгүй.

3. Төрөл бүрийн "гаджет" ашиглах нь бүрэн эрхтэй хэрэглэгчийн нэрийн өмнөөс VK-г бүртгүүлэх.

Бас идэх ч сайн биш.

Тэгэхээр энэ байдлаас гарах хамгийн сайн арга юу вэ?

Би энэ асуудлын шийдлийг санал болгож байна. Миний бодлоор - энгийн бөгөөд үзэсгэлэнтэй, өмнө нь infostart дээр санал болгож байгаагүй.

Энэ асуудлыг судалж байхдаа би гайхсан - 1С яагаад VK-г шинэ замаар бүртгүүлэхийг оролддог вэ? Эцсийн эцэст энэ нь системд аль хэдийн бүртгэгдсэн байна.

Хамгийн гол нь ердийн 1С тохиргоонд (жишээлбэл, "Худалдааны менежмент") дэлхийн контекст аргын дараах синтаксийг ашигладаг болсон. ConnectExternalComponent() :

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

Таны харж байгаагаар VK драйвер нь "Холбогдсон тоног төхөөрөмж" лавлахын "DriverATOLScannerBarcode" байршлаас холбогдсон байна.

Дараа нь юу болох вэ?

1С нь бүрэлдэхүүн хэсгийг хэрэглэгчийн түр хавтсанд хадгалдаг, жишээлбэл "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

мөн энэ замын дагуух HKEY_CLASSES_ROOT бүртгэлийн салбарт бүртгүүлэхийг оролдоно.

Терминал дээр энгийн хэрэглэгчид энэ бүртгэлийн салбарыг өөрчлөх эрхгүй тул бүрэлдэхүүн хэсэг нь тэдэнд холбогдоогүй байна.

Одоо энэ байдлаас хэрхэн гарах талаар.

Глобал контекст арга ConnectExternalComponent() нь хэд хэдэн синтакс сонголттой. Үүнийг бид ашиглах болно.

Тиймээс, алхам алхмаар:

1. Терминал сервер дээрх regsvr32.exe хэрэгслийг ашиглан 32 битийн үйлдлийн системд зориулсан C:\WINDOWS\SYSTEM32 хавтас эсвэл хавтсанд байгаа гадаад бүрэлдэхүүн хэсгийг бүртгүүлнэ үү. 64 битийн үйлдлийн системд зориулсан C:\WINDOWS\SYSWOW64.

2. ConnectExternalComponent() аргын хоёр нэмэлт синтакс сонголтын аль нэгийг ашиглана уу:

Сонголт 1:

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

DriverObject = Шинэ("AddIn.ATOLScanner.Scanner45");

Сонголт 2:

ProgID = "AddIn.Scanner45";

Гадаад бүрэлдэхүүн хэсгийг холбох (ProgID);

DriverObject = Шинэ(ProgID);

Миний бодлоор №2 хувилбар нь илүү дээр юм.

Үүний зэрэгцээ 1С нь VC-г бүртгэлийн шинэ замаар дахин бүртгүүлэхийг оролддоггүй бөгөөд ингэснээр бүх асуудал шийдэгддэг.

За тэгээд л болоо. Ажилд нь амжилт хүсье!

Жишээлбэл, хэрэв та түүний зохиогч биш бөгөөд эх код байхгүй бол бүрэлдэхүүн хэсгийг дахин бичих боломжгүй болно. Эсвэл Native API технологиор дэмжигдсэн хамгийн энгийн төрлүүд (тоо, мөр, логик, огноо) нь ажиллахад хангалтгүй байвал.

Файлын суурьтай ажиллахад онцгой асуудал гардаггүй. Хуваарьт ажил нь ердийн хэрэглэгчийн арын процесст дуудагддаг. Тиймээс түүнд үйлчлүүлэгчийн дуудлага хийх боломжтой. Төлөвлөсөн ажил эхлэхэд серверийн мэдээллийн санд үйлчлүүлэгчийн контекст байхгүй тул дуудлага ConnectExternalComponent()боломжгүй.

Энэ тохиолдолд та клиент дээрх бүрэлдэхүүн хэсгийг дуудаж болно. Үүнийг хийхийн тулд үйлчлүүлэгч дээр шаардлагатай үйлдлүүдийг хийх сервер дээрх хуваарьт даалгавраас өөр 1С сессийг эхлүүлэхэд хангалттай. За, дараа нь гүйлтийн сессийг дуусгахаа бүү мартаарай.

Төлөвлөсөн ажилдаа бид бүтэн нэрийг татгалзахын тулд NameDeclension.dll гадаад COM бүрэлдэхүүн хэсгийг ашигладаг тайланг үүсгэж хадгалдаг гэж бодъё. Файлын суурь дээр ийм хуваарьт даалгавар зөв ажиллах боловч серверийн бүрэлдэхүүн хэсэг дээр ажиллахгүй.

Асуудлыг засахын тулд хуваарьт ажлын модульд серверийн горимд өөр сесс эхлүүлж, гадаад боловсруулалтаас үйлчлүүлэгч дээр тайлан үүсгэх дуудлагыг гүйцэтгэх процедурыг нэмье.

#If Client Дараа нь Процедурыг ExecuteFormationAndSavingReport() Export If ConnectExternalComponent("CommonLayout.NAMEDECL","Cl",ExternalComponentType.COM) Дараа нь Component = New ("AddIn.Cl.NameDeclension"); //Энэ бол тайланг үүсгэх, хадгалах код юм.ElseJoinLogRecord("RegTask", LogLogLevel.Error, "Клиент дээрх гадаад бүрэлдэхүүнийг холбож чадсангүй"); EndIf; Процедурын төгсгөл #Otherwise Procedure ExecuteFormationAndSavingReport() Export ExecuteOperationOnClient("RegularTasks.ExecuteFormationAndSavingReport()"); EndProcedure Procedure PerformOperationOnClient(ParameterToExecute) ExportUserName = ""; UserPassword = ""; PathToExternalProcessing = "c:/temp/Autostart.epf"; Ишлэл = """"; DirectoryBIN = DirectoryProgram(); PathToConfiguration = InfoBase ConnectionString(); ConfigurationPath = StrReplace(ConfigurationPath, Quote, Quote + Quote); StartString = Quote + Bin Directory + "1cv8.exe" + Quote + "ENTERPRISE" + " /IBConnectionString " + Quote + ConfigurationPath + Quote + " /N " + Quote + Хэрэглэгчийн нэр + Ишлэл + " /P " + Ишлэл + Хэрэглэгчийн нууц үг + Quote + " /Execute" + Quote + PathToExternalProcessing + Quote + " /C " + Quote + ParameterToExecute + Quote; StartApplication(StartString); EndProcedure #EndIf

Үйлчлүүлэгчийн контекст нь төлөвлөсөн ажлын модулиас шаардлагатай тайланг хэвлэхэд хүргэдэг гадаад боловсруулалтын код бөгөөд тайланг үүсгэсний дараа сессийг дуусгадаг.

Гүйцэтгэх оролдлого(StartupParameter); Exception EndTry; ShutdownSystem(Худал);

Шийдлийн тав тухтай байдал нь хуваарьт ажлуудыг тохируулахдаа ямар горимд даалгаврыг эхлүүлэх нь хамаагүй юм. Хэрэв мэдээллийн сан нь файл бол шаардлагатай процедурыг шууд эхлүүлэх болно. Хэрэв өгөгдлийн сан сервер талд байгаа бөгөөд эхлүүлэх үед үйлчлүүлэгчийн контекст байхгүй бол шинэ сесс эхлүүлж, процедур нь үйлчлүүлэгчийн контекст дээр зөв ажиллах болно.

Ердийн хэрэглээний код. Онолын хувьд энэ нь удирдаж байгаа нэгд нь яг ижил төстэй байдлаар ажиллах болно.

p.s.Мөн энэ аргыг хуваарьт ажлын байранд үйлчлүүлэгчийн аливаа процедурыг гүйцэтгэхэд ашиглаж болно.

ХОНХ

Энэ мэдээг чамаас өмнө уншсан хүмүүс бий.
Хамгийн сүүлийн үеийн нийтлэлүүдийг авахын тулд бүртгүүлнэ үү.
Имэйл
Нэр
Овог
Та "Хонх"-ыг хэрхэн уншихыг хүсч байна вэ?
Спам байхгүй