1s připojení přes com. V8: Připojení COM

Tisknout (Ctrl+P)

Jednou z možností výměny dat mezi databázemi 1C je výměna přes COM spojení. Pomocí připojení COM se můžete připojit z jedné databáze 1C do druhé a číst nebo zapisovat data. Tuto metodu můžete použít jak ve variantách databází klient-server, tak v databáze souborů. Tento článek pojednává o tomto druhu připojení na platformě 8.3

com připojení

Pro aplikaci 1C můžete vytvořit dva typy objektů COM. Jsou to jen spojení V83.Aplikace a com spojení Konektor V83.COM . V případě V83.Aplikace je spuštěna téměř plnohodnotná kopie aplikace 1C. V případě použití Konektor V83.COM je spuštěna malá část serveru. Rychlost práce je v tomto případě vyšší, ale některé funkce nemusí být dostupné. Zejména práce s formuláři a s běžnými moduly, u kterých není nastavena vlastnost práce s externími připojeními. Měli byste hlavně používat Konektor V83.COM a to pouze v případě nedostatečné funkčnosti V83.Aplikace. Rozdíl v rychlosti může být patrný zejména na velkých databázích. Pro platformu se používá 8.2 V82.Application nebo V82.COMConnector

Vytvořte připojení OLE

Connection = New COMObject(“V83.Application” ) ;

Navažte spojení COM

Připojení = Nový COMObject(“V83.COMConnector” ) ;

Spojovací řetězec

//Pro volbu klient-server
StringConnection= “Srvr = “ “Název serveru” “;Ref = “ “Název základny” ;
//Pro možnost režimu souborů:
StringConnection= "Soubor = " "PathBase" “; Usr = Uživatelské jméno; Pwd = heslo”;
Pokus
Připojení = Připojení . Připojit(ConnectionString) ;
Výjimka
Zpráva = New MessageToUser;
Zpráva . Text = "Nepodařilo se připojit k databázi" + DescriptionError(); Zpráva . Ohlásit();
EndTry ;

Přerušení spojení

Připojení = Nedefinováno ;
Pro objekt V83.Aplikace je povinné odpojit připojení, jinak zůstane nedokončená relace viset, která pak bude muset být ručně odstraněna. V případě Konektor V83.COM připojení se automaticky ukončí na konci procedury, ve které bylo připojení vytvořeno.A je tu ještě jeden malý okamžik. Pro uživatele, pod kterým je spojení navazováno, musí být v jeho nastavení deaktivováno zaškrtávací políčko „Při ukončení programu požádat o potvrzení“.

Metoda NewObject().

Chcete-li vytvořit nový objekt, můžete použít metodu NewObject(), například:

Pro Konektor V83.COM

PožadavekCOM = Připojení. NovýObjekt( "žádost") ;
TableCOM = Připojení. NovýObjekt( "Tabulka hodnot") ;
ArrayCOM = Připojení. NewObject("Array") ;

WidCOM = Connection.NewObject

Pro V83.Aplikace

QueryOLE = Připojení. NovýObjekt(" Žádost") ;
TableOLE = Připojení. NovýObjekt("Tabulka hodnot") ;
ArrayOLE = Connection.NewObject(„Pole“ );
WidCOM = Connection.NewObject(„UniqueIdentifier“,StringUID);

PožadavekCOM . Text ="VYBRAT
| Pozice organizací. Kodex,
| Pozice organizací Název
| OD | Directory.PositionsOrganizations
AS Pozice organizací”;

Výsledek = RequestCOM. Provést ();
Vzorek = výsledek. Vybrat () ;
Zatímco výběr. Další()Cyklus
EndCycle ;
Můžete také použít správce konfiguračních objektů:
DirectoryCOM = Připojení. Referenční knihy. DirectoryName;
DocumentCOM = Připojení. Dokumentace. Název dokumentu;
RegisterCOM = Připojení. RegistryInformace. RegisterName ;

Získání a porovnání výčtu přes připojení COM

Pro porovnání hodnot prvků výčtu definovaných v konfiguraci je nutné tyto prvky převést na jeden z primitivních typů, jejichž porovnání nečiní potíže. Tyto typy mohou být buď číselné, nebo řetězcové. Hodnotu prvku výčtu můžete takto převést na číselný typ

Enum prvek = Connection.Directories.Directory1.FindByCode(1).Attribute1;

PossibleValues ​​​​= EnumElement.Metadata().EnumValues;

EnumElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumElement)));

Pokud EnumItemNumber = 0, pak Report( "EnumValue1");

ElseIf EnumItemNumber = 1 Pak Report("EnumValue2");

EndIf;

Získání objektu přes COM podle ID

Prostřednictvím správce konfiguračních objektů získáme objekt com, například:
DocumentCOM = Připojení. Dokumentace. Název dokumentu;

Poté získáme řetězec jedinečného identifikátoru:

StringUID = Connection.string ( DocumentCOM.UniqueIdentifier())

ID = Nový Y uniqueID(StringUID);
S linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Pokud potřebujete najít objekt com podle dokumentu podle ID, musíte napsat takto:

WidCOM = Connection.NewObject(„UniqueIdentifier“,StringUID );
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(UidCOM);

Když chceme vidět data z více tabulek současně, tzn. shromáždit několik tabulek do jedné, vzniká koncept spojování tabulek a vztahů mezi nimi. Připojení jsou čtyř typů:

  • vlevo, odjet;
  • že jo,
  • vnitřní;
  • kompletní.

Budeme zvažovat každý typ na abstraktním příkladu. Jsou zde 2 tabulky, v první uchováváme popisné informace o nomenklatuře, ve druhé o jejích pozůstatcích:

Abychom nějakou z těchto tabulek získali, musíme výslovně specifikovat, která pole budeme propojovat, podle jaké podmínky a typu. Nyní to bude jasnější.

Levý spoj

Pomocí levého spojení říkáme systému, že ve výsledku chceme vidět všechny záznamy z levé tabulky a záznamy z pravé, které splňují podmínku propojení. Řekněme, že propojíme tabulky podle pole produktu s podmínkou rovnosti, pak dostaneme tabulku ve tvaru:

Žádost.Text =
"VYBRAT
| Nomenklatura.Produkt,
| Nomenclature.Color AS Nomenklatura barev,
| Zbytky Barva JAKO Zbytky barev,
| Zbývající množství
| OD

";

U židle nebyly nalezeny žádné shody z tabulky reziduí, takže pole byla vyplněna hodnotami NULL, které musí zpracovat funkce ISNULL, viz Funkce dotazovacího jazyka 1C 8.

Levé spojení funguje jako smyčka ve smyčce – vezme první záznam z levé tabulky a projde všemi záznamy z pravé tabulky, aby byla splněna podmínka propojení. Potom se vezme druhý záznam z levé tabulky a tak dále. Pokud několik záznamů z pravé tabulky náhle splní podmínku odkazu, bude do výsledné tabulky přidáno několik řádků (podle počtu úspěšných odkazů). Jak vidíte, výsledná tabulka není informativní, data neodrážejí skutečnou podstatu, takže je lepší tyto tabulky propojit dvěma poli: Produkt a Barva, pouze tentokrát zpracujeme NULL:

Žádost.Text =
"VYBRAT
| Nomenklatura.Produkt,
| Nomenklatura. Barva,
| ISNULL(Zbytky.Množství, 0) JAKO Množství
| OD
| Nomenklatura AS Nomenklatura
| LEFT JOIN Residuals AS Residuals
| Nomenklatura softwaru.Produkt = Remains.Product

Správně se připojte

Pravé připojení se v podstatě neliší od levého. Pokud prohodíte tabulky, pak se pravé spojení změní na levé, navíc při použití konstruktoru systém sám převede všechna pravá spojení na levá.

Vnitřní spojení

Pomocí vnitřního spojení říkáme systému, že ve výsledku chceme vidět pouze ty záznamy, které splňují podmínku propojení jak z pravé, tak z levé tabulky. Počet výsledných záznamů tedy bude menší nebo roven počtu záznamů samotné "krátké tabulky" zapojené do spojení. Aplikujme vnitřní spojení na pole Produkt a Barva našich tabulek:

Žádost.Text =
"VYBRAT
| Nomenklatura.Produkt,
| Nomenklatura. Barva,
| Zbytky. Množství AS Množství
| OD
| Nomenklatura AS Nomenklatura
| INNER JOIN Residuals AS Residuals
| Nomenklatura softwaru.Produkt = Remains.Product
| And Nomenclature.Color = Remains.Color";

Plné připojení

Úplné spojení předá do výsledku všechny záznamy z obou tabulek, ty záznamy, které splňují podmínku propojení, budou spojeny, ty záznamy, které nesplňují podmínku propojení, budou stále ve výsledku dotazu, ale s částí polí NULL. Kompletní je jakoby levé a pravé spojení v jednom.

Úkolů na toto téma může být mnoho, zkusme jeden z nich vyřešit. Naše organizace je prodejcem 2 továren na nábytek: Zarya a Rassvet. Sortiment s náklady každé z továren je uložen v různých tabulkách. Je nutné sestavit jednotný ceník a vzít do něj výrobky za nejnižší cenu:

Aplikujme úplné spojení s výběrem všech polí, připojíme se podle produktu:

Žádost.Text =
"VYBRAT
| Nomenklatura Zarya. Položka JAKO Položka Zarya,
| NomenklaturaZarya.Cena JAKO CenaZarya,
| Nomenklatura Dawn. Položka JAKO Položka Dawn,
| NomenclatureDawn.Price AS PriceDawn
| OD

To není přesně to, co potřebujeme, pojďme spojit produktové pole do jednoho a zpracovat NULL:

Žádost.Text =
"VYBRAT
//construct ISNULL byl diskutován v části funkce dotazovacího jazyka
//pokud cena není definována, tak ji inicializujte
//proč 1000000 viz vysvětlení níže
| ISNULL(NomenklaturaZarya.Cena, 1000000) JAKO CenaZarya,
| ISNULL(NomenclatureDawn.Price, 1000000) JAKO PriceDawn
| OD
| NomenklaturaZarya JAKO NomenklaturaZarya
| FULL CONNECTION NomenclatureDawn AS NomenclatureDawn
| ON NomenclatureDawn.Product = NomenclatureDawn.Product";

Zbývá pouze zvolit minimální cenu. Konečné tělo žádosti bude vypadat takto:

Žádost.Text =
"VYBRAT
| ISNULL(NomenclatureDawn.Item, NomenclatureDawn.Item) JAKO položka,
| VÝBĚR
| WHEN ISNULL(NomenclatureDawn.Price, 1000000) > ISNULL(NomenclatureDawn.Price, 1000000)
| THEN ISNULL(NomenclatureDawn.Price, 1000000)
| ELSE NULL(NomenklaturaZarya.Cena, 1000000)
| KONČÍ JAKO CENA
| OD
| NomenklaturaZarya JAKO NomenklaturaZarya
| FULL CONNECTION NomenclatureDawn AS NomenclatureDawn
| ON NomenclatureDawn.Product = NomenclatureDawn.Product";

Pokud cena není definována (NULL), musí být inicializována s nějakou hodnotou, jinak operace porovnání nad/pod selže s chybou. cenu inicializujeme nereálně velkou částkou, aby se "ztratila" v porovnávací operaci, protože podle stavu problému vybíráme nejnižší cenu.

← Funkce dotazovacího jazyka 1C 8 | Připojuje se k dotazům 1C 8 →


Klíčová slova: COM, připojení, externí, OLE, Automation, Connect, ComConnector, Srvr

Při použití připojení 1C:Enterprise 8.0 COM pro přístup k datům existují následující výhody ve srovnání s použitím serveru Automation:

  1. Rychlejší nastavení připojení, protože není třeba vytvářet žádný samostatný proces operační systém a všechny akce se provádějí v rámci procesu volání;

  2. Rychlejší přístup k vlastnostem a metodám objektů 1C:Enterprise, protože organizace odvolání nevyžaduje organizaci meziprocesní komunikace;
  3. Menší spotřeba prostředků operačního systému.

Obecně je práce s 1C:Enterprise 8.0 přes COM připojení podobná práci s 1C:Enterprise v režimu Automation server. Hlavní rozdíly jsou následující:

  1. V případě Automation serveru je spuštěna plnohodnotná aplikace 1C:Enterprise 8.0 a v případě COM spojení je spuštěn relativně malý průběžný COM server.

  2. Při práci přes COM připojení nejsou k dispozici funkčnost tak či onak související s organizací uživatelského rozhraní 1C: Enterprise 8.0;
  3. Při práci s připojením COM se modul konfigurační aplikace 1C:Enterprise 8.0 nepoužívá. Jeho roli při práci s COM spojením plní externí připojovací modul.

1.1 Jak vytvořit spojení COM

Chcete-li uspořádat přístup k datům 1C:Enterprise 8.0 prostřednictvím připojení COM, provede se následující sekvence akcí:

  1. je vytvořen COM objekt s identifikátorem V8.COMConnector , pomocí kterého je navázáno spojení;

  2. je volána metoda Connect dříve vytvořeného objektu V8.COMConnector. Metoda Connect vrací odkaz na objekt připojení COM s infobází 1C:Enterprise 8.0;
  3. prostřednictvím přijatého objektu připojení COM je umožněn přístup k povoleným metodám, vlastnostem a objektům infobáze, se kterou je spojení navázáno.

Důležité! Kvůli chybějícímu uživatelskému rozhraní v připojení COM nelze v připojení COM použít všechny objekty, stejně jako vlastnosti a metody.

1C: Podnikové objekty přístupné zvenčí prostřednictvím připojení COM:

  1. Exportované proměnné a procedury/funkce modulu vnějšího odkazu

  2. Exportované proměnné a procedury/funkce běžných modulů
  3. Zahrnutí a vyloučení celých modulů nastavením vlastností sdíleného modulu

  4. Zahrnutí a vyloučení fragmentů společných modulů pomocí preprocesoru
  5. Globální kontext 1C:Enterprise 8.0, s výjimkou objektů, které jsou pevně spojeny s klientskou aplikací (TextDocument, SpreadsheetDocument, ...)

1.2 Externí připojovací modul

Jak již bylo uvedeno, povinnosti aplikačního modulu při práci přes COM spojení vykonává vnější připojovací modul. Tento modul může mít procedury obsluhy událostí AtStartSystemWork() a AtShutdownSystem(), které mohou obsahovat akce, které mají být provedeny během inicializace a ukončení připojení.

Procedury, funkce a globální proměnné definované ve vnějším spojovacím modulu s klíčovým slovem Export se stávají, jako v případě aplikačního modulu, součástí globálního kontextu.

1.3 Obecné moduly

Pro běžné moduly byly zavedeny vlastnosti "Client", "Server" a "ExternalConnection". Jsou určeny pro definování v konfiguraci použití modulů ve verzi klient-server a v režimu COM spojení.

1.4 Objekt "V8.COMConnector".

Jediným úkolem řešeným objektem COM V8.COMConnector je vytvoření spojení COM s infobází 1C:Enterprise 8.0. S jedinou instancí objektu V8.COMConnector lze navázat neomezený počet připojení. Objekt V8.COMConnector má jedinou metodu Connect, která se používá k navázání spojení COM s infobází 1C:Enterprise 8.0.

<СтрокаСоединенияИБ>

Připojovací řetězec IB je řetězec fragmentů ve tvaru Parametr=Hodnota. Fragmenty jsou od sebe odděleny ";". Pokud hodnota obsahuje mezery, musí být uzavřena do dvojitých uvozovek (").

Společné parametry:

usr - uživatelské jméno;
pwd - heslo.

Pro variantu souboru je definován následující parametr:

Soubor – adresář infobáze.

Pro verzi klient-server jsou definovány následující parametry:

Srvr - 1C: Název podnikového serveru;
Ref - název infobáze na serveru.

Metoda Connect naváže spojení COM s infobází 1C:Enterprise 8.0 a vrátí odkaz na objekt spojení COM.

// Vytvoří se objekt konektoru
V8 = Nový COMObject("V8.COMConnector");
// vytvoření objektu připojení COM
Připojení = V8.Connect("File=""c:\InfoBases\Trade""; Usr =""Director"";")

1.5 Objekt "COM connection".

Poskytuje připojení COM k infobázi 1C:Enterprise plný přístup do jeho globálního kontextu (viz "Kontext provádění programové jednotky"). Proto COM spojení může mít jako své metody: systémové konstanty, hodnoty objektů specifikovaných v konfigurátoru, přístupné pomocí manažerů (například konstanty, výčty, adresáře, dokumenty, protokoly dokumentů, sestavy, zpracování, plány typů charakteristiky, účty plánů, plány typu kalkulace, registry) a také proměnné deklarované v modulu vnějšího připojení s klíčovým slovem Export.

Kromě toho má připojení COM další metodu NewObject, kterou lze použít k vytvoření hodnot konkrétních typů.

ts = Připojení. NewObject("ValueTable");

Řetězcová metoda Umožňuje získat řetězcové reprezentace hodnot 1C:Enterprise.

View = Connection.String(Data.UniqueIdentifier());

1.6. Vlastnosti práce s připojením COM

V automatizaci a na připojení COM mají TRUE a FALSE hodnoty -1 (mínus jedna) a 0.

Je možné uspořádat fond připojení COM. Současně se na hostiteli na serveru 1C:Enterprise v ADVANCE vytvoří několik objektů připojení COM a vytvoření připojení trvá ještě kratší dobu, protože není potřeba vytvářet nový objekt.

Byl implementován nový objekt Query Builder navržený pro generování textů dotazů na základě zadaných nastavení. Tento objekt podporuje funkci sestavy sestav, která nesouvisí se zobrazením sestavy v tabulkovém dokumentu a dalšími souvisejícími úkoly uživatelské rozhraní. Tento objekt lze použít na serveru 1C:Enterprise a v připojení COM.

Použití objektů COM je dostupné, když na serveru 1C:Enterprise běží vestavěný jazyk.

Chyby COM jsou převedeny do výjimek 1C:Enterprise.

Pokud se konfigurace pokusí vytvořit neplatný objekt, jako např tabulkový dokument, ve vnějším spojovacím modulu, v obecném modulu nebo v objektovém modulu, pak nelze výjimečně navázat nebo ukončit spojení COM.

) To je správně

Přitom jsem nejednou viděl, kdy se prostě "rozjedou" publikace, které neutáhnou ani 10 bodů.
Proč se to stalo? Asi proto, že se někomu evidentně líbily.


Mluvím o tom a říkám, že by bylo hezké nečíst článek podle hodnocení, abyste pochopili, jak moc ho potřebujete, nebo jej hodnotit ne tak primitivně +/-. Pokud jde o to, co se mi líbilo, opravil bych to takto: tolik zabodovala díky tomu, že se hvězdy tvořily takovým způsobem a na stránce se sešlo hodně lidí a mnohým se to líbilo, sami chápete, že jde o věc náhody. jakmile článek odejde domovská stránka pak už se dá sehnat jen na požádání a tak hlasuje každý kolemjdoucí. A k podpoře na hlavní stránce, pokud tomu dobře rozumím, umožňují právě neustálé komentáře = propagace článku.
Právě kvůli tomu dávají obchody do ulic - vždyť často nezáleží na kvalitě a relevanci produktu, ale na průchodnosti místa, chodící lidé často kupují to, co druhý den vyhodí, jen kvůli procesu. Jde o známou nemoc – shopománii. Nebo prostě zvýšení toku zvyšuje pravděpodobnost správného kupce.

A klady a zápory ... jsou jen jakési "děkuji" za strávený čas a práci


Tito. Počítá se i mínus jako „děkuji“? Chtěl jsem tedy znát váš postoj k tomu, zda je nutné to dávat do takových případů a jak zajímavé jsou ostatní? Ať už to dát, když je článek škodlivý / špatný nebo když je pro vás prostě k ničemu / prázdný.
Podle mého názoru článek vypadá jen jako zvýšení hodnocení, protože:
1. Problém s mnou uváděnými typy autor obecně ignoroval, ačkoli nebyl příliš líný napsat hromadu komentářů.
2. V článku je jasná nepřesnost: prý je to jediná cesta

V82 = Nový COMobject("V82.ComConnector"); Kód = ContractorCOM.Code;


ale klidně to dělám pomocí zpracování takto:

Upozornit(Základní Adresáře. Protistrany. Najít podle jména("LLC").Kód);


a vše je v pořádku! A volím připojení V82.ComConnector
Je nějak zvláštní, že autora vůbec nezajímá, že jeho článek obsahuje takové problémy, na které bylo poukázáno, ale nijak nereaguje.
3. Ale stále existuje problém, když se objeví chyba "Třída neexistuje".
4. Ale je problém, když je nainstalováno 8.2 a poté 8.1 - zkuste výměnu přes OLE / COM s typickou UT-BP výměnou!
5. Mohl byste uvést hlavní zpracování na webu, které vám umožňuje univerzální připojení přes OLE / COM, aby začátečníci neztráceli čas, píšete pro ně! Mimochodem, z nějakého důvodu se s vámi její obrázek chlubí, proč by?. A jako výsledek, 2 slova k věci a 6 dalších v zákulisí.

Obecně na vás neházím bláto, ale upozorňuji na konkrétní mezery, ale bez reakce. Pokud je to zkušenost, kterou sdílíte, pak je nějak chybná a neúplná.
Chci říct, pokud měl autor touhu posbírat všechny závady, mohl by si alespoň poslechnout zkušenosti někoho jiného a neštěkat na komentáře. Okamžitě nastává situace, kdy ten, kdo to četl, ví víc než autor, řeknou mu to (někdy nesprávně) a on se také brání. Výsledkem je, že všechny informace nejsou v článku, ale v komentářích! Legrační! Často se to stává, ale zároveň se nemusíte opírat o to, co jste chtěli nejlepší - já ukazuji, jak je to lepší, a ostatní to ukazují! Zahrňte to do článku a bude to stát za to, ne každý má zájem číst tuto šarvátku.



Související články: