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 základov, 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 nainštalovaný 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 rôznych názvov - "V82.COMConnector" a "V83.COMConnector".

Pamätajte, že licencia sa minie počas trvania pripojenia COM k databáze - nemali by ste sa nechať uniesť vytváraním niekoľkých pripojení súčasne. 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 ktoré sa vykonajú, keď neexistujú žiadne aktívne pripojenia používateľov k informačnej databáze.

Aby ste sa mohli pripojiť k inej databáze a požiadať 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. Pod akým menom a heslom ho môžete zadať;
  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 ZS 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 akýmikoľvek metódami.

ConnectionParametersFileIB = "Súbor=""Cesta_k_základni""; Usr=""Meno_používateľa"";Pwd=""Heslo"""; ConnectionParametersClientServerIB = "Srvr=""Názov_servera""; Ref=""Názov_základne""; Usr=""Meno_používateľa""; Pwd=""Heslo""";

Funkcia pripojenia je jednoduchá a nemala by vyvolávať otázky, ak sú všetky parametre správne. Na urýchlenie ladenia a analýzy možné chyby je lepšie uzavrieť spojenie do konštrukcie Pokus. Funkcia vráti hodnotu typu "COM objekt", s ktorou budete musieť pracovať a získať potrebné údaje.

&AtServer Funkcia ConnectToBase() export ConnectionParametersIB = "File=""E:\base 1c\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nový COMObject("V83.COMConnector"); Pokus o návrat V83COMCon.Connect(ConnectionParametersIB); Správa o výnimke (ErrorDescription()); Return Undefined; Koniec pokusu; EndFunctions

Prostredníctvom pripojenia COM môžete údaje 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 budú musieť byť špecifikované pomocou vyhľadávacích funkcií zabudovaných do platformy. Vezmite prosím na vedomie, že globálne funkcie platformy sa volajú aj cez spojenie 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 aplikujeme požiadavku cez COM pripojenie v 1C 8.3 pomocou prijatej hodnoty typu "COM object" z funkcie. Je dôležité najprv sa pripojiť k databáze a potom vykonať dotaz. Vykonanie prebieha pomocou metódy NewObject s uvedením typu objektu v reťazcovom tvare - "Request" ako parameter.

&Procedúra na serveri TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then QueryBPO = Connection.NewObject("Query"); Dotaz BPZO.Text = "VYBERTE prvých 15 | Adresár užívateľov. Názov AS Názov | FROM | Adresár užívateľov AS Adresár užívateľov"; Výber = QueryBPO.Run().select(); Kým Sample.next() loop Report(Selection.Number); EndCycle; Koniec Ak; Koniec procedúry >

Napríklad na získanie informácií o používateľoch určitého oddelenia nastavíme v požiadavke podmienku prostredníctvom parametrov. Jeden parameter bude jednoduchého typu – reťazec a oddelenie – odkaz na prvok adresára „Enterprise Structure“. Výsledkom dotazu je tabuľka s vymenovanými poľami 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().
RequestBPO = Connection.NewObject("Požiadavka"); QueryBPO.Text = "VYBRAŤ prvých 15 | Užívateľský adresár.Názov AS Názov |FROM | Adresár.Používatelia AS Adresár užívateľov I KDE | Adresár užívateľov.Oddelenie = &PožadovanéOddelenie | A UžívateľskýAdresár.Názov ako ""%"" + &PožadovanéMeno+ ""%" "" ; BPZO Request.SetParameter("Desired Department", Connection.Directories.Enterprise Structure.FindByCode("00-000023")); RequestBPO.SetParameter("Povinné meno","Ekaterina"); Výber = QueryBPO.Run().select(); Kým Selection.next() slučka Report(Selection.Name); EndCycle;

Ak potrebujete preniesť pole do databázy na výber podľa viacerých parametrov, napríklad delenia, 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 sú k dispozícii na vyhľadávanie. existujúce metódy objekty a mechanizmy platformy.

RequestBPO = Connection.NewObject.("Požiadavka"); QueryBPO.Text = "VYBRAŤ prvých 15 | Názov adresára používateľa AS Názov | FROM | Adresár.Používatelia AKO Adresár používateľa I KDE | Adresár používateľa.Oddelenie v (&DesiredDepartment) | A UserDirectory.Názov ako ""%"" + &DesiredName+ "" %" ""; Subdivisions Array = Connection.NewObject("Array"); Departments array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000023")); Departments array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000038")); Departments array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000046")); Dopyt BPZO.SetParameter("Požadovaná podoblasť", Pole podoblastí); RequestBPO.SetParameter("Povinné meno","Ekaterina"); Výber = QueryBPO.Run().select(); Kým Selection.next() slučka Report(Selection.Name); EndCycle;

Pri prenose dokumentov alebo prvkov adresárov vždy vyvstáva otázka kontroly prenosu konkrétneho objektu. S pripojeniami COM môžete takéto problémy vyriešiť pomocou jedinečného identifikátora. V zásuvnej databáze musíte nájsť objekt podľa identifikátora z aktuálneho IB pomocou funkcie „GetLink“ s použitím identifikátora ako reťazca. Ak neexistuje, môžete ho vytvoriť pomocou pripojenia COM.

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

Taktiež pripojenie COM má právo používať procedúry a funkcie z bežných modulov 1C so zapnutou vlastnosťou "Externé pripojenie". Okrem tejto podmienky musí byť volaná funkcia alebo procedúra funkciou exportu a nesmie zahŕňať interaktívne akcie vykonávané na serveri. V opačnom prípade sa zobrazí chyba o neplatnej operácii.

zlúčenina...; VariableFromFunction = Pripojenie..; volanie funkcie>bežný názov modulu>volanie procedúry>bežný názov modulu>

Možnosti externého prepojenia s inou databázou v 1C sú pomerne rozsiahle a môžu vám umožniť vykonávať mnoho úloh. Dôležité je vedieť správne vyhodnotiť nástroje a zvoliť najlepšie 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.

) To je správne

Zároveň som neraz videl, keď sa jednoducho „rozbehli“ publikácie, ktoré neutiahnu ani 10 bodov.
Prečo sa to stalo? Asi preto, že sa niekomu evidentne páčili.


Hovorím o tom a hovorím, že by bolo pekné nečítať článok podľa hodnotenia, aby ste pochopili, ako veľmi ho potrebujete, alebo ho hodnotiť nie tak primitívne +/-. Pokiaľ ide o to, čo sa mi páčilo, opravil by som to takto: zabodovala vďaka tomu, že hviezdy sa formovali takýmto spôsobom a na stránke sa zišlo veľa ľudí a mnohým sa to páčilo, sami chápete, že ide o vec náhody. 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 na podporu na hlavnej stránke, pokiaľ som pochopil, umožňujú len neustále komentáre = propagácia článku.
Práve kvôli tomu umiestňujú obchody do ulíc – veď často nie je dôležitá kvalita a relevantnosť produktu, ale priechodnosť miesta, chodiaci ľudia často kupujú to, čo na druhý deň vyhodia, len kvôli procesu. Ide o známu chorobu – shopomániu. Alebo jednoducho zvýšenie toku zvyšuje pravdepodobnosť správneho kupujúceho.

A plusy a mínusy ... sú len akýmsi „ďakovaním“ za strávený čas a prácu


Tie. Počíta sa aj mínus ako „ďakujem“? Chcel som teda vedieť, aký je váš postoj k tomu, či je to potrebné dávať do takýchto prípadov a ako zaujímavé si myslia ostatní? Či to dať, 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á len ako zvýšenie hodnotenia, pretože:
1. Problém s typmi, ktoré som uviedol, autor vo všeobecnosti ignoroval, hoci nebol lenivý napísať kopu komentárov.
2. V článku je jasná nepresnosť: vraj je to jediná cesta

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


ale pokojne to robím pomocou spracovania takto:

Upozorniť(Základ.Adresáre.Protistrany.Nájsť podľa mena("LLC").Kód);


a všetko je v poriadku! A volím pripojenie V82.ComConnector
Je akosi zvláštne, že autora vôbec nezaujíma, že jeho článok obsahuje také 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 vymeniť cez OLE / COM s typickou UT-BP výmenou!
5. Mohli by ste uviesť hlavné spracovanie na stránke, ktoré vám umožňuje univerzálne pripojenie cez OLE / COM, aby začiatočníci nestrácali čas, píšte pre nich! Mimochodom, z nejakého dôvodu sa s vami jej obrázok vychvaľuje, prečo by?. A ako výsledok, 2 slová o podstate a 6 ďalších v zákulisí.

Vo všeobecnosti na vás nehádžem blato, ale poukazujem na konkrétne medzery, ale bez reakcie. Ak je to skúsenosť, ktorú zdieľate, potom je nejakým spôsobom chybná a neúplná.
Chcem tým povedať, že ak mal autor túžbu zhromaždiť všetky chyby, mohol by si aspoň vypočuť skúsenosti niekoho iného 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é! Často sa to stáva, ale zároveň sa nemusíte spoliehať na to, čo ste chceli najlepšie - ja ukazujem, ako je to lepšie, a iní to ukazujú! Zahrňte to do článku a bude to stáť za to, nie každý má záujem čítať túto šarvátku.

Ahoj Khabravchans!

V tomto článku chcem hovoriť o tom, ako sa v mojej organizácii vytvára integrácia s platformou 1C. Donútil ma to urobiť prakticky úplná absencia technická informácia na túto tému. 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 majú marketingový, demonštračný charakter a nikdy nie technické, odrážajú problém a podstatu jeho riešenia.

Upozorňujem vás, že 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.


Ako jazyk, ktorý sa bude integrovať s 1C, som si vybral Python. Veľmi dobre sa hodí na automatizáciu procesov. To je uľahčené minimalistickou syntaxou (kód je napísaný veľmi rýchlo), bohatou štandardnou knižnicou (menšia potreba modulov tretích strán), multiplatformovým – s vysokou pravdepodobnosťou bude kód napísaný v OS Linix úspešne fungovať v Windows.

Na začiatok načrtnem údaje, s ktorými budeme pracovať. Organizácia - spoločnosť dodávajúca energiu v regióne Ďalekého východu - obsluhuje približne 400 tisíc predplatiteľov, základom je 1C na samostatne napísanej konfigurácii. Pre každého účastníka sa ukladajú jeho platby, časové rozlíšenie, spotrebované služby a výpočtové schémy, meracie zariadenia, odpočty a mnohé ďalšie údaje.

Raz v organizácii bol program napísaný v Delphi a ako databázu používal MSSQL / Firebird. V tých slávnych časoch bolo možné pripojiť sa k databáze pomocou ľubovoľného jazyka a vykonávať množstvo akcií - výber dlžných predplatiteľov, účtovanie prijatých platieb, zaznamenávanie odpočtov prístrojov. Niet divu, ž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 je slabo integrovaná s inými systémami. Je to, ako sa hovorí, vec sama o sebe. Pri načítavaní údajov do 1C treba pamätať na to, že ich odtiaľ nebude také ľahké extrahovať. Ale vzhľadom na skutočnosť, že organizácia bola povinná zaviesť platobné systémy a Osobná oblasť, bolo treba nájsť riešenie.

Hlavnými úlohami, ktorým som čelil, bola schopnosť rýchlo získať údaje o konkrétnom osobný účet- Celé meno, adresa, meracie zariadenia, údaje z prístrojov, platby, poplatky. Navyše, tvorba dokumentov - akt zmierenia, potvrdenie o platbe. Neexistuje teda možnosť priameho pripojenia k databáze - každý, kto si prezrel databázu 1C na serveri SQL, videl, že je ťažké to zistiť v množstve tabuliek ako aaa1, aaa2. A vytvárať dopyty s takýmito názvami tabuliek a polí je jednoducho nereálne. Okrem toho je veľa stolov 1C (najmä tie najdôležitejšie, ako je strih posledného, ​​zostatky a otáčky) virtuálnych a sú roztrúsené po rôznych fyzických stoloch a zhromažďujú sa vo viacerých spojeniach. 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 môžete 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 navyše existuje 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, ako aj funkcie a metódy súvisiace s rozhraním a vizuálne efekty. Samotná aplikácia sa spustí v režime „Externé pripojenie“. Inicializáciu globálnych premenných (napríklad určenie aktuálneho používateľa a jeho nastavení) je potrebné vykonať v module externého pripojenia 1C. Ak sa v režime vonkajšieho pripojenia zavolá v kóde funkcia, ktorá nie je v tomto režime dostupná, vyvolá sa výnimka (ktorá sa odovzdá nášmu python skriptu). Volania nebezpečných funkcií by mali byť orámované konštrukciami formulára

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

Keďže práca s objektmi COM je technológiou iba pre okná, 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 už zostavený exe inštalátor. Samotné rozšírenie poskytuje prístup k registrom, službám, objektom ODBC, COM atď. Prípadne si môžete ihneď nainštalovať distribúciu ActiveState Python, v ktorej je rozšírenie Win32 z krabice.

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ámym mínusom 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 spôsobí načítanie každej stránky za 8 sekúnd.
- Keďže webové aplikácie pythonu 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. Ako udržať spojenie v PHP, úprimne povedané, ešte som si nemyslel.
- Stratená multiplatformová webová aplikácia.

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 (Windows), ukladanie údajov 1C do akéhokoľvek vhodného formátu a druhú, nezávislú od platformy, ktorá je schopná pracovať s údajmi bez toho, aby ste mali v princípe čokoľvek o 1C.

Akčná stratégia je nasledovná: python skript sa pripojí k 1C, vykoná sa správne otázky a odošle údaje do databázy SQLite. K tejto databáze sa môžete pripojiť z Pythonu, PHP, Java. Väčšina našich projektov je v pythone a keďže neznášam ručné písanie nespracovaných SQL dotazov, všetka práca s databázou SQLite prebieha cez SQLAlchemy ORM. Štruktúru údajov databázy bolo potrebné opísať iba deklaratívnym štýlom:

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čí tento modul naimportovať do akéhokoľvek python projektu a môžete s dátami pracovať.

Predvídam vašu otázku - "prečo SQLite"? hlavný dôvod- databáza je potrebná len na čítanie, takže by sme sa nemali obávať problémov so zápisom na SQLite. 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 z tých strojov, na ktorých nie je pripojenie k serveru MySQL. V tomto prípade stačí skopírovať databázový súbor SQLite a na tomto stroji budete 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 vykonáme dokument „Zákon o prijímaní svedectiev“. Nižšie uvediem kód.

Práca s objektmi COM v Pythone je trochu nezvyčajná. Po prvé, „pytonicita“ kódu sa stráca - pravidlá pre pomenovanie premenných a funkcií v 1C, mierne povedané, nezodpovedajú Zen of Python. Po druhé, každý vie, že objekty 1C sa často nazývajú znaky cyriliky, čo spôsobí problémy pri vývoji v Pythone ... ale sú riešiteľné. 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 vidíte 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 zavoláme metódu Connect() a odovzdáme jej 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é. Na odpojenie od základne stačí odstrániť objekt z pamäte funkciou del () alebo priradiť premennú 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, TableValues ​​atď. Je dôležité poznamenať, že pri práci cez pripojenie COM pracuje 1C v režime „Externé pripojenie“. Neobsahuje žiadne funkcie pre interaktívnu prácu, ako sú kontextové dialógové okná, upozornenia a hlavne formuláre. Určite budete viackrát preklínať vývojárov konfigurácie, že najdôležitejšiu funkcionalitu zabalili do procedúry Button1Press() v module formulára dokumentu.

Poďme sa baviť o takej dôležitej veci, akou sú atribúty azbuky. Napriek tomu, že 1C je bilingválne prostredie a pre každú ruskú metódu existuje anglický ekvivalent, skôr či neskôr sa budete musieť obrátiť na atribút cyrilika. Ak je zapnuté PHP jazyky alebo VBSCript to nespôsobí žiadne problémy,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Reťazec pripojenia") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... ..... AccountsWrite.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 názvu atribútu v cyrilike 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 atribútov, ako aj parametre funkcií a metód musia byť odovzdané v kódovaní cp1251. Preto, aby sa predišlo zmätkom v kódovaní vopred, má zmysel deklarovať to na začiatku súboru: #coding=cp1251. Potom môžete reťazce odovzdávať bez obáv o ich kódovanie. Ale! Všetky reťazce prijaté z 1C (výsledky volaní funkcií, požiadavky) budú zakódované v UTF-8.

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

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS code, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS address, PersonalAccounts.Subscriber.Meno AS fio, PersonalAccounts.Division.Name AS psu, EXPRESS(CharakteristikaOsobnéÚčtySlicePosledná.Hodnota AS Adresár.Územné mriežkovéOrganizácie).Názov AS tso, Osobné účty.Budova.Vyrovnanie.Názov AS np,OsobnéÚčty.Budova.Ulica.Názov domu AS ulica,Osobný.Byt.ÚčtyAc Dression. Retor. Meno ako mro z príručky. Málo dôkazov ako tvárový popis ľavého spojenia regestov. Charakteristika signalizácie. Vášnivý (, vidcharakteristika = hodnota (referenčná kniha. Vidcharakteristická organizácia)) ako charakteristiky sledovače. = V82.NewObject( "Dopyt", q) výber = dotaz.Vykonať().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = výber.kód.strip() abonent.kód = výber.kód abonent.fio = výber.fio abonent.adresa = výber.adresa abonent.psu = výber.psu abonent.tso = výber.tso abonent.zdroj = u"ASRN" abonent.np = výber.np abonent.ulica = výber.ulica 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, 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í dotazu sa z databázy vymažú všetci odberatelia, aby sa nepridávali duplikáty, potom sa pridávajú v cykle a nasleduje záverečné odovzdanie.

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

Pri výbere polí im dajte latinské názvy, bude oveľa pohodlnejšie pristupovať k nim cez selektor (bodka), namiesto getattr().
- Vyberte len primitívne dátové typy: reťazce, čísla, dátumy a booleany. Nikdy nevyberajte odkazy na objekt (dokument, adresár)! V tomto kontexte absolútne nepotrebujete referencie a dokonca škodíte, pretože akýkoľvek prístup k atribútu alebo metóde referencie bude mať za následok požiadavku cez COM spojenie. Ak pristupujete k atribútom odkazu v slučke, bude to extrémne pomalé.
- Ak vyberiete pole Dátum, vráti sa ako objekt PyTime. Toto je špeciálny typ údajov na odovzdávanie dátumu a času pri pripojení COM. Nepracuje sa s ním tak pohodlne ako s bežným dátumom a časom. Ak tento objekt odošlete int(), vráti sa časová značka, 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ľovi je potrebné poskytnúť možnosť stiahnuť si vopred pripravené dokumenty, napríklad potvrdenie o platbe alebo doklad 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 excelový formát.

Dokument o zosúlaďovaní 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á vlastný modul, formuláre, šablóny, určené na spustenie v prostredí 1C. Je potrebné inicializovať spracovanie, vyplniť jeho údaje a zavolať funkciu, ktorá sa 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 zapísaný do databázy.

Odkaz = getattr(V82.Catalogs, "SystemReports").FindByDescription("Elen's Verification Act") nav_url = V82.GetURL(link, "Report") name = 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ý úryvok robí nasledovné. Spracovanie, ktoré tvorí 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 „ReportsSystem“ v atribúte typu „value storage“ s názvom Report. Spracovanie je možné inicializovať jeho vyložením z databázy na disk a načítaním, alebo metódou GetURL(), do ktorej je potrebné odovzdať odkaz na element adresára a názov atribútu. Výslednému objektu spracovania priradíme hodnoty atribútov, zavoláme exportovanú funkciu GetDoc() a získame 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 je potrebné zadať údaje od predplatiteľov. Na tento účel stačí vytvoriť a vykonať dokument „Zákon o vykonaní dôkazov“:

#coding=cp1251 acts = getattr(V82.Documents, "Act of Abing Svedects") act = Acts.CreateDocument() setattr(act, "Indication", 1024.23) setattr(act, "Predscribed", "Ivanov") # Filling v ďalších podrobnostiach...konaj.Napíš()
Teraz je zadávanie údajov automatizované.

Takže som načrtol 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. Základňa vytvorená z 1C slúži 3 platobným systémom, získavaniu internetu (platba kartami cez internet), ako aj osobnému účtu. Okrem toho je databáza prepojená rôzne skripty pre rutinnú automatizáciu.

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 uviesť čo najviac podrobností o procese, aby som vás ušetril nástrah, 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 je namaľované!

Tlačiť (Ctrl+P)

Jednou z možností výmeny údajov 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ódu môžete použiť vo verziách databáz klient-server aj v súborových databázach. Tento článok pojednáva o tomto druhu pripojení na platforme 8.3

com spojenie

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

Vytvorte pripojenie OLE

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

Vytvorte pripojenie COM

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

Spojovací reťazec

//Pre možnosť klient-server
StringConnection= “Srvr = “ “Názov servera” “;Ref = “ “Názov základne” ;
//Pre možnosť režimu súborov:
StringConnection= "Súbor = " "PathBase" “; 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" + DescriptionError(); Správa . Ohlásiť();
EndTry ;

Prerušenie spojenia

Pripojenie = Nedefinované ;
Pre objekt V83.Aplikácia je povinné odpojiť pripojenie, inak zostane nedokončená relácia visieť, ktorá sa potom bude musieť odstrániť ručne. V prípade Konektor V83.COM spojenie sa automaticky ukončí na konci procedúry, v ktorej bolo spojenie vytvorené A je tu ešte jeden malý moment. Pre používateľa, pod ktorým sa vytvára spojenie, musí byť v jeho nastaveniach vypnuté zaškrtávacie políčko „Požiadať o 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") ;

WidCOM = Connection.NewObject

pre V83.Aplikácia

QueryOLE = Pripojenie. NewObject(“ Žiadosť ") ;
TableOLE = pripojenie. NewObject("Tabuľka hodnôt") ;
ArrayOLE = Connection.NewObject(„Pole“ );
WidCOM = 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ícieOrganizácie
AS pozície organizácií”;

Výsledok = ŽiadosťCOM. Vykonať ();
Ukážka = výsledok. Vyberte ();
Zatiaľ čo výber. Ďalšie()Cyklus
EndCycle ;
Môžete tiež použiť správcov konfiguračných objektov:
DirectoryCOM = pripojenie. Referenčná literatúra. DirectoryName;
DocumentCOM = Pripojenie. Dokumenty. Názov dokumentu;
RegisterCOM = pripojenie. Informácie o registroch. RegisterName ;

Získanie a porovnanie enum cez pripojenie COM

Na 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 nespôsobuje ťažkosti. Tieto typy môžu byť buď číselného typu, alebo typu reťazca. Hodnotu prvku enumerácie môžete previesť na číselný typ, ako je tento

Enum prvok = Connection.Directories.Directory1.FindByCode(1).Atribút1;

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

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

Ak EnumItemNumber = 0, potom nahlásiť ( "EnumValue1");

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

Koniec Ak;

Získanie objektu cez COM podľa ID

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

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

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

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

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

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

Jednou z možností výmeny údajov 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ódu môžete použiť vo verziách databáz klient-server aj v súborových databázach. V tomto článku budeme analyzovať príklady takýchto zlúčenín. Príklady využívajú platformu 8.2.

Pre aplikáciu 1C môžete vytvoriť dva typy objektov COM. to V82.Aplikácia a Konektor V82.COM. V prípade V82.Aplikácia je spustená takmer plnohodnotná kópia aplikácie 1C. v prípade použitia Konektor V82.COM spustí sa malá časť servera.
Rýchlosť práce je v tomto prípade vyššia, ale niektoré funkcie nemusia byť dostupné. Najmä práca s formulármi a s bežnými modulmi, pre ktoré nie je nastavená vlastnosť práce s externými pripojeniami. Mali by ste použiť hlavne Konektor V82.COM a to len v prípade nedostatočnej funkčnosti V82.Aplikácia. Rozdiel v rýchlosti môže byť badateľný najmä na veľký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. Vytvorenie pripojenia k databáze Pokus o pripojenie = pripojenie. Connect(ConnectionString) ; Výnimka Message = New MessageToUser; Správa. Text = + PopisChyby() ; Správa. Ohlásiť() ; EndTry ;
  4. Odpojenie od základne Pripojenie = Nedefinované ;

    Pre objekt V82.Aplikácia je povinné odpojiť pripojenie, inak zostane nedokončená relácia visieť, ktorá sa potom bude musieť odstrániť ručne. V prípade Konektor V82.COM spojenie sa automaticky ukončí na konci procedúry, v ktorej bolo spojenie vytvorené A je tu ešte jeden malý moment.

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

A teraz dáme celý kód dokopy

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

Pre typ pripojenia V82.Aplikácia metóda sa aplikuje na 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 ide š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 | Pozície organizácií AS Pozície organizácií "; Výsledok = požiadavka. Vykonať (); Ukážka = výsledok. Vyber() ; Zatiaľ čo výber. Next() Cycle EndCycle ;

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