ZVONEK

Jsou tací, kteří čtou tuto zprávu před vámi.
Přihlaste se k odběru nejnovějších článků.
E-mailem
název
Příjmení
Jak by se vám líbilo číst Zvonek
Žádný spam

Otázka: Externí nativní komponenta Api v C++ pro Linux (Ubuntu x64) na 1С 8.3


Píšu VK, nemohu se připojit k 1s na ubuntu. Ani exapl z 1s není připojen. Takže otázka k tomu:

1) Snažím se připojit VK z příkladu VNCOMPS uvedeného v článku

(odkaz najdete na samém konci: "Kopírování").
Interně má projekt NativeApi soubor makefile. S ním stavím knihovnu .so na Ununtu.
Ale při "Připojení externí součásti" 1 vzlétne.
Podobně, pokud budu stavět pomocí "build.sh" (v kořenovém adresáři projektu).

V samotném makefile změním příznak z m32 na m64, protože 1c a samotný systém x64. (s parametrem m32 to stejně nezvedá)
Zde je příklad volání VK z 1C 8.3:
Připojení Hotovo = Připojte externí komponent("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Právě na toto téma existuje článek.
Ale jak vidím, všechny tyto body již byly vzaty v úvahu a opraveny v příkladu VNCOMPS.

Ale ve skutečnosti byznys v parametrech kompilace. MB 32bitová externí komponenta normálně připojuje až 32bit 1c, ale nasadil jsem na Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. A chci jí vyzvednout VK.

Má někdo nějaký nápad, jak tento problém vyřešit?
Příklad VNCOMPS by měl fungovat, ale je třeba opravit parametry sestavení nebo je nesprávná samotná platforma, na které testuji.

Odpovědět: Zajímavé je, že je možné napsat externí komponentu v Javě?

Otázka: Externí komponenta (nativní) není připojena


Zkompilovaný příklad s ITS pro 64 a 32 bitové systémy.

Připojuji se takto:
ConnectionResult = ConnectExternalComponent(CDLLPath, "Comp", ExternalComponentType.Native); Jedno PC se připojí, druhé ne. V OS je rozdíl. Kam jde spojení, tam je Win7, kde není Win10. Přitom standardní komponenty fungují na PC, kde mi komponenta nefunguje.

Testováno na různých platformách (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Jak pochopit, proč se nepřipojuje?

Odpovědět: vc_redist nezapomněl?

Otázka: 1C8 a externí součástka s typem Native


Dobré odpoledne.
Existuje konfigurace BP 3.0.50.12 a přání implementovat vážení od společnosti Scales-Soft pomocí UniServerAuto.
Vývojáři zkompilovali komponentu Native pro Windows 32 a 64 a vložili ji do archivu s maifest souborem. Existuje také příklad pro 1C, jak lze vypočítat hmotnost. V něm je pomocí rozložení s binárními daty tento archiv naznačen, jak tomu rozumím. V příkladu je vše v pořádku: součást je nainstalována, připojena, poté je navázáno spojení a je načtena hmotnost.
Jakmile se ale začnete přenášet na 1C, váha se nečte. Zdá se, že je vše jednoduše napsáno, ale nechápu, kde jsou hrábě.
Kdo bude mít trochu času - pomozte, koukněte jedním okem, možná je řešení na povrchu, ale já jdu někde na špatném místě a dělám něco špatně. Nikdy předtím jsem nepracoval s nativní technologií...

A v příloze je můj zpracovací text

Odpovědět:

Tak mám nějaké novinky...
Právě jsem se začal dívat krok za krokem, kdy to začíná selhávat. K tomu jsem vytvořil prázdnou databázi a zpracování pomocí příkazu. Analogicky s příkladem dodavatele jsem rozložení převedl do nového conf - funguje to podruhé. Tito. Poprvé ne, podruhé ano. To podnítilo myšlenku, že při jeho zpracování bude ještě nutné oddělit spojení součásti a objektu podle různých postupů.
Pak jsem to přenesl do své databáze s připojením rozložení - funguje to. Fuj, už je to dobrý.... Ale chtělo by to bez změn v konfiguraci, tak pojďme dál

Snažím se přidat rozvržení do zpracování. Jeho velikost se okamžitě zvětší z 10kb na 3mb a je zaznamenáno výrazné zpomalení - nevejde se. Začínám kopat k připojení komponenty přes dll. Tito. v podstatě to samé, kde jsi začínal. Ale je tu jedno "ALE": hledáním podle názvu dll ve složce uživatele jsem si všiml, že tato dll leží tam, kde (jak tomu rozumím) jsou přidány dll registrované v 1C:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
není tedy nutné používat úplnou cestu k dll, můžete jednoduše napsat její název:
ConnectExternalComponent("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

Zkouším... nadává na registraci, ale vrací výsledek vážení. Ukázalo se, že dll je již zaregistrován, což znamená, že jej stačí připojit. Odstraním a vše funguje.
shrnu:
1. Ve zpracování vážení v proceduře Při otevírání jsem přidal připojení externí komponenty a připojení k objektu.
2. Cestu k dll jsem nenapsal, jen jsem uvedl její název.

Teď sedím a přemýšlím, kdy se dll nainstaloval do 1C? V době instalace softwaru? Těžko... Kde se v době spouštění vývojářské konfigurace této dll nastavuje při otevírání formuláře? Nevím, ale zdá se mi to blízké... Co myslíte?
A za druhé, na novém místě, když je potřeba nainstalovat stejný terminál, co je potřeba udělat, aby vše fungovalo? Kompletně nainstalovat software, spustit konfiguraci dodavatele pro kontrolu práce a pak by (teoreticky) mělo moje zpracování fungovat? Něco trochu komplikovaného... Nebo po instalaci softwaru v mém zpracování jednou InstallExternalComponent?

Rád bych slyšel váš názor na toto...

Otázka: Externí komponenta.dll


Dobrý den všem.
Otázka.
dll komponenta, která funguje dobře v 1C 7.7
v 1s 8.1 vůbec nechce bootovat ...
Vyzkoušeno a vložit do C:\Program Files\1cv81\bin\cache1c.dll
Pokusil jsem se zaregistrovat pomocí regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Registrováno bez problémů.
Když se k němu pokusím dostat, zobrazí se chybová zpráva:

Chyba při načítání externí součásti! cache1c.dll
Postup Execute ButtonClick(Button) Pokus o načtení externí komponenty( "C:\Program Files\1cv81\bin\cache1c.dll"); Zpráva o výjimce ( "Chyba při načítání externí součásti!"+ "cache1c.dll"); Konec pokusu; Pokus // Získat komponentní objekt. // m = New ("cache1c.GTMcmd" ); m = Nový COMObject("cache1c.GTMcmd" ); Zpráva o výjimce(); Konec pokusu; EndProcedure

Odpovědět: Banální až k nemožnosti...
Mezi hovory je nutné udržovat pauzy (milisekundy)...
Postup ButtonExecuteClick(Button) Attempt // Získání objektu komponenty. m = Nový COMObject("cache1c.GTMcmd" ); Zpráva o výjimce ( "Nelze vytvořit objekt externí komponenty"); Konec pokusu; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.Pauza(100); ...... atd
Pro 1s 7,7 - to není nutné, ukazuje se, že cirkulace je rychlejší.

Otázka: Práce externí komponenty se serverem 1C ...


Dobré odpoledne,

Existuje externí komponenta napsaná v C++, jejímž úkolem je přijímat informace z externí databáze a vracet výsledek dotazu ve formě tabulky hodnot v 1C.
K vytvoření tabulky hodnot v aktuálním okamžiku se používá rozhraní IDispatch* pBackConnection, které se přijímá jako parametr ve funkci Init(). Dále jednoduše pomocí funkcí 1C vytvořím tabulku hodnot, vyplním ji a vrátím do druhého parametru v CallAsFunc (...).
Problémy začaly s přechodem na tenké klienty 1C. Na straně serveru se externí komponenta ve skutečnosti nespustí. Můžete to spustit na straně klienta, ale všechno to vypadá jako berlička a vypadává to z obecné logiky "klient-server" v 1C. Klient například nerozumí tomu, co je tabulka hodnot, problémy s „globálními“ proměnnými, relacemi atd.
NativeAPI je v tomto ohledu ještě okleštěnější.
Tanec s tamburínou vedl k tomu, že jsem byl schopen spustit externí komponent pod serverem 1C, ALE práce se děje, dokud není učiněn pokus zavolat Invoke na pBackConnection. 64bitová verze serveru 8.2 se snaží něco dělat, dokud nevypadne timeout, 32bitová verze (VK je přirozeně také 32bitová) prostě hned spadne.
Předpokládám, že server 1C tento režim provozu neslouží.
V souladu s tím vyvstávají otázky, je to dočasné, nebo je logika 1C redukována na zrušení tohoto schématu práce? Pokud není možné tímto způsobem vytvořit vnitřní struktury 1C (tabulka hodnot), existuje v zásadě popis toho, co je tabulka hodnot na úrovni systému, abychom se pokusili ji vytvořit v C + +, vyplňte jej a pak jen podsuňte 1C jako návratový parametr? Chtěl bych alespoň získat směr, kterým směrem kopat.

Děkuji.

Odpovědět:

Píšeš jednu věc a myslíš jinou.
V prostředí 1C není deklarování proměnných, které budou viditelné v různých relacích, nyní nemožné a nebylo to možné ani dříve. Jiné sezení je fyzicky odlišný proces.
Session je relace připojení k databázi, tzn. uživatelská relace. Nebo vložíte něco vlastního a tento koncept?

V rámci jedné relace bylo možné a nyní je to možné deklarovat v modulu relace proměnné, které budou v relaci žít a budou viditelné z různých míst ... ve skutečnosti jsou 4.
- Modul relace;
- Modul pravidelné aplikace;
- Modul řízené aplikace;
- Externí připojovací modul.

A samozřejmě je třeba pamatovat na kontext. Kontext serveru není přímo přístupný na straně klienta a naopak.

Obecně platí, že architektura 1C zajišťuje, že výměna dat bude pokračovat:
- pomocí parametrů/návratů procedur/funkcí;
- pomocí tzv. parametrů relace (nemohou to být objekty, skutečně to vidíte v paletě).

Ta tabulka na formuláři... a je spojena s nějakou tabulkou objektu (např. zpracování)? nebo ne. Pokud ano, pak je k dispozici také na serveru (&AtServer) a lze jej tam upravit....

A ano, ValueTable není k dispozici v UV na straně klienta. 1C se tak rozhodlo.

Pojď! Tady to funguje s Excelem, funguje to s FSO a spoustou všeho ostatního, ale tady to nefunguje. Zachyťte chybu a analyzujte....

Pokus
...
vaše činy
...
Výjimka
str = PopisError();
Konec pokusu;

S moderními hardwarovými možnostmi to není vůbec žádný argument.

Čistě váš osobní názor. Nemá nic společného s realitou. V žádném případě. Ještě jednou opakuji, 1C funguje skvěle s COM. Jak s in-proc, tak s out-proc.

Zadejte kód, který nahrajete a použijete na VK.

Mimochodem, VK... ve vašem případě je to COM nebo Native API?
Pokud COM, pak jej zaregistrujete jako... přes regsvr32... jak pak „vyřešíte“ problém s bitovou hloubkou?

Otázka: Instalace externí součásti


Prosím, řekněte mi, jak nainstalovat externí součást. Při provádění následujícího kódu je vyvolána chyba. Najděte NameDecl.dll v rozložení

Pokus o SetExternalComponent("GeneralLayout.Layout"); Výjimka EndTry ;
Chyba: Instalace pluginu se nezdařila!

Odpovědět: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) vrací FALSE ,
New("AddIn.NameDecl.CNameDecl", Undefined) = (()): Typ není definován (AddIn.NameDecl.NameDecl)

Otázka: Nativní dll není připojen k 1s 8.1 (fptrwin32_fz54_9_11_0_5549.dll)


Ahoj.
1C aktualizoval dll pro online pokladny atol pro fdd 1.05 (zahrnuto ve zpracování údržby fptrwin32_fz54_9_11_0_5549.dll).
Mám starý 1C 8.1. Na rozdíl od 8.2 nepodporuje práci s externím zařízením stejně jako 8.2, takže musíte nejprve zaregistrovat dll ve Windows a pak ji připojit pouze k 1C?

ProgID = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent(ProgID); Driver = New(ProgID);

Nicméně staré zpracování bylo napsáno v "technology" com a nové nativní. Proto při registraci regsvr32 zobrazí chybu:
Modul byl načten, ale nebyl nalezen vstupní bod DllRegisterServer. A navrhuje zkontrolovat, zda je tento soubor správným souborem dll nebo OCX.
Kdo čelil podobné situaci, jak jste se z toho dostal? Chápu, že podobný problém bude v 7.7.
Kód 8.2:

Layout = GetLayout("IntegrationComponent"); Adresa = PlaceInTempStorage(Layout); ConnectExternalComponent(Adresa, "IntegrationComponent", ExternalComponentType.Native); Driver = New("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1C 8.2:
Připojte externí komponent (<Местоположение>, <Имя>, <Тип>)
1C 8.1:
Připojte externí komponent (<Идентификатор объекта>)
Možnosti:
<Идентификатор объекта>(Požadované)
Typ: Řetězec. ProgID (Programmatic Identifier) ​​objektu externí komponenty. Musí odpovídat informacím v registrační databázi systému (Registr).
Popis:
Připojuje objekty externích komponent k 1C:Enterprise.
Není k dispozici na serveru 1C:Enterprise. Nepoužívá se v externím připojovacím modulu.
Poznámka:
Externí komponenty jsou kompatibilní s komponenty 1C:Enterprise 7.7.
Příklad:
Pokus
ConnectExternalComponent("AddinObject.Scanner");
alert("Načtena součást čtečky čárových kódů");
Výjimka
alert("Součást čtečky čárových kódů není načtena");
Ukončit pokusy

Existuje nějaký způsob, jak připojit tuto dll k 8.1 nebo ne?

Děkuji!

Odpovědět:

Tento problém jsem měl také nedávno. Nebylo možné převést na pozdější verzi 1s. dll, se kterou tato konfigurace funguje, prostě přestal fungovat a 1c vypadl s chybou.
Problém byl vyřešen následujícím způsobem:
Vytvořil jsem prázdnou databázi 8.3 ve které jsem zpracoval inicializaci komponenty a následně od 8.1 přes COM spojení jsem přistoupil k dříve vytvořené databázi a tam komponentu inicializoval. Poté, již v 8.1, jsem zavolal metody této komponenty.
Samozřejmě je to berlička, ale zatím jsem nenašel jiné východisko (

Příklad kódu 8.3:
Export ovladače Rem;
Funkce ConnectionComponentsCCP() Export
Pokus

Layout = GetLayout("IntegrationComponent");
Adresa = PlaceInTempStorage(Layout);
ConnectExternalComponent(Adresa, "IntegrationComponent", ExternalComponentType.Native);
Driver = New("AddIn.IntegrationComponent.SMDrvFR1C20");
výsledek = pravda;

Výjimka

výsledek = nepravda;

Konec pokusu;
Návratový výsledek
EndFunctions

Příklad kódu 8.1

Funkce CreateDriverObject(Driver) Export

výsledek = pravda;

Pokus

ConnectionString="File="""Cesta k databázi""";
ComObject= Nový COMObject("V83.ComConnector");
Connect = ComObject.Connect(ConnectionString);

Zpracování = Connect.Processing.ConnectingExternalComponent.Create();
ConnectionResult = Processing.ConnectingKKT Components();
Pokud se výsledek připojí, pak
Driver = Processing.Driver;
EndIf;

Výjimka
Kdo to udělal nebo měl podobné problémy, prosím o vysvětlení. jednoduchý příklad samotný princip. Zdá se, že s připojením externích komponent je vše jasné.

// Příklad naplnění tabulky hodnot TK.Clear(); Žádost = Nová žádost; Query.Text = "VYBRAT | Nomenklatura Odkaz JAK Nomenklatura | Z | Directory.Nomenclature AS Nomenclature"; QueryResult = Query.Execute(); Sampling = QueryResult.Select(); While Sampling.Next() Loop Str = TK.Add(); FillPropertyValues(Pr, Sampling); EndCycle;
Mohl byste na tomto příkladu vysvětlit, jaká část kódu je obvykle vyjmuta. Bylo by logické vyjmout část s požadavkem, ale jak pak můžeme přistupovat k databázi z externí komponenty z externí komponenty a obejít platformu? Text je bezpředmětný. Nebo vyjměte samotný útvar tabulkové části. Podělte se prosím o své zkušenosti s tímto.

Odpovědět: A že slovo „Nekompatibilní“ vždy znamená slovo „Špatné“? Ano, zdá se mi, že když svůj styl nazvu „1C: Nejhorší programování na tomto skriptovacím enginu, jaké v přírodě existuje (přeloženo do literárního jazyka)!“ a pak se určitě najdou tací, kteří se budou chtít na tuto bestii podívat. A vypadá to jako klasika: "Pasternaka jsem nečetl, ale úplně s ním nesouhlasím!" :)

Otázka: Připojení externí komponenty v 1s 8.3.6 a Win8


Je nutné připojit vk_rs232.dll ExternalComponent k vlastní konfiguraci. Jako registrovaný přes regsvr32.exe. "Zdá se", protože jsem obdržel zprávu, že "komponenta je zaregistrována, ale něco není v pořádku s firewallem." Spoléhám se na první polovinu zprávy a napíšu kód za 1 s
AfterConnection = New NotificationDescription("AfterConnectionVK",ThisForm); StartExternalComponentInstallation(,"C:\Controller\vk_rs232.dll"); StartConnectingExternalComponent(AfterConnecting,"C:\Controller\vk_rs232.dll","DLL_Scales");
a dostávám tu chybu
"Instalace externí komponenty se nezdařila! Komponenta pro klientskou aplikaci, kterou používáte, možná chybí!".

A teď tomu nerozumím
1. Možná komponenta není registrována v registru - jak to tam mohu zkontrolovat?
2. Možná její "verze" nefunguje pod Win8, ačkoliv ji mám 32bitovou.
3. Možná je 1s sám o sobě příliš nový, tzn. proto nemůže fungovat s tímto dll?
4. No, je to banální - píšu něco špatně.

Odpovědět: A to vše mě přivedlo k dalšímu problému. VneshComp nainstalován, nyní jej musíte připojit. A tady jsou obě možnosti.
ConnectExternalComponent("C:\Controller\vk_rs232.dll","Váhy")
ConnectExternalComponent("GeneralLayout.Layout","Scales")

Volba syntaxe: Podle názvu a umístění

Syntax:

Připojte externí komponent (<Местоположение>, <Имя>, <Тип>)
Možnosti:

<Местоположение>(Požadované)

Typ: Řetězec.
Umístění externí součásti.
Místo lze použít:
cesta k souboru externí komponenty v souborovém systému (není k dispozici na webovém klientovi), nikoli archiv ZIP;
celé jméno rozložení, které ukládá binární data nebo archiv ZIP;
Adresa URL externí komponenty ve formě binárních dat nebo archivu ZIP v souboru , podobně jako GetNaviLink.
<Имя>(Požadované)

Typ: Řetězec.
Symbolický název zásuvné externí součásti.
Název musí odpovídat konvencím pojmenování vestavěného jazyka.
<Тип>(volitelný)

Typ: Typ externí součásti.
Typ externího komponentu, který má být připojen.
Nepoužívá se, pokud je komponenta zabalena v archivu ZIP.
Popis varianty metody:

Propojuje komponenty vyrobené pomocí nativní a COM technologie.
Komponenta může být uložena v infobázi nebo konfiguračním uspořádání jako binární data nebo v archivu ZIP.
Pro režimy spouštění "Tenký klient" a "Webový klient" musí být komponenta dříve nainstalována pomocí metody Install External Component.
Volba syntaxe: Podle ID

Syntax:

Připojte externí komponent (<ИдентификаторОбъекта>)
Možnosti:

<ИдентификаторОбъекта>(Požadované)

Typ: Řetězec.
Externí identifikátor objektu komponenty ve formě ProgID (Programmatic Identifier) ​​registru MS Windows (například: "AddIn.Scanner").
Musí odpovídat informacím v registrační databázi systému (Registr).
Popis varianty metody:

Komponenta musí být implementována pomocí technologie COM a registrována v registru MS Windows.
Tyto komponenty jsou kompatibilní s komponenty 1C:Enterprise 7.7.
Pozornost! Varianta metody nefunguje na serveru a ve vnějším spojení.
Návratová hodnota:

Typ: Boolean.
Pravda - připojení bylo úspěšné.
Popis:

Připojuje externí komponent k 1C:Enterprise.
Externí komponenty mohou být uloženy v informační databázi nebo konfiguračních rozvrženích jako ZIP archiv nebo jako binární data nebo v souboru systému souborů.
Při práci na tenkém klientovi a webovém klientovi musí být komponenta předem nainstalována.

Dostupnost:

Tenký klient, webový klient, server, externí připojení.
Poznámka:

Externí komponenty lze implementovat pomocí technologie Native API nebo COM. Komponenty vyrobené pomocí technologie COM jsou kompatibilní s komponenty 1C:Enterprise 7.7.
Webový klient může pracovat pouze s komponentami v infobázi, které jsou zabaleny do archivu.
Tenký klient může pracovat s komponentami v infobázi, zabalenými do archivu a komponentami umístěnými v systému souborů.
Tlustý klient může pracovat se všemi možnostmi úložiště pro komponenty. V tomto případě, pokud je komponenta nainstalována pomocí metody InstallExternalComponent, použije se nainstalovaná komponenta, a pokud není nainstalována, bude komponenta přijata v okamžiku připojení.
Server umí pracovat se všemi komponentami. Komponenta je uložena do mezipaměti pro relaci serveru.
Příklad:

If ConnectExternalComponent("AddinObject.Scanner") Potom
alert("Načtena součást čtečky čárových kódů");
v opačném případě
alert("Součást čtečky čárových kódů není načtena");
EndIf;

  • tutorial

Úvod

Tento článek poskytuje představu o tom, jak fungují externí komponenty v systému 1C:Enterprise.
Bude ukázán proces vývoje externí komponenty pro systém 1C:Enterprise verze 8.2 běžící pod operačním systémem Windows se souborovou verzí práce. Tato možnost se používá ve většině řešení určených pro malé podniky. VC bude implementováno v programovacím jazyce C++.

Externí komponenty "1C: Enterprise"

"1C: Enterprise" je rozšiřitelný systém. Pro rozšíření funkčnost systém využívá externí komponenty (VC). Z pohledu vývojáře je VC externí objekt, který má vlastnosti a metody a může také generovat události pro zpracování systémem 1C:Enterprise.
Externí komponenty lze použít k řešení třídy úloh, které je obtížné nebo dokonce nemožné implementovat pomocí programovacího jazyka zabudovaného do 1C: Enterprise. Tato třída zahrnuje zejména úlohy, které vyžadují nízkoúrovňovou interakci s operačním systémem, například pro práci se specifickým hardwarem.
Systém 1C:Enterprise využívá dvě technologie pro vytváření externích komponent:
  • pomocí Native API
  • pomocí technologie COM
Vzhledem k omezením mezi dvěma výše uvedenými technologiemi je rozdíl zanedbatelný, takže budeme uvažovat o vývoji VK pomocí Native API. V případě potřeby lze implementovaný vývoj aplikovat na vývoj VC pomocí technologie COM a také s malými úpravami použít pro použití v systému 1C: Enterprise s jinými provozními možnostmi, než je souborový režim provozu.
Struktura VK
Externí komponenta systému 1C:Enterprise je prezentována jako DLL knihovna. Kód knihovny popisuje odvozenou třídu IComponentBase. Ve vytvářené třídě musí být definovány metody odpovědné za implementaci funkcí externí komponenty. Přepsané metody budou podrobněji popsány později v průběhu prezentace materiálu.

Spuštění ukázky VK

Úkol:
  1. Sestavte externí komponentu dodávanou s předplatným ITS a navrženou tak, aby demonstrovala hlavní schopnosti mechanismu externích komponent v 1C
  2. Připojte demo komponentu ke konfiguraci 1C
  3. Ujistěte se, že deklarované funkce fungují správně
Sestavení
Demo VC se nachází na disku předplatného ITS v adresáři "/VNCOMP82/example/NativeAPI".
K sestavení demo VK použijeme Microsoft Visual Studio 2008. Jiné verze tohoto produktu nepodporují použitý formát projektu Visual Studio.


Otevřete projekt AddInNative. V nastavení projektu propojíme adresář s hlavičkovými soubory nezbytnými pro sestavení projektu. Standardně jsou umístěny na disku ITS v adresáři /VNCOMP82/include.
Výsledkem sestavení je soubor /bind/AddInNative.dll. Toto je zkompilovaná knihovna pro připojení ke konfiguraci 1C.
Připojení VK ke konfiguraci 1C
Vytvoříme prázdnou konfiguraci 1C.
Následuje kód pro modul spravované aplikace.
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); DemoComp = New("AddIn.DemoVK.AddInNativeExtension"); EndProcedure
Pokud při spuštění konfigurace 1C nebyla hlášena žádná chyba, pak byl VK úspěšně připojen.
V důsledku provedení výše uvedeného kódu se v globální viditelnosti konfigurace objeví objekt DemoComp An, která má vlastnosti a metody, které jsou definovány v externím bean kódu.
Ukázka vestavěných funkcí
Pojďme zkontrolovat výkon demo VK. Chcete-li to provést, zkusme nastavit a přečíst některé vlastnosti, zavolat některé metody VK a také přijmout a zpracovat zprávu VK.
Dokumentace dodaná na disku ITS uvádí následující funkce demo VC:
  1. Správa stavu objektů komponent
    Metody: Zapnout, Vypnout
    Vlastnosti: Zahrnuta
  2. Ovládání časovače
    Každou sekundu komponenta odešle zprávu do systému 1C: Enterprise s parametry Komponent, časovač a řetězec čítače systémových hodin.
    Metody: StartTimer, StopTimer
    Vlastnosti: K dispozici je časovač
  3. Metoda ShowInStatusLine, který ve stavovém řádku zobrazí text předaný metodě jako parametry
  4. Metoda Nahrát obrázek. Načte obrázek ze zadaného souboru a přenese jej do systému 1C:Enterprise jako binární data.
Přesvědčte se, že tyto funkce fungují. Za tímto účelem spustíme následující kód:
var DemoComp; Postup SystemStart() ConnectExternalComponent(...); DemoComp = New("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable(); Oznámit(DemoComp. povoleno); DemoComp.Enable(); Oznámit(DemoComp. povoleno); DemoComp.StartTimer(); EndProcedure ProcedureExternalEventHandler(Zdroj, Událost, Data) Zpráva (Zdroj + " " + Událost + " " + Data); EndProcedure
Výsledek spuštění konfigurace je zobrazen na obrázku


Výsledky volání metod se zobrazují v panelu "Zprávy". DemoComp.Disable() a Demo.Comp.Enable(). Následující řádky na stejném panelu obsahují výsledky zpracování zpráv přijatých z VK - Zdroj, událost a Data respektive.

Libovolný název externí komponenty

Úkol: Změňte název externí komponenty na libovolný.
V předchozí části byl použit identifikátor AddInNativeExtension, jehož význam nebyl vysvětlen. V tomto případě AddInNativeExtension je název rozšíření.
Kód VC definuje metodu RegisterExtensionAs, který vrací název do systému 1C: Enterprise, který je nezbytný pro následnou registraci VC do systému. Doporučuje se specifikovat identifikátor, který do určité míry odhaluje podstatu vnější komponenty.
Zde je úplný kód metody RegisterExtensionAs se změněným názvem rozšíření:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"NějakéNazev"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; if (m_iMemory>AllocMemory)- if(m_iMemory)- ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); return true; ) return false; )
Ve výše uvedeném příkladu byl název VK změněn na Nějaké jméno. Poté při připojování VK musíte zadat nový název:
DemoComp = New("AddIn.DemoVK.SomeName");

Rozšíření seznamu vlastností VK

Úkol:
  1. Prostudujte si implementaci vlastností VC
  2. Přidejte vlastnost čtení a zápisu typu řetězce
  3. Přidejte vlastnost typu řetězce pro čtení/zápis, která ukládá datový typ poslední sady vlastnosti. Při nastavování hodnoty vlastnosti se neprovádí žádná akce

K definování vlastností vytvářené komponenty musí vývojář implementovat do kódu knihovny AddInNative.cpp následující metody:
GetNProps
Vrátí počet vlastností pro toto rozšíření, 0, pokud nejsou žádné vlastnosti
FindProp
Vrátí pořadové číslo vlastnosti, jejíž název je předán v parametrech
GetPropName
Vrátí název vlastnosti podle pořadového čísla a podle předávaného ID jazyka
GetPropVal
Vrátí hodnotu vlastnosti se zadaným pořadovým číslem
SetPropVal
Nastaví hodnotu vlastnosti se zadanou pořadovou číslicí
IsPropReadable
Vrátí příznak čitelnosti vlastnosti se zadaným pořadovým číslem
IsPropWritable
Vrátí příznak zapisovatelnosti vlastnosti se zadaným pořadovým číslem


Zvažte implementaci výše uvedených metod třídy CADdInNative.
Demo VC definuje 2 vlastnosti: Zahrnuta a K dispozici je časovač (Je povoleno a IsTimerPresent).
V globálním rozsahu kódu knihovny jsou definována dvě pole:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Povoleno", L"Existuje časovač");
které ukládají ruské a anglické názvy vlastností. V záhlaví souboru AddInNative.h výčet je definován:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Vždy poslední );
ePropIsEnabled a ePropIsTimerPresent, respektive s hodnotami 0 a 1, se používají k nahrazení pořadových čísel vlastností smysluplnými identifikátory. ePropLast, který má hodnotu 2, se používá k získání počtu vlastností (pomocí metody GetNProps). Tyto názvy se používají pouze uvnitř kódu komponenty a nejsou přístupné zvenčí.
Metody FindProp a GetPropName prohledávají pole g_PropNames a g_PropNames.
Pro uložení hodnoty polí v modulu knihovny má třída CADdInNative vlastnosti, které ukládají hodnotu vlastností komponenty. Metody GetPropVal a SetPropVal respektive vrátit a nastavit hodnotu těchto vlastností.
Metody IsPropReadable a IsPropWritable a zpět skutečný nebo Nepravdivé, v závislosti na předané ordináli vlastnosti podle aplikační logiky.
Postup přidání vlastní vlastnosti:

  1. Přidejte název vlastnosti, která se má přidat do polí g_PropNames a g_PropNames(soubor AddInNative.cpp)
  2. K výčtu rekvizity(soubor AddInNative.h) před ePropLast přidejte název, který jednoznačně identifikuje vlastnost, která má být přidána
  3. Uspořádejte paměť pro ukládání hodnot vlastností (vytvořte pole modulu komponent, která ukládají odpovídající hodnoty)
  4. Proveďte změny metod GetPropVal a SetPropVal pro interakci s pamětí přidělenou v předchozím kroku
  5. V souladu s aplikační logikou proveďte změny metod IsPropReadable a IsPropWritable
Položky 1, 2, 5 nepotřebují vysvětlení. Podrobnosti o realizaci těchto kroků naleznete v příloze článku.
Vyjmenujme vlastnosti testu Test a Kontrola typu respektive. Pak v důsledku odstavce 1 máme:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Povoleno", L"HasTimer", L"Test", L"CheckType");
Výčet rekvizity bude vypadat takto:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Vždy poslední );
Pro výrazné zjednodušení kódu použijeme STL C++. Zejména pro práci se strunami WCHAR, připojte knihovnu wstring.
Chcete-li uložit hodnotu metody Test, definovat ve třídě CADdInNative v rozsahu soukromé oblasti:
test řetězce1;
K přenosu řetězcových parametrů mezi 1C:Enterprise a externí komponentou se používá správce paměti 1C:Enterprise. Pojďme se na jeho práci podívat blíže. Chcete-li přidělit a uvolnit paměť, použijte funkce AllocMemory a Volná paměť, definovaný v souboru MemoryManager.h. Pokud je nutné předat řetězcový parametr do systému 1C: Enterprise, externí komponenta mu musí přidělit paměť voláním funkce AllocMemory. Jeho prototyp vypadá takto:
virtuální bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
kde pPaměť- adresa ukazatele, do kterého bude umístěna adresa přidělené paměti,
ulCountByte- velikost alokované oblasti paměti.
Příklad alokace paměti pro řetězec:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iAktualni velikost = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Pro usnadnění práce s datovými typy řetězců popíšeme funkci wstring_to_p. Jako parametr bere řetězec wstring. Výsledkem funkce je vyplněná struktura tVarianta. Kód funkce:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* hodnota) ( 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(); vrátit true ;)
Potom odpovídající případová část příkazu switch metody GetPropVal bude mít podobu:
case ePropTest1: wstring_to_p(test1, pvarPropVal); přestávka;
metoda SetPropVal:
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) return false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); přestávka;
Pro implementaci druhé vlastnosti definujeme pole třídy CaddInNative
uint8_t poslední_typ;
do kterého budeme ukládat typ poslední předané hodnoty. Chcete-li to provést, přidejte do metody CaddInNative::SetPropVal následující příkaz:
poslední_typ = TV_VT(varPropVal);
Nyní při požadavku na přečtení hodnoty druhé vlastnosti vrátíme hodnotu poslední_typ, kterou určený úkol vyžaduje.
Pojďme zkontrolovat výkon provedených změn.
K tomu uvádíme vzhled konfigurace 1C k pohledu:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Report(String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Report(String(DemoComp.Test)); DemoComp.Test = "Petya"; Report(String(DemoComp.Test)); Report(String(DemoComp.TypeCheck)); EndProcedure
V důsledku spuštění dostaneme sekvenci zpráv:
3
Vasya
Péťa
22

Druhá a třetí zpráva jsou výsledkem čtení sady vlastností v předchozím kroku. První a druhá zpráva obsahují typový kód poslední sady vlastností. 3 odpovídá celočíselné hodnotě, 22 - řetězcové hodnotě. Shoda typů a jejich kódů je založena v souboru typy.h, který se nachází na disku ITS.

Rozšíření seznamu metod

Úkol:
  1. Rozšiřte funkčnost externí součásti o následující funkce:
  2. Naučte se implementovat metody externích komponent
  3. Přidat metodu-funkci Funkce1, který má jako parametr dva řetězce („Parametr1“ a „Parametr2“). V důsledku toho je vrácen řetězec formuláře: „Check. Parametr1, Parametr2"
  4. Ověřte, že provedené změny fungují.

K definování metod vytvářené komponenty musí vývojář implementovat do kódu knihovny AddInNative následující metody:
GetNMethods, FindMethod, GetMethodName
Určeno k získání, respektive počtu metod, vyhledání čísla a názvu metody. Podobné jako odpovídající metody pro vlastnosti
GetNParams
Vrátí počet parametrů metody se zadaným pořadovým číslem; pokud neexistuje žádná metoda s tímto číslem nebo nemá žádné parametry, vrátí 0
GetParamDefValue
Vrátí výchozí hodnotu zadaného parametru zadané metody
HasRetVal
Vrátí příznak, který má metoda se zadanou návratovou hodnotou řadovou: true pro metody s návratovou hodnotou a Nepravdivé v opačném případě
CallAsProc
Nepravdivé, dojde k chybě běhu a provádění modulu 1C: Enterprise se zastaví. Paměť pro pole parametrů přiděluje a uvolňuje 1C: Enterprise.
CallAsFunc
Provede metodu se zadaným pořadovým číslem. Pokud se metoda vrátí Nepravdivé, dojde k chybě běhu a provádění modulu 1C: Enterprise se zastaví. Paměť pro pole parametrů přiděluje 1C: Enterprise. Pokud je návratová hodnota typu string nebo binární data, komponenta alokuje paměť funkci AllocMemory správce paměti, zapíše tam data a uloží tuto adresu do odpovídajícího pole struktury. 1С: Podnik uvolní tuto paměť zavoláním Volná paměť.
Kompletní popis metod včetně seznamu parametrů je podrobně popsán v dokumentaci dodávané na disku ITS.
Zvažte implementaci výše popsaných metod.
V kódu komponenty jsou definována dvě pole:
static wchar_t *g_MethodNames = (L"Povolit", L"Zakázat", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Povolit", L"Zakázat", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
a výčet:
enum metody ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Vždy poslední);
Používají se ve funkcích GetNMethods, FindMethod a GetMethodName, analogicky s popisem vlastností.
Metody GetNParams, GetParamDefValue, HasRetVal implementovat přepínač v závislosti na předaných parametrech a aplikační logice vrátí požadovanou hodnotu. Metoda HasRetVal ve svém kódu má seznam pouze metod, které mohou vrátit výsledek. Pro ně se to vrací skutečný. U všech ocelových metod se vrací Nepravdivé.
Metody CallAsProc a CallAsFunc obsahovat přímo spustitelný kód metody.
Chcete-li přidat metodu, kterou lze volat pouze jako funkci, musíte ve zdrojovém kódu externí komponenty provést následující změny:
  1. Přidejte název metody do polí g_MethodNames a g_MethodNames(soubor AddInNative.cpp)
  2. Přidejte smysluplný identifikátor metody do výčtu metod (soubor AddInNative.h)
  3. Proveďte změny kódu funkce GetNParams podle logiky programu
  4. V případě potřeby proveďte změny v kódu metody GetParamDefValue pokud chcete použít výchozí hodnoty parametrů metody.
  5. Proveďte změny funkce HasRetVal
  6. Proveďte změny v logice funkcí CallAsProc nebo CallAsFunc umístěním přímo spustitelného kódu metody tam
Přineseme pole g_MethodNames a g_MethodNames, stejně jako výčet metody k pohledu:
static wchar_t *g_MethodNames = (L"Povolit", L"Zakázat", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Povolit", L"Zakázat", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage", L"Test");

Enum Methods ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Vždy poslední );
Pojďme upravit funkci GetNProps takže vrátí počet parametrů metody "Test":
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; )
Provedeme změny ve funkci:
Bool Caddinnative :: GetParamdefValue (Const Long Lmethodnum, Const Long Lparamnum, TVARIANT *PVARPARAMDEFVALUE) (TV_VT (PvarParamdefvalue) = VTYPE_ETTYS: CASE EMETHOPTIMER: Případ: EMETHOPTIMER: EMETHOPTIMER: : case / Ve výchozím nastavení nejsou žádné hodnoty parametrů; výchozí: return false; ) return false; )
Díky přidané lince
pouzdro eMethTest:
v případě nepřítomnosti jednoho nebo více argumentů budou mít odpovídající parametry prázdnou hodnotu ( VTYPE_EMPTY). Pokud potřebujete výchozí hodnotu pro parametr, musíte ji zadat v části eMethTest příkaz přepínače funkcí CAddInNative::GetParamDefValue.
Protože metoda "Test" může vrátit hodnotu, musíte provést změny v kódu funkce HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) return false; )
A přidejte do funkce spustitelný kód metody CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) (Caseth MethPicest:MethLoad; if (!lSizeArray || !paParams) vrátí hodnotu false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = true ; přerušit; ) vrátit zpět; )
Pojďme zkompilovat komponentu a uvést konfigurační kód do formuláře:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Ahoj, ", "Svět!"); Upozornit(za); EndProcedure
Po spuštění konfigurace obdržíme zprávu: „Hello, World!“, což znamená, že metoda úspěšně fungovala.

Časovač

Úkol:
  1. Prostudujte si implementaci časovače v demo VK
  2. Upravte metodu "StartTimer" přidáním možnosti předat v parametrech interval časovače (v milisekundách)
  3. Ověřte, že provedené změny fungují.

Ve WinAPI můžete pro práci s časem použít zprávu WM_TIMER. Tato zpráva bude odeslána do vašeho programu v časovém intervalu, který zadáte při vytváření časovače.
Chcete-li vytvořit časovač, použijte funkci SetTimer:
UINT SetTimer(HWND hWnd, // popisovač okna UINT nIDevent, // ID časovače (číslo) UINT nElapse, // zpoždění TIMERPROC lpTimerFunc); // ukazatel funkce
Operační systém odešle zprávu WM_TIMER do programu s intervalem uvedeným v argumentu nElapse(v milisekundách). V posledním parametru můžete určit funkci, která se provede při každém spuštění časovače. Záhlaví této funkce by mělo vypadat takto (název může být jakýkoli):
void __stdcall TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Zvažte implementaci časovače v demo VK.
Vzhledem k tomu, že uvažujeme o procesu vývoje externí komponenty pro rodinu OS Windows, nebudeme uvažovat o implementaci časovače v jiných operační systémy. Zejména u OS GNU/Linux se bude implementace lišit v syntaxi funkce SetTimer a TimerProc.
Metoda je volána ve spustitelném kódu SetTimer, kterému je funkce předána MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
ID vytvořeného časovače je umístěno v proměnné m_uiTimer abyste jej mohli později vypnout.
Funkce MyTimerProc jak následuje:
VOID CALLBACK MyTimerProc(HWND hwnd, // popisovač okna pro zprávy časovače UINT uMsg, // zpráva WM_TIMER UINT idEvent, // identifikátor časovače DWORD dwTime // aktuální systémový čas) ( if (!pAsyncEvent) return; wchar_t *who = L "ComponentNative", *what = L"Timer"; wchar_t *wstime = nový wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(who , what, wstime); smazat wstime; ) )
Podstatou funkce je volání metody ExternalEvent, která odešle zprávu do systému 1C: Enterprise.
Pro rozšíření funkčnosti metody StartTimer udělejme následující:
Úprava kódu metody GetNParams aby to bylo pro metodu eMethStartTimer vrácená hodnota 1:
case eMethStartTimer: návrat 1;
Zde je kód metody CallAsProc k pohledu:
case eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
Nyní zkontrolujeme funkčnost. Za tímto účelem v modulu spravované aplikace konfigurace napíšeme kód:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = New("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); EndProcedure
Po spuštění konfigurace bude program přijímat zprávy s intervalem 2 sekund, které indikují správnou činnost časovače.

Interakce se systémem 1C: Enterprise

Pro interakci mezi externí komponentou a systémem 1C:Enterprise, metody třídy IAddInDefBase popsané v souboru AddInDefBase.h. Uvádíme nejčastěji používané:
Generování chybové zprávy
virtuální bool ADDIN_API AddError(nepodepsaný krátký kód wcode, zdroj const WCHAR_T*, popis const WCHAR_T*, dlouhý kód)
wcode, kód- chybové kódy (seznam chybových kódů s popisem naleznete na ITS disku)
zdroj- zdroj chyby
popis- popis chyby
Odeslání zprávy do systému 1C: Enterprise
virtuální bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszSource- zdroj zprávy
wszMessage- Text zprávy
wszData- přenášená data
Zachycení zprávy se provádí procedurou HandlingExternalEvent
Registrace externí komponenty v systému 1C:Enterprise
virtuální bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- název součásti.
Tyto metody jsou dostatečné pro plnou interakci VK a 1C. Pro příjem dat externí komponentou ze systému 1C:Enterprise a naopak odešle externí komponent speciální zprávu, která je následně zachycena systémem 1C a v případě potřeby zavolá metody externí komponenty k odeslání. zpětná data.

Datový typ tVariant

Při výměně dat mezi externí komponentou a systémem 1C:Enterprise se používá datový typ tVariant. Je to popsáno v souboru types.h, který najdete na disku ITS:
Struct _tvariant (_anonymous_union Union (int8_t i8val; int16_t shortval; int32_t lval; intval; unsigned int uintval; int64_t llval; uintval; uintval; flong; uintval; flong; erml; flong; flong; flong; uintval; flong; uintval; flong; uintval; uintval; uintval; uintval; uintval; uintval; uintval; uintval; uintval; uintval; uintval; bVal; char chVal; wchar_t wchVal; DATE datum; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; _ANONYMOUS_STRUCT struct ( void* pInterfaceVal; IID InterfaceID; ) __VARIANT_*STRUCTNY/2US;*char /počet bajtů ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct ( WCHAR_T* pwstrVal; uint32_t wstrLen; //počet symbolů ) __VARIANT_NAME_4/*wstr*/; ) __VARIANT /int_2_mensions pole pro jednorozměrné pole; v pvarVal TYPEVAR vt; );
Typ tVarianta je struktura, která zahrnuje:
  • směs (spojení) určená přímo pro ukládání dat
  • identifikátor datového typu
Obecně práce s proměnnými typu tVarianta probíhá podle následujícího algoritmu:
  1. Určení typu dat aktuálně uložených v proměnné
  2. Přístup do odpovídajícího pole směsi pro přímý přístup k údajům
Použití typu tVarianta výrazně zjednodušuje interakci systému 1C: Enterprise a externí komponenty

aplikace

Adresář "examples" obsahuje příklady pro článek
example/1 - spusťte komponentu demo
example/2 - demo rozšíření seznamu vlastností
příklady/3 - ukázka rozšíření seznamu metod
Každý adresář obsahuje projekt VS 2008 a předem sestavenou konfiguraci 1C.

Programátoři mají často problémy s připojením externích komponent (například ovladačů komerčních zařízení), když uživatelé pracují s 1C připojením k serveru přes terminál.

Uživatelé přitom vidí například obrázek prezentovaný v oznámení článku.

Zatímco při práci z lokálních počítačů nejsou problémy s připojením externích komponent.

S čím to souvisí? Důvodem je, že když uživatelé pracují prostřednictvím terminálového serveru, mají méně práv, než když pracují na místním počítači.

To lze snadno ověřit, pokud se k terminálovému serveru přihlásíte pod účtem s právy správce.

Důvodem tohoto rozdílu je, že 1C nemůže zaregistrovat externí komponentu do registru, když uživatel pracuje v terminálu s normálními právy, protože běžný uživatel nemá oprávnění k zápisu do větve systémového registru HKEY_CLASSES_ROOT.

V publikacích na téma připojování externích komponent v terminálu jsou nabízeny různé způsoby řešení tohoto problému.

Například tyto:

1. Spusťte 1C poprvé s právy správce.

Tato možnost nefunguje vždy. Níže vysvětlím proč.

2. Dejte běžným uživatelům terminálu právo zapisovat do větve systémového registru HKEY_CLASSES_ROOT.

Nedostatečně "pokročilí" uživatelé by to neměli dělat, jinak mohou nastat problémy.

3. Pomocí různých "gadgetů" zaregistrujte VK jménem uživatele s plnými právy.

Není dobré ani jíst.

Jaký je tedy nejlepší způsob, jak se z této situace dostat?

Nabízím řešení tohoto problému. Podle mě - jednoduché a krásné, dříve na infostartu nenabízené.

Při zkoumání tohoto problému mě napadlo - proč se 1C dokonce pokouší zaregistrovat VK po nové cestě? Ostatně už je v systému zaregistrován.

Ukázalo se, že v typických konfiguracích 1C (například „Trade Management“) se používá následující syntaxe metody globálního kontextu ConnectExternalComponent() :

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

Jak vidíte, ovladač VK je připojen z rozložení "DriverATOLScannerBarcode" adresáře "Connected Equipment".

Co se stane potom?

1C uloží komponentu do dočasné složky uživatele, například "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

a pokusí se jej zaregistrovat ve větvi registru HKEY_CLASSES_ROOT podél této cesty.

Na terminálu běžní uživatelé nemají práva na změnu této větve registru, komponenta se jim tedy nepřipojuje.

Nyní o tom, jak se z této situace dostat.

Metoda globálního kontextu ConnectExternalComponent() má několik možností syntaxe. To je to, co budeme používat.

Takže krok za krokem:

1. Zaregistrujte externí komponent pomocí nástroje regsvr32.exe na terminálovém serveru ve složce C:\WINDOWS\SYSTEM32 pro 32bitový operační systém nebo ve složce C:\WINDOWS\SYSWOW64 pro 64bitový operační systém.

2. Pro metodu ConnectExternalComponent() použijte jednu ze dvou dalších voleb syntaxe:

Možnost 1:

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

DriverObject = New("AddIn.ATOLScanner.Scanner45");

Možnost 2:

ProgID = "AddIn.Scanner45";

Connect External Component (ProgID);

DriverObject = New(ProgID);

Podle mého názoru je výhodnější varianta #2.

Současně se 1C nepokouší znovu zaregistrovat VC po nové cestě v registru, a tím jsou všechny problémy vyřešeny.

No, to je vše. Hodně štěstí v práci!

Například nebude možné přepsat komponentu, pokud nejste jejím autorem a jednoduše neexistují žádné zdrojové kódy. Nebo pokud pro jeho fungování nestačí nejjednodušší typy podporované technologií Native API (číslo, řetězec, boolean, datum).

Při práci s podložkou nejsou žádné zvláštní problémy. Naplánovaná úloha je volána na pozadí běžného uživatele. Proto jsou mu k dispozici klientské hovory. Při spuštění naplánované úlohy není v databázi serveru žádný klientský kontext, tedy volání ConnectExternalComponent() není dostupný.

V tomto případě můžete volat komponentu na klientovi. K tomu stačí spustit další relaci 1C z naplánované úlohy na serveru, ve které se na klientovi provedou potřebné akce. No, nezapomeňte běhání ukončit později.

Řekněme, že v naší naplánované úloze vygenerujeme a uložíme zprávu, která používá externí komponentu COM NameDeclension.dll k odmítnutí celého jména. Na základně souborů bude taková naplánovaná úloha fungovat správně, ale nebude fungovat na serverové součásti.

Chcete-li problém vyřešit, přidejte do modulu naplánované úlohy proceduru, která spustí další relaci v režimu serveru a v ní provede volání generování sestav na klientovi z externího zpracování.

#If Client Then Procedure ExecuteFormationAndSavingReport() Export If ConnectExternalComponent("CommonLayout.NAMEDECL","Cl",ExternalComponentType.COM) Then Component = New ("AddIn.Cl.NameDeclension"); //Zde je kód pro generování a uložení sestavy ElseJoinLogRecord("RegTask", LogLogLevel.Error, "Nepodařilo se připojit externí komponentu na klientovi"); EndIf; Konec procedury #Otherwise Procedure ExecuteFormationAndSavingReport() Export ExecuteOperationOnClient("RegularTasks.ExecuteFormationAndSavingReport()"); EndProcedure Procedure PerformOperationOnClient(ParameterToExecute) ExportUserName = ""; UserPassword = ""; PathToExternalProcessing = "c:/temp/Autostart.epf"; Citace = """"; 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 + Username + Quote + " /P " + Quote + UserPassword + Quote + " /Execute " + Quote + PathToExternalProcessing + Quote + " /C " + Quote + ParameterToExecute + Quote; StartApplication(StartString); EndProcedure #EndIf

Kód externího zpracování, který jednoduše způsobí, že kontext klienta vytiskne požadovanou sestavu z modulu naplánovaných úloh a ukončí relaci po vygenerování sestavy.

Pokus o provedení(StartupParameter); Výjimka EndTry; ShutdownSystem(False);

Pohodlí řešení spočívá v tom, že při nastavování naplánovaných úloh je jedno, v jakém režimu bude úloha spuštěna. Pokud je databáze souborová, okamžitě se spustí potřebný postup. Pokud je databáze na straně serveru a při spuštění neexistuje žádný kontext klienta, bude inicializována nová relace a postup bude v kontextu klienta fungovat správně.

Kód pro typickou aplikaci. Zcela podobně to bude teoreticky fungovat i v řízeném.

p.s. Tento přístup lze také použít ke spuštění libovolných klientských procedur v naplánovaných úlohách.

ZVONEK

Jsou tací, kteří čtou tuto zprávu před vámi.
Přihlaste se k odběru nejnovějších článků.
E-mailem
název
Příjmení
Jak by se vám líbilo číst Zvonek
Žádný spam