Príjem dát cez com pripojenie od 1s. Tri piliere práce s objektmi COM. Práca cez COM pripojenie je jednoduchšia, než si myslíte. Vytvorte pripojenie OLE

Tlačiť (Ctrl+P)

Jednou z možností výmeny dát medzi databázami 1C je výmena cez COM spojenie. Pomocou pripojenia COM sa môžete pripojiť z jednej databázy 1C k druhej a čítať alebo zapisovať údaje. Táto metóda môže byť použitá ako vo verziách klient-server databáz, tak aj v súborových databázach. Tento článok popisuje tieto typy pripojení na platforme 8.3

com spojenie

Pre aplikáciu 1C môžete vytvoriť dva typy objektov COM. Toto sú len spojenia V83.Aplikácia a com spojenia Konektor V83.COM . V prípade V83.Aplikácia Spúšťa sa takmer plnohodnotná kópia aplikácie 1C. V prípade použitia Konektor V83.COM Spustí sa malá časť servera. Rýchlosť prevádzky je v tomto prípade vyššia, ale niektoré funkcie nemusia byť dostupné. Najmä práca s formulármi a bežnými modulmi, pre ktoré nie je nastavená vlastnosť práce s externými pripojeniami. Väčšinou by ste mali použiť Konektor V83.COM a to len v prípade nedostatočnej funkčnosti V83.Aplikácia. Rozdiel v prevádzkovej rýchlosti môže byť badateľný najmä na veľkoobjemových databázach. Používa sa pre platformu 8.2 V82.Application alebo V82.COMConnector

Vytvorte pripojenie OLE

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

Vytvorte spojenie COM

Pripojenie = New COMObject(“V83.COMConnector” ) ;

Spojovací reťazec

//Pre voľbu klient-server
Pripojovací reťazec= “Srvr = ““Názov servera” “;Ref = “ “Názov základne” ;
//Pre možnosť režimu súborov:
Pripojovací reťazec= "Súbor = ""PathKBase" “; Usr = Používateľské meno; Pwd = heslo”;
Pokus
Pripojenie = pripojenie . Pripojte sa(Reťazec pripojenia) ;
Výnimka
Správa = New MessageToUser;
Správa . Text = "Nepodarilo sa pripojiť k databáze" + DescriptionErrors(); Správa . Ohlásiť();
EndPokus ;

Odpojenie

Pripojenie = Nedefinované ;
Pre objekt V83.Aplikácia Spojenie je potrebné ukončiť, inak zostane neúplná relácia, ktorú je potom potrebné ručne vymazať. V prípade Konektor V83.COM spojenie sa preruší automaticky po dokončení postupu, v ktorom bolo spojenie vytvorené.A je tu ešte jeden malý bod. Pre užívateľa, pod ktorým sa vytvára spojenie, musí byť v jeho nastaveniach deaktivované zaškrtávacie políčko „Vyžiadať potvrdenie pri ukončení programu“.

Metóda NewObject().

Na vytvorenie nového objektu môžete použiť metódu NewObject(), napríklad:

Pre Konektor V83.COM

ŽiadosťCOM = Pripojenie. NewObject( "žiadosť") ;
TableCOM = Pripojenie. NewObject( "Tabuľka hodnôt") ;
ArrayCOM = pripojenie. NewObject(“Pole” ) ;

ViewCOM =Connection.NewObject

Pre V83.Aplikácia

RequestOLE = Pripojenie. NewObject(“ Žiadosť ") ;
TableOLE = pripojenie. NewObject("Tabuľka hodnôt") ;
ArrayOLE = Connection.NewObject(„Pole“ );
ViewCOM =Connection.NewObject(„UniqueIdentifier“, StringUID);

ŽiadosťCOM . Text ="VYBERTE si
| Kódex pozícií organizácií,
| Pozície organizácií.Názov
|OD | Adresár.Pozície organizácií
AKO NA POZÍCIE ORGANIZÁCIÍ”;

Výsledok = ŽiadosťCOM. Run();
Ukážka = Výsledok. Vyberte ();
Čau výber. Ďalšie()Cyklus
EndCycle ;
Môžete tiež použiť správcov konfiguračných objektov:
DirectoryCOM = pripojenie. Adresáre. DirectoryName;
DocumentCOM = Pripojenie. Dokumentácia. Názov dokumentu;
RegisterCOM = pripojenie. Informačné registre. RegisterName ;

Príjem a porovnanie enumerácie cez COM spojenie

Pre porovnanie hodnôt prvkov enumerácie definovaných v konfigurácii je potrebné tieto prvky previesť na jeden z primitívnych typov, ktorých porovnanie je jednoduché. Takéto typy môžu byť buď číselné alebo typ reťazca. Hodnotu prvku enumerácie môžete previesť na číselný typ takto:

Enum Item = Connection.Directories.Directory1.FindByCode(1).Props1;

PossibleValues ​​​​= Enum Element.Metadata().Enum Values;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Ak EnumerationItemNumber = 0, potom report( "Vyčíslená hodnota1");

ElseIfEnumerationItemNumber = 1 Potom Report("EnumerationValue2");

koniec Ak;

Načítanie objektu cez COM podľa identifikátora

Prostredníctvom správcov konfiguračných objektov získame objekt com, napríklad:
DocumentCOM = Pripojenie. Dokumentácia. Názov dokumentu;

Potom dostaneme jedinečný reťazec identifikátora:

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

Identifikátor = Nové U uniqueIdentifier(StringUID);
S linkByIdentifier = Dokumenty[DocumentName].GetLink(Identifier);

Ak potrebujete nájsť objekt com podľa dokumentu podľa identifikátora, musíte napísať takto:

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

Ahoj Khabrachanci!

V tomto článku chcem hovoriť o tom, ako sa v mojej organizácii vytvára integrácia s platformou 1C. To, čo ma k tomu podnietilo, bola takmer úplná absencia technická informácia o tejto téme. Pri čítaní rôznych článkov a správ na tému prepojenia 1C s akýmkoľvek informačným systémom sa znova a znova presviedčate, že všetky sú marketingového, demonštračného charakteru a nikdy nie technického, odrážajú problém a podstatu jeho riešenia.

Varujem vás, že táto metóda v žiadnom prípade netvrdí, že je univerzálna. Pretože existuje veľa samotných konfigurácií 1C a informačné systémy, jazyky a platformy - ešte viac, počet možných kombinácií je obrovský. Mojím cieľom je ukázať jedno možné riešenie.


Vybral som si Python ako jazyk, ktorý bude integrovaný s 1C. Veľmi dobre sa hodí na automatizáciu procesov. To je uľahčené minimalizmom syntaxe (kód je napísaný veľmi rýchlo), bohatý štandardná knižnica(menšia potreba modulov tretích strán), multiplatformové - s vysokou pravdepodobnosťou bude kód napísaný v OS Linix úspešne fungovať na Windows.

Na začiatok načrtnem údaje, s ktorými budeme pracovať. Organizácia je spoločnosť zaoberajúca sa predajom energie v regióne Ďalekého východu - obsluhuje približne 400 tisíc predplatiteľov, databáza 1C je založená na vlastnej konfigurácii. Pre každého účastníka sa ukladajú jeho platby, poplatky, spotrebované služby a výpočtové schémy, merače, odpočty a mnohé ďalšie údaje.

Kedysi mala organizácia program napísaný v Delphi a ako databázu používal MSSQL/Firebird. V týchto slávnych časoch ste sa mohli pripojiť k databáze pomocou akéhokoľvek jazyka a vykonávať mnoho akcií - vyberať dlžníkov, odosielať prijaté platby, zaznamenávať údaje o prístrojoch. Nie je prekvapujúce, že zbierka skriptov, ktoré automatizujú rutinu, neustále rastie. Programátori mohli vykonať akúkoľvek akciu bez otvorenia samotného programu.

Bohužiaľ, s prechodom na 1C sa freebie skončilo - už nebolo možné pripojiť sa priamo k databáze. Vo všeobecnosti je samotná platforma 1C nedeliteľná a nie je vhodná na integráciu s inými systémami. Ona, ako sa hovorí, je vec sama o sebe. Pri načítavaní údajov do 1C by ste mali pamätať na to, že ich extrahovanie odtiaľ nebude také jednoduché. Ale vzhľadom na skutočnosť, že organizácia potrebovala zaviesť platobné systémy a Osobná oblasť, bolo potrebné nájsť nejaké riešenie.

Hlavné úlohy, ktoré predo mnou stáli, bola schopnosť rýchlo získať údaje o konkrétnom osobný účet- Celé meno, adresa, meracie zariadenia, stavy meračov, platby, poplatky. Plus generovanie dokladov - odsúhlasovacia správa, potvrdenie o platbe. Neexistuje teda žiadna možnosť priameho pripojenia k databáze - každý, kto sa pozrel na databázu 1C na serveri SQL, videl, že je ťažké pochopiť množstvo tabuliek ako aaa1, aaa2. A vytváranie dopytov s takýmito názvami tabuliek a polí je jednoducho nereálne. Okrem toho je veľa 1C tabuliek (najmä tie najdôležitejšie, ako napríklad časť najnovších, zostatky a revolúcie) virtuálnych a roztrúsených po rôznych fyzických stoloch, zhromaždených viacerými spojeniami. Táto metóda nie je vhodná.

Platforma 1C poskytuje možnosť pripojiť sa k nej prostredníctvom pripojenia COM. Rovnako ako mnoho programov Windows, počas inštalácie 1C sú v systéme zaregistrované dva objekty COM - Automation Server a COM Connector. S oboma objektmi je možné pracovať pomocou jazyka, ktorý podporuje technológiu COM.

Objekt Automation Server je aplikácia 1C, ktorá sa takmer nelíši od bežnej klientskej aplikácie. Rozdiel je v tom, že existuje ďalšia príležitosť ovládanie programu inštancia aplikácie. Pri práci s objektom COM Connector sa spustí odľahčená verzia aplikácie 1C, v ktorej nie sú dostupné formuláre, ani funkcie a metódy súvisiace s rozhraním a vizuálnymi efektmi. Samotná aplikácia sa spustí v režime „Externé pripojenie“. Inicializácia globálnych premenných (napríklad definovanie súčasný užívateľ a jeho nastavenia) je potrebné vykonať v module externého pripojenia 1C. Ak v režime externého pripojenia kód volá funkciu, ktorá nie je v tomto režime dostupná, bude vyvolaná výnimka (ktorá bude odovzdaná nášmu skriptu Python). Volania nebezpečných funkcií by mali byť zarámované do konštrukcií formulára

#If NOT a OuterJoin Then Warning("Ahoj!"); #Koniec Ak

Keďže práca s objektmi COM je výlučne technológiou Windows, nie je prekvapujúce, že nie je súčasťou štandardnej distribúcie Pythonu. Budete musieť nainštalovať rozšírenie - sadu modulov, ktoré poskytujú všetky potrebné funkcie pre programovanie pod Windowsom v Pythone. Dá sa stiahnuť ako predpripravený exe inštalátor. Samotné rozšírenie poskytuje prístup k registrom, službám, objektom ODBC, COM atď. Ako alternatívu môžete okamžite nainštalovať distribúciu ActiveState Python, ktorá sa dodáva s rozšírením Win32 hneď po vybalení.

Nejaký čas som experimentoval s pripojením COM pri vývoji webových aplikácií, najmä osobného účtu. Boli identifikované nasledujúce nevýhody:

Pripojenie COM je pomalé. Nízky výkon je známou nevýhodou technológie COM.
- Proces nadviazania spojenia s 1C môže v závislosti od konfigurácie trvať od 1 do 8 sekúnd (v mojom prípade - 6 sekúnd). Netreba dodávať, že nadviazanie spojenia pre každú požiadavku bude mať za následok načítanie každej stránky za 8 sekúnd.
- Keďže webové aplikácie v Pythone fungujú ako nezávislé servery, predchádzajúci bod je možné kompenzovať uložením spojenia do nejakej globálnej premennej a jeho obnovením v prípade chyby. Aby som bol úprimný, ešte som nepremýšľal o tom, ako udržiavať spojenie v PHP.
- Stratila sa multiplatformová funkčnosť webovej aplikácie.

Na základe vyššie uvedených bodov sa rozhodlo zmeniť princíp interakcie a rozdeliť ho na 2 časti – prvá závislá od platformy (založená na okne), nahrávanie údajov 1C do akéhokoľvek vhodného formátu a druhá, nezávislá od platformy, schopný pracovať s údajmi bez toho, aby v zásade mal niečo o 1C.

Akčná stratégia je nasledovná: Python skript sa pripojí k 1C, vykoná potrebné dotazy a nahrá údaje do databázy SQLite. K tejto databáze sa môžete pripojiť z Pythonu, PHP, Java. Väčšina našich projektov funguje v Pythone a keďže neznesiem ručné písanie nespracovaných SQL dotazov, všetka práca s databázou SQLite prebieha cez SQLAlchemy ORM. Všetko, čo bolo potrebné, bolo opísať štruktúru údajov databázy v deklaratívnom štýle:

Z sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer_key= True) účet = Stĺpec(Unicode(32), index=True) kód = Stĺpec (Unicode(32)) adresa = Stĺpec (Unicode(512)) fio = Stĺpec (Unicode(256)) zdroj = Stĺpec (Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) dom = Column(Integer) flat = Column(Integer) mro = Stĺpec (Unicode(256)) trieda Platba (Základňa): __názov tabuľky__ = "platby" # a tak ďalej...

Teraz stačí importovať tento modul do akéhokoľvek projektu Python a môžete pracovať s údajmi.

Predvídam vašu otázku – „prečo SQLite“? Hlavným dôvodom je, že databáza je len na čítanie, takže problémy so zápisom na SQLite by nás nemali znepokojovať. Po druhé, formát tohto DBMS je pohodlný - je pohodlnejšie ho zobraziť (je ich veľa bezplatné služby vrátane super rozšírenia pre FireFox). Po tretie, v niektorých prípadoch bolo potrebné získať prístup k predplatiteľom zo strojov, ktoré nemajú pripojenie k serveru MySQL. V tomto prípade stačí skopírovať databázový súbor SQLite a tento stroj bude mať prístup ku všetkým informáciám.

Vykladanie prebieha raz denne v noci. Rovnakým spôsobom je možné automatizovať zadávanie údajov do 1C. Napríklad je potrebné zaznamenať údaje zanechané predplatiteľmi na webovej stránke osobného účtu. V tomto prípade sa opäť pripojíme k 1C a programovo vytvoríme a odošleme dokument „Akt o čítaní“. Nižšie uvediem kód.

Práca s objektmi COM v Pythone je trochu nezvyčajná. Po prvé, „Pytonicita“ kódu sa stratí - pravidlá pre pomenovanie premenných a funkcií v 1C, mierne povedané, nezodpovedajú Zen of Python. Po druhé, každý vie, že objekty 1C sú často pomenované znakmi azbuky, čo spôsobí problémy pri vývoji v Pythone... ale dajú sa vyriešiť. Odporúčam vám pozrieť sa na kód:

Import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Ako je zrejmé z kódu, klient je inicializovaný na prácu s 1C. Objekt COM je definovaný názvom „V82.COMConnector“. Upozorňujeme, že tento názov je platný pre platformu V8.2, ak máte verziu 8.1, názov bude „V81.COMConnector“.

Na inicializovanom klientovi voláme metódu Connect() a odovzdávame mu pripojovací reťazec. Reťazec pozostáva z názvu servera, databázy, používateľa a hesla. Výsledný objekt V82 ukladá pripojenie k aplikácii 1C. Nemá metódu Disconnect() ani nič podobné. Pre odpojenie od databázy stačí objekt vymazať z pamäte pomocou funkcie del() alebo ho priradiť k premennej None.

S objektom môžete pristupovať k akýmkoľvek poliam a metódam globálneho kontextu 1C, pracovať s univerzálnymi objektmi, ako sú TabularDocument, ValueTable atď. Je dôležité poznamenať, že pri práci cez pripojenie COM pracuje 1C v režime „Externé pripojenie“. Neumožňuje žiadne interaktívne funkcie, ako sú kontextové dialógové okná, upozornenia a hlavne formuláre. Som si istý, že neraz budete preklínať vývojárov konfigurácie, ktorí v module formulára dokumentu uzatvárajú najdôležitejšiu funkcionalitu do procedúry Button1Press().

Poďme sa baviť o takej dôležitej veci, akou sú atribúty azbuky. Napriek tomu, že 1C je dvojjazyčné prostredie a pre každú ruskú metódu existuje analóg v anglickom jazyku, skôr či neskôr sa budete musieť obrátiť na atribút cyriliky. Ak to nespôsobí žiadne problémy v jazykoch PHP alebo VBSCript,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Reťazec pripojenia") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsRecord.Write()

Potom sa kód Pythonu jednoducho zrúti s chybou syntaxe. Čo robiť? Upraviť konfiguráciu? Nie, stačí použiť metódy getattr a setattr. Odovzdaním objektu COM a cyrilického názvu atribútu týmto funkciám môžete získať a nastaviť hodnoty podľa toho:

#coding=cp1251 Catalog = getattr(V82.Catalogs, "Osobné účty")

Dôležité je nasledovné: názvy detailov, ako aj parametre funkcií a metód sa musia prenášať v kódovaní cp1251. Preto, aby sa predišlo zámene s kódovaním vopred, má zmysel deklarovať ho na začiatku súboru: #coding=cp1251. Potom môžete prenášať reťazce bez obáv o ich kódovanie. Ale! Všetky reťazce prijaté z 1C (výsledky volania funkcií, dopytov) budú v kódovaní UTF-8.

Príklad kódu, ktorý vykoná dotaz v prostredí 1C, iteruje výsledok a uloží databázu v SQLite:

#coding=cp1251 q = """ VYBERTE Osobné účty. Kód AS, Osobné účty. Budova. Vyrovnanie. Meno + ", " + Osobné účty. Krátka adresa AS adresa, Osobné účty. Účastník. Meno AS fio, Osobné účty. Divízia. Názov AS psu, EXPRESS (Charakteristika osobných účtov Slice of the Last. Hodnota AS Adresár. Organizácie teritoriálnej siete). Názov AS tso, Osobné účty. Budova. Zaľudnený bod. Názov AS np, Osobné účty. Budova. Ulica. Názov AS ulica, Osobné účty. Budova. Dom AS dom, Osobný účet a.HlavnáIzba.Číslo izby AS byt , OsobnéÚčty.Divízia.Rodič.Meno AS MR Z Adresára.Osobné účty AKO Osobné účty ĽAVÉ SPOJENIERegistráciaInformácie.CharakteristikaOsobnéÚčty. = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS CharakteristikaL PersonalAccountsSliceLast software PersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.NewObject("Query", q) selection = query).Choose(execute) ) CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection .code abonent.fio = výber.fio abonent.adresa = výber.adresa abonent.psu = výber.psu abonent.tso = výber. tso abonent.source = u"ASRN" abonent.np = výber.np abonent.street = výber .street abonent.house = výber.dom abonent.byt = výber.byt abonent.mro = výber.mro CONN.add(abonent) CONN.commit()

Tu CONN predstavuje spojenie s databázou SQLite. Vytvorí sa objekt dotazu a vyplní sa jeho text. Ako je uvedené vyššie, text požiadavky musí byť v cp1251, pre ktoré je kódovanie deklarované ako prvé. Po vykonaní požiadavky sa z databázy vymažú všetci odberatelia, aby sa nepridávali duplikáty, potom sa v slučke pridávajú a nasleduje finálny commit.

Pri práci so žiadosťami som objavil nasledujúce pravidlá.

Pri výbere polí im priraďte názvy latinskými písmenami; oveľa pohodlnejšie bude pristupovať k nim cez selektor (bodka) namiesto getattr().
- Vyberte len primitívne dátové typy: reťazce, čísla, dátum a boolean. Nikdy nevyberajte odkazy na objekt (dokument, referenčnú knihu)! V tomto kontexte absolútne nepotrebujete odkazy a sú dokonca škodlivé, pretože akékoľvek volanie odkazovej podpory alebo metódy bude mať za následok požiadavku prostredníctvom pripojenia COM. Ak pristupujete k atribútom odkazu v slučke, bude to extrémne pomalé.
- Ak vyberiete pole typu Dátum, vráti sa ako objekt PyTime. Toto je špeciálny typ údajov na prenos dátumu a času v spojení COM. Práca s ním nie je taká pohodlná ako s bežným dátumom a časom. Ak odovzdáte tento objekt int(), vráti časovú značku, z ktorej potom môžete získať dátum a čas pomocou metódy fromtimestamp().

Teraz sa pozrime, ako vznikajú tlačené dokumenty. Faktom je, že spotrebiteľ musí mať možnosť stiahnuť si vopred pripravené dokumenty, napríklad potvrdenie o platbe alebo správu o odsúhlasení. Tieto dokumenty sú generované v 1C v súlade so stanovenými požiadavkami, ich implementácia v Pythone zaberie veľa času. Preto je lepšie generovať dokumenty v 1C a ukladať ich Excel formát.

Dokument zosúlaďovacieho aktu je teda generovaný špeciálnym externé spracovanie. Pre tých, ktorí nie sú oboznámení s terminológiou 1C: spracovanie je samostatný program, ktorý má svoj vlastný modul, formuláre, šablóny, určené na spustenie v prostredí 1C. Je potrebné inicializovať spracovanie, vyplniť jeho údaje a zavolať funkciu, ktorá nám vráti tabuľkový dokument určený na prezeranie v 1C. Tento dokument musí byť uložený vo formáte Excel a skopírovaný na server alebo zaznamenaný v databáze.

Odkaz = getattr(V82.Catalogs, "Systémové správy").FindByDescription("Ellen Reconciliation Report") nav_url = V82.GetURL(link, "Report") názov = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports. Create (name) setattr(ExternalReport, "PersonalAccount", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Vyššie uvedený fragment robí nasledovné: Spracovanie, ktoré generuje dokument, je spojené. Spracovanie môže byť zabudované do konfigurácie, uložené na disku alebo v databáze 1C (v nejakom adresári). Keďže sa spracovanie často mení, aby sa konfigurácia neaktualizovala zakaždým, najčastejšie sa meniace spracovanie je uložené v adresári „System Reports“ v atribúte „value storage“ s názvom Report. Spracovanie je možné inicializovať vyložením z databázy na disk a načítaním, alebo pomocou metódy GetURL(), ktorej je potrebné odovzdať odkaz na element adresára a názov atribútu. Hodnoty podrobností priradíme k prijatému objektu spracovania, zavoláme exportovanú funkciu GetDoc() a dostaneme tabuľkový dokument, ktorý sa uloží do dočasného súboru Excel. Obsah tohto súboru sa zapíše do databázy SQlite.

Posledná vec, ktorú treba zvážiť, je programové zadávanie údajov do 1C. Predpokladajme, že potrebujete zadať svedectvá od predplatiteľov. Na tento účel stačí vytvoriť a vykonať dokument „Akt prijatia svedectva“:

#coding=cp1251 acts = getattr(V82.Documents, "Act of Svedectvo") act = Acts.CreateDocument() setattr(act, "Svedectvo", 1024.23) setattr(act, "Predplatiteľ", "Ivanov") # Vyplnenie v ďalších podrobnostiach... konať.Napísať()
Zadávanie údajov je teraz automatizované.

Načrtol som teda metódu, ktorá je založená na programovom nahrávaní a sťahovaní údajov pomocou pripojenia COM. Táto metóda v mojej organizácii úspešne funguje už takmer rok. Databáza vytvorená z 1C slúži 3 platobným systémom, získavaniu internetu (platba kartami cez internet), ako aj osobnému účtu. Okrem toho sa pripájajú k databáze rôzne skripty automatizovať rutinu.

Napriek nedostatkom metódy (pomalá rýchlosť pripojenia COM) vo všeobecnosti funguje stabilne. Údaje máme vo forme nezávislej od platformy (SQLite), s ktorými sa dá pracovať z akéhokoľvek jazyka. A hlavná časť kódu je napísaná v Pythone, čo znamená, že je k dispozícii veľa nástrojov a techník, o ktorých sa vám v 1C ani nesníva.

Toto je jeden z možné spôsoby interakcia s 1C. Som si istý, že nie je nový a pravdepodobne ho už niekto testoval a optimalizoval. Snažil som sa však predstaviť čo najviac detailov procesu, aby som vás ochránil pred nástrahami, na ktoré som sám nastúpil.

Prajem vám všetkým veľa šťastia a nezabudnite, že 1C nie je také strašidelné, ako sa o ňom hovorí!

Jednou z možností výmeny dát medzi databázami 1C je výmena cez COM spojenie.

Pomocou pripojenia COM sa môžete pripojiť z jednej databázy 1C k druhej a čítať alebo zapisovať údaje. Táto metóda môže byť použitá ako vo verziách klient-server databáz, tak aj v súborových databázach. V tomto článku sa pozrieme na príklady tohto typu pripojenia. Príklady využívajú platformu 8.2.

Pre aplikáciu 1C môžete vytvoriť dva typy objektov COM. Toto V82.Aplikácia A Konektor V82.COM. V prípade V82.Aplikácia Spúšťa sa takmer plnohodnotná kópia aplikácie 1C. v prípade použitia Konektor V82.COM Spustí sa malá časť servera.
Rýchlosť prevádzky je v tomto prípade vyššia, ale niektoré funkcie nemusia byť dostupné. Najmä práca s formulármi a bežnými modulmi, pre ktoré nie je nastavená vlastnosť práce s externými pripojeniami. Väčšinou by ste mali použiť Konektor V82.COM a to len v prípade nedostatočnej funkčnosti V82.Aplikácia. Rozdiel v prevádzkovej rýchlosti môže byť badateľný najmä na veľkoobjemových databázach.

Tak poďme na to

  1. Vytvorme objekt COM
    • Pre V82.Aplikácia Connection = New COMObject("V82.Application" ) ;
    • Pre Konektor V82.COM Pripojenie = New COMObject("V82.COMConnector" ) ;
  2. Vytvorme reťazec pripojenia
    • pre serverovú verziu databázy ConnectionString = "Srvr = " "Názov servera" ";Ref = " "Názov základne" ;
    • pre verziu súboru databázy ConnectionString = "File = " "PathKBase" "; Usr = Používateľské meno; Pwd = Heslo";
  3. Pripojenie k databáze Pokus o pripojenie = pripojenie. Connect(ConnectionString) ; Výnimka Message = New MessageToUser; Správa. Text = + ErrorDescription() ; Správa. Ohlásiť() ; EndPokus ;
  4. Odpojenie od databázy Pripojenie = Nedefinované ;

    Pre objekt V82.Aplikácia Spojenie je potrebné ukončiť, inak zostane neúplná relácia, ktorú je potom potrebné ručne vymazať. V prípade Konektor V82.COM spojenie sa preruší automaticky po dokončení postupu, v ktorom bolo spojenie vytvorené.A je tu ešte jeden malý bod.

    Pre užívateľa, pod ktorým sa vytvára spojenie, musí byť v jeho nastaveniach deaktivované zaškrtávacie políčko „Vyžiadať potvrdenie pri ukončení programu“.

Teraz dáme celý kód dohromady

Connection = New COMObject("V82.Application" ) ; //Pripojenie = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Petya; Pwd = 123"; Pokus o pripojenie = pripojenie. Connect(ConnectionString) ; Výnimka Message = New MessageToUser; Správa. Text = "Nepodarilo sa pripojiť k databáze"+ DescriptionError() ; Správa. Ohlásiť() ; EndPokus ; Pripojenie = Nedefinované ;

Pre typ pripojenia V82.Aplikácia metóda sa používa pre objekt COM, ktorý bol pôvodne vytvorený, a pre Konektor V82.COM metóda sa aplikuje na spojenie. ďalšia práca so žiadosťou pokračuje štandardné prostriedky 1C. v kóde to vyzerá takto:

Žiadosť = pripojenie. NewObject("Požiadavka" ) ; // Pre Konektor V82.COM Žiadosť = pripojenie. NewObject("Požiadavka" ) ; // Pre V82.Aplikácia Žiadosť. Text = "VYBRAŤ | Kódex pozícií organizácií, | Pozície organizácií.Názov|OD | Adresár. Pozície organizácií AS Pozície organizácií"; Výsledok = požiadavka. Run(); Ukážka = výsledok. Vyber() ; Čau výber. Next() Loop EndLoop ;

Pre verziu 1C:Enterprise 8.3 zostáva všetko nezmenené okrem toho, že pri vytváraní objektov COM musíte použiť "V83.COMConnector" alebo "V83.Aplikácia".

) To je správne

Zároveň som viac ako raz videl, keď sa publikácie, ktoré nedosiahli ani 10 bodov, jednoducho „rozbehli“.
Prečo sa to stalo? Vraj preto, že sa niekomu zjavne páčili.


To je to, čo hovorím, že by bolo pekné pochopiť, ako veľmi to potrebujete, bez toho, aby ste si prečítali hodnotiaci článok, alebo by ste to hodnotili nie tak primitívne +/-. Pokiaľ ide o to, čo sa mi páčilo, opravil by som to takto: získalo to tak veľa vďaka tomu, že sa hviezdy zoradili a na stránke sa zišlo veľa ľudí a mnohým sa to páčilo, sami chápete, že je to vec náhody, pretože hneď ako článok odíde domovskej stránke potom sa už dá nájsť len na požiadanie a tak hlasuje každý okoloidúci. A pokiaľ som dobre pochopil, neustále komentáre = propagácia článku vám umožňujú udržiavať ho na hlavnej stránke.
Práve preto umiestňujú obchody na verejné ulice – veď často nie je dôležitá kvalita a relevantnosť tovaru, ale dopravná dostupnosť miesta, chodiaci ľudia si často kúpia niečo, čo na druhý deň vyhodia, len v záujme procesu. Ide o ochorenie, ktoré už dávno pozná každý – závislosť na nakupovaní. Alebo jednoducho zvýšenie toku zvyšuje pravdepodobnosť správneho kupujúceho.

A plusy a mínusy... - to je len akési „poďakovanie“ za strávený čas a prácu


Tie. Počíta sa aj mínus ako „ďakujem“? Chcel som vedieť váš názor na to, či by sa to malo používať v takýchto prípadoch a ako zaujímavé si myslia iní? Mali by ste to uviesť, keď je článok škodlivý/zlý alebo keď je pre vás jednoducho zbytočný/prázdny?
Podľa môjho názoru článok vyzerá ako jednoduché zvýšenie hodnotenia, pretože:
1. Problém s typmi, ktoré som uviedol, autor úplne ignoroval, hoci nebol lenivý napísať kopu komentárov.
2. V článku je evidentná nepresnosť: vraj je to jediná cesta

V82 = Nový COMObject("V82.ComConnector"); Kód = AccountCOM.Code;


ale môžem to ľahko urobiť pomocou spracovania takto:

Správa (Základňa. Adresáre. Protistrany. Nájsť podľa názvu("LLC"). Kód);


a všetko je v poriadku! A volím pripojenie V82.ComConnector
Je akosi zvláštne, že autorovi je úplne jedno, že jeho článok obsahuje problémy, na ktoré bolo poukázané, no nijako nereaguje.
3. Stále však existuje problém, keď sa objaví chyba „Trieda neexistuje“.
4. Ale je problém, keď je nainštalovaný 8.2 a potom 8.1 - skúste výmenu cez OLE/COM so štandardnou UT-BP výmenou!
5. Mohli by ste na stránke uviesť hlavné spracovanie, ktoré vám umožňuje univerzálne pripojenie cez OLE/COM, aby začiatočníci nestrácali čas, píšete za nich! Mimochodom, z nejakého dôvodu je jej obrázok na vašom displeji, prečo? A ako výsledok, 2 slová o podstate a 6 ďalších v zákulisí.

Vo všeobecnosti nehádžem blato, ale poukazujem na konkrétne medzery, ale reakcia je nulová. Ak je to skúsenosť, o ktorú sa delíte, potom je nejakým spôsobom chybná a neúplná.
Ide mi o to, že ak by mal autor túžbu zhromaždiť všetky chyby, mohol by aspoň počúvať skúsenosti iných ľudí a netrieštiť komentáre. Okamžite nastáva situácia, keď ten, kto to čítal, vie viac ako autor, povedia mu to (niekedy nesprávne) a on sa tiež bráni. Výsledkom je, že všetky informácie nie sú v článku, ale v komentároch! Vtipné! To sa často stáva, ale nemusíte sa sústrediť na skutočnosť, že ste chceli to najlepšie – ja ukážem, čo je najlepšie, a ostatní to ukážu! Zahrňte to do článku a bude to stáť za to, nie každý má záujem čítať túto šarvátku.

Jedným zo spôsobov prenosu údajov z jednej konfigurácie 1C do druhej je softvérové ​​pripojenie pomocou COM. Mnoho spoločností používa niekoľko rôznych databáz, medzi ktorými musia existovať určité prepojenia a závislosti. Ak je potrebné nielen prenášať údaje, ale aj vykonávať určité spracovanie údajov, potom bude optimálnym mechanizmom pripojenie COM. Schopnosť analyzovať údaje z inej databázy 1C je užitočná pre každého vývojára.

Pripojíme sa cez COM k databáze 1C

Na implementáciu pripojenia COM v 1C sa používa špeciálny mechanizmus nazývaný COMConnector. Tento objekt je inštalovaný spolu s platformou a slúži na komunikáciu informačné základne. Treba poznamenať, že pre verzie 8.2 a 8.3 sa používajú objekty s rôznymi názvami - „V82.COMConnector“ a „V83.COMConnector“.

Pamätajte, že trvanie pripojenia COM k databáze stojí licenciu - nenechajte sa uniesť súčasným vykonávaním niekoľkých pripojení. Toto je obzvlášť dôležité pre organizácie, ktoré majú obmedzený počet licencií. Tento problém je možné vyriešiť pomocou rutinné úlohy spustenie, keď neexistujú žiadne aktívne pripojenia používateľov k informačnej základni.

Aby ste sa mohli pripojiť k inej databáze a vyžiadať si potrebné informácie, musíte poznať nasledujúce údaje:

  1. Aký je to typ - súbor alebo klient-server;
  2. Kde sa to nachádza;
  3. Aké meno a heslo môžete použiť na prihlásenie?
  4. O aké údaje máte záujem?

Z prvých troch bodov na implementáciu pripojenia COM musíte vytvoriť reťazec parametrov. V závislosti od typu informačnej bezpečnosti sa bude líšiť vzhľad. Pomocou prijatého reťazca sa vytvorí spojenie, pomocou ktorého môžete zbierať údaje z inej databázy na analýzu a spracovanie pomocou akýchkoľvek metód.

Connection ParametersFileIB = "Súbor=""Cesta_k_databáze""; Usr=""Meno_používateľa"";Pwd=""Heslo"""; Connection ParametersClientServerIB = "Srvr=""Názov_servera""; Ref=""Názov_databázy""; Usr=""Meno_používateľa""; Pwd=""Heslo""";

Funkcia pripojenia je jednoduchá a nemala by vyvolávať žiadne otázky, ak sú všetky parametre správne špecifikované. Na urýchlenie ladenia a analýzy možné chyby zapojenie je lepšie uzavrieť do konštrukcie „Vyskúšať“. Funkcia vráti hodnotu typu „COM objekt“, s ktorou budete pracovať na získavaní potrebných údajov.

&OnServer Function ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nový COMObject("V83.COMConnector"); Pokus o návrat V83COMCon.Connect(IB Connection Parameters); Správa o výnimke (ErrorDescription()); Return Undefined; EndPokus; EndFunction

Prostredníctvom COM pripojenia môžete dáta nielen vyberať, ale aj pridávať do databázy, ku ktorej sa pripájate. Pamätajte, že cez objekt COM môžeme preniesť 4 primitívne dátové typy. Ostatné typy bude potrebné špecifikovať pomocou vstavaných vyhľadávacích funkcií platformy. Upozorňujeme, že funkcie globálnej platformy sa volajú aj cez pripojenie COM.

Údaje dostávame z databázy 1C

Po prijatí požadovaného objektu musíte načítať údaje z inej databázy. Na tento účel používame požiadavku cez pripojenie COM v 1C 8.3 pomocou prijatej hodnoty typu „COM object“ z funkcie. Dôležité je najprv sa pripojiť k databáze a až potom vykonať požiadavku. Vykonanie prebieha prostredníctvom metódy NewObject, špecifikujúc typ objektu vo forme reťazca ako parameter – „Request“.

&Procedúra na serveri TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "SELECT prvých 15 | DirectoryUser.Name AS Name |FROM | Directory.users AS DirectoryUser"; Select = RequestBPZO.Execute().select(); Kým Selection.next() cyklus Report(Výber.Číslo); EndCycle; koniec Ak; Koniec procedúry >

Napríklad pre získanie informácií o používateľoch určitého oddelenia nastavíme v požiadavke podmienku cez parametre. Jeden parameter bude jednoduchého typu – reťazec a rozdelenie bude odkazom na adresárový prvok „Enterprise Structure“. Výsledkom dotazu je tabuľka s vypísanými poliami typu, ktoré existujú v databáze, ku ktorej došlo k pripojeniu COM. Ak ich potrebujete previesť na iné typy, použite štandardné funkcie platformy:

  • Riadok();
  • Číslo();
  • Dátum().
RequestBPZO = Connection.NewObject("Požiadavka"); RequestBPZO.Text = "VYBERTE prvých 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | A DirectoryUser.Name ako ""%"" + &RequiredName+ ""%""" ; Vyžiadať BPZO.SetParameter("Požadované oddelenie", Pripojenie. Adresáre. Podniková štruktúra. Nájsť podľa kódu("00-000023")); RequestBPZO.SetParameter("Povinné meno","Ekaterina"); Select = RequestBPZO.Execute().select(); Kým Selection.next() slučka Report(Selection.Name); EndCycle;

Ak potrebujete preniesť pole do databázy na výber na základe niekoľkých parametrov, napríklad oddelení, použije sa aj príkaz NewObject. Podobne môžete odovzdať zoznam alebo tabuľku hodnôt a naplniť ich prvkami inej databázy prostredníctvom pripojenia. Všetky existujúce metódy objektov a mechanizmov platformy sú vám k dispozícii na vyhľadávanie.

RequestBPZO = Connection.NewObject.("Požiadavka"); RequestBPZO.Text = "VYBERTE prvých 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | A DirectoryUser.Name ako ""%"" + &NecessaryName+ ""%" " "; Pole oddelení = Connection.NewObject("Pole"); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); Vyžiadať BPZO.SetParameter("Požadované oddelenie", Pole oddelení); RequestBPZO.SetParameter("Povinné meno","Ekaterina"); Select = RequestBPZO.Execute().select(); Kým Selection.next() slučka Report(Selection.Name); EndCycle;

Pri prenose dokumentov alebo adresárových prvkov vždy vyvstáva otázka kontroly prenosu konkrétneho objektu. Pomocou pripojení COM je možné takéto problémy vyriešiť pomocou jedinečného identifikátora. V databáze zásuvných modulov musíte nájsť objekt podľa identifikátora z aktuálnej informačnej bezpečnosti pomocou funkcie „GetLink“ s použitím identifikátora ako reťazca. Ak sa nenájde, môžete ho vytvoriť pomocou pripojenia COM.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Ak NIE JE ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))), potom NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Name; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Jednotlivec; NewUser.Write(); koniec Ak;

Pripojenie COM má tiež právo používať postupy a funkcie z bežných modulov 1C s povolenou vlastnosťou „Externé pripojenie“. Okrem tejto podmienky musí byť volaná funkcia alebo procedúra exportovaná a nesmie zahŕňať interaktívne akcie vykonávané na serveri. V opačnom prípade sa zobrazí chyba o neplatnosti operácie.

zlúčenina...; VariableFunction = Pripojenie..; volanie funkcie> všeobecný názov modulu> volanie procedúry> všeobecný názov modulu>

Možnosti externého prepojenia s inou databázou v 1C sú pomerne rozsiahle a umožňujú vykonávať mnoho úloh. Dôležité je vedieť správne vyhodnotiť nástroje a vybrať si optimálne riešenie. Vo väčšine prípadov sa táto zručnosť objavuje iba so skúsenosťami alebo štúdiom príkladov práce skúsených odborníkov.