1c csatlakozzon a meglévő com-kapcsolathoz. Három bálna a COM-objektumokkal való munkavégzésről

1c csatlakozzon a meglévő com-kapcsolathoz. Három bálna a COM-objektumokkal való munkavégzésről

Az 1C adatbázisok közötti adatcsere egyik lehetősége a COM-kapcsolaton keresztüli adatcsere.

COM kapcsolat segítségével csatlakozhat egyik 1C adatbázishoz a másikhoz, és adatokat olvashat vagy írhat. Ezt a módszert az adatbázisok kliens-szerver változataiban és azokban is használhatja fájl adatbázisok. Ebben a cikkben az ilyen vegyületek példáit elemezzük. A példák a 8.2-es platformot használják.

Kétféle COM objektumot hozhat létre az 1C alkalmazáshoz. Ez V82.AlkalmazásÉs V82.COMConnector. Esetében V82.Alkalmazás elindul az 1C alkalmazás szinte teljes példánya. használat esetén V82.COMConnector egy kis szerverrész elindul.
A munka sebessége ebben az esetben nagyobb, de előfordulhat, hogy egyes funkciók nem érhetők el. Különösen olyan űrlapokkal és közös modulokkal való munkavégzés, amelyeknél nincs beállítva a külső kapcsolatokkal való munka tulajdonsága. Főleg használni kell V82.COMConnectorés csak a funkcionalitás hiánya esetén V82.Alkalmazás. A sebességkülönbség különösen nagy adatbázisokon lehet észrevehető.

Tehát kezdjük

  1. Hozzunk létre egy COM objektumot
    • Mert V82.Alkalmazás Kapcsolat = New COMObject("V82.Application" ) ;
    • Mert V82.COMConnector Kapcsolat = Új COMObject("V82.COMConnector" ) ;
  2. Hozzunk létre egy kapcsolati karakterláncot
    • az adatbázis szerververziójához ConnectionString = "Srvr = " "Kiszolgálónév" ";Ref = " "Alapnév" ;
    • az adatbázis fájlverziójához ConnectionString = "File = " "PathKBase" "; Usr = Felhasználónév; Pwd = Jelszó";
  3. Kapcsolat létrehozása az adatbázissal Kapcsolódási kísérlet = Kapcsolat. Connect(ConnectionString) ; Kivétel üzenet = New MessageToUser; Üzenet. Szöveg = + DescriptionErrors() ; Üzenet. Jelenteni() ; EndTry ;
  4. Leválasztás az alapról Kapcsolat = Undefined ;

    Tárgyhoz V82.Alkalmazás kötelező megszakítani a kapcsolatot, különben egy nem teljes munkamenet függőben marad, amit ezután manuálisan kell törölni. Esetében V82.COMConnector a kapcsolat automatikusan megszakad annak az eljárásnak a végén, amelyben a kapcsolat létrejött, és van még egy apró momentum.

    Annak a felhasználónak, akivel a kapcsolat létrejön, a beállításainál le kell tiltani a "Megerősítést kér a program bezárásakor" jelölőnégyzetet.

És most rakjuk össze az összes kódot

Kapcsolat = New COMObject("V82.Application" ) ; //Kapcsolat = Új COMObject("V82.COMConnector"); ConnectionString = "Srvr = ""Server1C"";Ref = ""Sajátbázis""; Usr = Péter; Pwd = 123" ; //ConnectionString = "Fájl = ""С:\MyBase""; Usr = Péter; Pwd = 123"; Kapcsolódási kísérlet = Kapcsolat. Connect(ConnectionString) ; Kivétel üzenet = New MessageToUser; Üzenet. Szöveg = "Nem lehet csatlakozni az adatbázishoz"+ DescriptionError() ; Üzenet. Jelenteni() ; EndTry ; Kapcsolat = Undefined ;

A csatlakozás típusához V82.Alkalmazás metódust alkalmazzák az eredetileg létrehozott COM objektumra, és a számára V82.COMConnector a módszert alkalmazzák a kapcsolatra. a további munka a kéréssel megy szabvány azt jelenti 1C. kódban így néz ki:

Kérelem = Kapcsolat. NewObject("Kérés") ; // Mert V82.COMConnector Kérelem = Kapcsolat. NewObject("Kérés") ; // Mert V82.Alkalmazás Kérés. Szöveg = "VÁLASZTÁS | Szervezetek pozíciói. Kód, | Szervezetek beosztásai Név| FROM | Címtár. Szervezetek pozíciói AS Szervezetek pozíciói "; Eredmény = Kérelem. Végrehajtás () ; Minta = Eredmény. Választ() ; Míg a kiválasztás. Következő() Ciklus EndCycle ;

Az 1C:Enterprise 8.3 verziónál minden változatlan marad, kivéve, hogy a COMObjects létrehozásakor használnia kell "V83.COMConnector" vagy V83.Alkalmazás.


Kulcsszavak: COM, kapcsolat, külső, OLE, Automatizálás, Csatlakozás, ComConnector, Srvr

Ha 1C:Enterprise 8.0 COM kapcsolatokat használ az adatok eléréséhez, a következő előnyökkel jár az Automation szerver használatához képest:

  1. Több gyors telepítés kapcsolatokat, mivel nincs szükség létrehozásra külön folyamat operációs rendszer, és minden művelet a hívási folyamaton belül történik;

  2. Gyorsabb hozzáférés az 1C:Enterprise objektumok tulajdonságaihoz és módszereihez, mivel a fellebbezés megszervezése nem igényli a folyamatok közötti kommunikáció megszervezését;
  3. Kevesebb operációs rendszer erőforrás-fogyasztás.

Általánosságban elmondható, hogy az 1C:Enterprise 8.0-val COM-kapcsolaton keresztül történő munkavégzés hasonló az 1C:Enterprise-vel való munkavégzéshez Automation szerver módban. A fő különbségek a következők:

  1. Automation szerver esetén egy teljes értékű 1C:Enterprise 8.0 alkalmazás indul, COM kapcsolat esetén pedig egy viszonylag kis méretű folyamaton belüli COM szerver.

  2. Ha COM-kapcsolaton keresztül dolgozik, ezek nem elérhetők funkcionalitásígy vagy úgy, hogy az 1C: Enterprise 8.0 felhasználói felület megszervezésével kapcsolatos;
  3. Nál nél munka COM-csatlakozások az 1C:Enterprise 8.0 konfigurációs alkalmazásmodul nem használatos. A COM-kapcsolattal végzett munka során a szerepét a külső csatlakozómodul játssza.

1.1 COM-kapcsolat létrehozása

Az 1C:Enterprise 8.0 adatokhoz való hozzáférés COM-kapcsolaton keresztül történő megszervezéséhez a következő műveletsort kell végrehajtani:

  1. létrejön egy COM objektum V8.COMConnector azonosítóval, melynek segítségével létrejön a kapcsolat;

  2. a korábban létrehozott V8.COMConnector objektum Connect metódusa hívódik meg. A Connect metódus egy hivatkozást ad vissza a COM kapcsolati objektumra az 1C:Enterprise 8.0 információs bázissal;
  3. a fogadott COM-kapcsolati objektumon keresztül hozzáférnek annak az infobázisnak a megengedett metódusaihoz, tulajdonságaihoz és objektumaihoz, amellyel a kapcsolat létrejön.

Fontos! A felhasználói felület hiánya miatt a COM-kapcsolatban nem minden objektum, valamint tulajdonságok és metódusok használhatók COM-kapcsolatban.

1C: Kívülről COM-kapcsolaton keresztül elérhető vállalati objektumok:

  1. Exportált változók és külső hivatkozási modul eljárások/funkciók

  2. Exportált változók és eljárások/függvények közös modulok
  3. Teljes modulok felvétele és kizárása a megosztott modul tulajdonságainak beállításával

  4. Közös modulok töredékeinek felvétele és kizárása az előfeldolgozóval
  5. Globális környezet 1C:Enterprise 8.0, kivéve az ügyfélalkalmazáshoz mereven társított objektumokat (TextDocument, SpreadsheetDocument, ...)

1.2 Külső csatlakozó modul

Mint már említettük, az alkalmazásmodul feladatait a COM-kapcsolaton keresztül végzett munka során a külső csatlakozási modul látja el. Ez a modul rendelkezhet az AtStartSystemWork() és az AtShutdownSystem() eseménykezelő eljárásokkal, amelyek a kapcsolat inicializálása és leállítása során végrehajtandó műveleteket tartalmazhatnak.

Eljárások, függvények és globális változók, amelyeket egy külső csatlakozási modulban határoztak meg kulcsszó Az export, mint egy alkalmazásmodul esetében, a globális kontextus részévé válik.

1.3 Általános modulok

A "Client", "Server" és "ExternalConnection" tulajdonságok bevezetésre kerültek a gyakori modulokhoz. Céljuk, hogy a konfigurációban meghatározzák a modulok használatát kliens-szerver verzióban és COM csatlakozási módban.

1.4 "V8.COMConnector" objektum

A V8.COMConnector COM objektum által megoldott egyetlen feladat a COM kapcsolat létrehozása az 1C:Enterprise 8.0 információs bázissal. A V8.COMConnector objektum egyetlen példányával korlátlan számú kapcsolat létesíthető. A V8.COMConnector objektum egyetlen Connect metódussal rendelkezik, amely a COM-kapcsolat létrehozására szolgál az 1C:Enterprise 8.0 információs bázissal.

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

Az IB kapcsolati karakterlánc Parameter=Érték formátumú töredékek lánca. A töredékeket ";" választja el egymástól. Ha az érték tartalmazza szóköz karakterek, akkor dupla idézőjelbe (") kell tenni.

Általános paraméterek:

usr - felhasználónév;
pwd - jelszó.

A következő paraméter van megadva a fájlváltozathoz:

Fájl - infobázis könyvtár.

A kliens-szerver verzióhoz a következő paraméterek vannak meghatározva:

Srvr - 1C:Vállalati kiszolgáló neve;
Ref - az információs bázis neve a szerveren.

A Connect metódus COM-kapcsolatot hoz létre az 1C:Enterprise 8.0 információs bázissal, és hivatkozást ad vissza a COM-kapcsolati objektumra.

// Létrejön egy összekötő objektum
V8 = Új COMObject("V8.COMConnector");
// COM-kapcsolati objektum létrehozása
Kapcsolat = V8.Connect("Fájl=""c:\InfoBases\Trade""; Usr =""Irgató"";")

1.5 "COM kapcsolat" objektum

COM-kapcsolatot biztosít az 1C:Enterprise információs bázissal teljes hozzáférés globális kontextusához (lásd: „Végrehajtási kontextus szoftver modul"). Ezért a COM-kapcsolat metódusai lehetnek: rendszerkonstansok, a konfigurátorban megadott objektumok értékei, amelyekhez kezelőkkel lehet hozzáférni (például konstansok, felsorolások, könyvtárak, dokumentumok, dokumentumnaplók, jelentések, feldolgozás, típustervek). jellemzők, tervek számlák, számítási típusú tervek, regiszterek), valamint a külső kapcsolati modulban az Export kulcsszóval deklarált változók.

Ezenkívül a COM-kapcsolatnak van egy további NewObject metódusa is, amellyel meghatározott típusú értékeket lehet létrehozni.

ts = Kapcsolat. NewObject("Értéktábla");

String metódus Lehetővé teszi az 1C:Enterprise értékek karakterlánc-megjelenítését.

Nézet = Connection.String(Data.UniqueIdentifier());

1.6. A COM-kapcsolattal való munkavégzés jellemzői

Automatizálásban és COM-kapcsolaton az IGAZ és FALSE értéke -1 (mínusz egy), illetve 0.

Lehetőség van COM-kapcsolatok készletének megszervezésére. Ugyanakkor több COM-kapcsolati objektum jön létre az 1C:Enterprise gazdagépen ADVANCE-ban, és még kevesebb időt vesz igénybe a kapcsolat létrehozása, mivel nincs szükség létrehozásra. új objektum.

Egy új Query Builder objektum került megvalósításra, amely a megadott beállítások alapján lekérdezési szövegeket generál. Ezt az objektumot támogatja a jelentéskészítő funkciókat, kivéve a jelentés kimenetét táblázatos dokumentumés egyéb kapcsolódó feladatok felhasználói felület. Ez az objektum használható az 1C:Enterprise szerveren és COM-kapcsolatban.

A COM objektumok használata akkor érhető el, ha a beépített nyelv fut az 1C:Enterprise szerveren.

A COM-hibák 1C:Enterprise kivételekké lesznek lefordítva.

Ha a konfiguráció érvénytelen objektumot, például táblázatos dokumentumot próbál létrehozni egy külső kapcsolati modulban, egy közös modulban vagy egy objektummodulban, akkor előfordulhat, hogy a COM-kapcsolatot kivétellel nem lehet létrehozni vagy megszakítani.

Szia Khabravchans!

Ebben a cikkben arról szeretnék beszélni, hogy az 1C platformmal való integráció hogyan jön létre a szervezetemben. Ami erre késztetett, az a szinte teljes hiánya volt technikai információ erről a témáról. Az 1C bármilyen információs rendszerrel való összekapcsolásáról szóló különféle cikkek és jelentések olvasása során újra és újra meggyőződhet arról, hogy ezek mind marketing jellegűek, bemutató jellegűek, és soha nem technikai jellegűek, tükrözve a problémát és annak megoldásának lényegét.

Figyelmeztetem, hogy a módszer semmiképpen sem állítja, hogy univerzális. Mivel sok 1C konfiguráció létezik, és információs rendszerek, nyelvek és platformok – még ennél is több, a lehetséges kombinációk száma óriási. Célom egy lehetséges megoldás bemutatása.


Az 1C-vel integrálható nyelvként a Pythont választottam. Kiválóan alkalmas folyamatautomatizálásra. Ezt segíti elő a minimalista szintaxis (a kód nagyon gyorsan begépelhető), a gazdag szabványkönyvtár (kevésbé kell külső modulokra), cross-platform - nagy valószínűséggel a Linix OS-ben írt kód sikeresen fog működni Ablakok.

Kezdésként felvázolom azokat az adatokat, amelyekkel dolgozni fogunk. A szervezet - a távol-keleti régió áramszolgáltató vállalata - körülbelül 400 ezer előfizetőt szolgál ki, az alap az 1C, saját maga által írt konfiguráción. Minden egyes előfizető esetében eltárolódnak a fizetései, időbeli elhatárolásai, igénybe vett szolgáltatásai és számítási sémái, mérőkészülékei, leolvasásai és sok egyéb adat.

Egyszer a szervezetben volt egy Delphiben írt program, amely az MSSQL / Firebird adatbázist használta. Azokban a dicsőséges időkben bármilyen nyelven lehetett csatlakozni az adatbázishoz, és számos műveletet végrehajtani - az adós előfizetők kiválasztása, a beérkezett kifizetések postázása, a műszerleolvasások rögzítése. Nem meglepő, hogy a rutint automatizáló szkriptek gyűjteménye folyamatosan bővül. A programozók bármilyen műveletet végrehajthatnak a program megnyitása nélkül.

Sajnos az 1C-re való átállással az ingyenesség véget ért - már nem lehetett közvetlenül csatlakozni az adatbázishoz. Általában maga az 1C platform oszthatatlan, és rosszul integrálódik más rendszerekkel. Ez, ahogy mondani szokták, önmagában való dolog. Amikor adatokat tölt be az 1C-be, emlékezni kell arra, hogy onnan nem lesz olyan egyszerű kinyerni őket. De tekintettel arra, hogy a szervezetnek fizetési rendszereket kellett bevezetnie és Személyes terület, megoldást kellett találni.

A fő feladatok, amelyekkel szembe kellett néznem, az volt, hogy gyorsan le tudjak szerezni egy adott adatot személyes fiók- Teljes név, cím, mérőeszközök, műszerleolvasások, fizetések, díjak. Plusz, a formáció a dokumentumok - egy aktus a megbékélés, fizetési nyugta. Tehát nincs lehetőség az adatbázishoz való közvetlen kapcsolatra - mindenki, aki átnézett az 1C adatbázison az SQL-kiszolgálón, látta, hogy nehéz kitalálni az olyan táblák tömegében, mint aaa1, aaa2. És ilyen tábla- és mezőnevekkel lekérdezéseket készíteni egyszerűen irreális. Ezen túlmenően sok 1C tábla (különösen a legfontosabbak, mint például az utolsó vágása, egyenlegek és fordulatok) virtuális, és szétszórva vannak a különböző fizikai táblákon, és több csatlakozásban gyűlnek össze. Ez a módszer nem megfelelő.

Az 1C platform lehetőséget biztosít arra, hogy COM-kapcsolaton keresztül csatlakozzon hozzá. Mint sok Windows program, az 1C telepítése során két COM objektumot regisztrálnak a rendszerben - Automation Server és COM Connector. Mindkét objektummal dolgozhat olyan nyelven, amely támogatja a COM technológiát.

Az Automation Server objektum egy 1C alkalmazás, amely szinte semmiben sem különbözik a szokásos kliens alkalmazásoktól. A különbség az, hogy ezen kívül lehetőség van az alkalmazáspéldány programozott vezérlésére. Amikor a COM Connector objektummal dolgozik, elindul az 1C alkalmazás könnyű verziója, amelyben nem állnak rendelkezésre űrlapok, valamint az interfészhez és a vizuális effektusokhoz kapcsolódó funkciók és módszerek. Maga az alkalmazás "Külső kapcsolat" módban indul el. Globális változók inicializálása (például definiálása jelenlegi felhasználóés beállításai) az 1C külső csatlakozómodulban kell végrehajtani. Ha külső kapcsolati módban olyan függvényt hívunk meg a kódban, amely ebben a módban nem érhető el, kivételt dobunk (amit a python szkriptünknek adunk át). A nem biztonságos függvények hívásait az űrlap konstrukcióival kell keretezni

#Ha NEM külső kapcsolat, akkor figyelmeztetés ("Szia!"); #EndIf

Mivel a COM-objektumokkal való munkavégzés csak Windows-technológia, nem meglepő, hogy nem szerepel a szabványos Python-terjesztésben. Telepítenie kell egy bővítményt - egy olyan modulkészletet, amely minden szükséges funkciót biztosít a Windows alatti programozáshoz a Pythonban. Letölthető már összerakott exe telepítőként. Maga a kiterjesztés hozzáférést biztosít a rendszerleíró adatbázishoz, szolgáltatásokhoz, ODBC-hez, COM-objektumokhoz és így tovább. Alternatív megoldásként azonnal telepítheti az ActiveState Python disztribúciót, amelyben a Win32 bővítmény már a dobozból származik.

Egy ideig kísérleteztem a COM kapcsolattal a webes alkalmazások fejlesztése során, különös tekintettel a személyes fiókra. A következő hátrányokat azonosították:

A COM kapcsolat lassú. Az alacsony teljesítmény a COM technológia jól ismert hátránya.
- Az 1C-vel való kapcsolat létrehozásának folyamata a konfigurációtól függően 1-8 másodpercig tarthat (az én esetemben - 6 másodperc). Mondanom sem kell, hogy az egyes kérésekhez kapcsolódó kapcsolat létrehozásával minden oldal 8 másodpercen belül betöltődik.
- Mivel a python webes alkalmazások független szerverként működnek, az előző pont kompenzálható azzal, hogy valamilyen globális változóban tároljuk a kapcsolatot, és hiba esetén visszaállítjuk. Őszintén szólva még nem gondolkodtam, hogyan lehet kapcsolatot fenntartani PHP-ben.
- Elveszett többplatformos webalkalmazás.

A fent felsorolt ​​pontok alapján úgy döntöttek, hogy megváltoztatják az interakció elvét, 2 részre osztva - az első platformfüggő (Windows), az 1C adatok bármilyen kényelmes formátumba történő kirakása, a második pedig platformfüggetlen, amely képes adatokkal dolgozni anélkül, hogy elvileg bármit is sejtene az 1C-ről.

A cselekvési stratégia a következő: a python szkript csatlakozik az 1C-hez, végrehajtja a szükséges lekérdezéseket és feltölti az adatokat az SQLite adatbázisba. Ehhez az adatbázishoz Pythonból, PHP-ből, Java-ból csatlakozhat. A legtöbb projektünk pythonban van, és mivel utálok kézzel írni nyers SQL-lekérdezéseket, az SQLite adatbázissal végzett minden munka az SQLAlchemy ORM-en keresztül történik. Csak az adatbázis adatszerkezetét kellett deklaratív stílusban leírni:

Az sqlalchemy.ext.declarative import deklaratív_alapból az sqlalchemy importból Oszlop, egész szám, numerikus, DateTime, Unicode, logikai, LargeBinary, ForeignKey Base = deklaratív_bázis() osztály Abonent(Base): __tablename__ = "abonens True) account = Oszlop(Unicode(32), index=True) kód = Oszlop(Unicode(32)) cím = Oszlop(Unicode(512)) fio = Oszlop(Unicode(256)) forrás = Oszlop(Unicode(16) ) psu = Oszlop(Unicode(256)) tso = Oszlop(Unicode(256)) np = Oszlop(Unicode(256)) utca = Oszlop(Unicode(256)) ház = Oszlop(Integer) lakás = Oszlop(Integer) mro = Oszlop(Unicode(256)) osztály Fizetés(Alap): __táblanév__ = "kifizetések" # és így tovább...

Most elég importálni ezt a modult bármely python projektbe, és már dolgozhat az adatokkal.

Előre látom a kérdését - "miért az SQLite"? Ennek fő oka az, hogy az adatbázisra csak az olvasáshoz van szükség, így nem kell aggódnunk az SQLite-ba való írással kapcsolatos problémák miatt. Másodszor, ennek a DBMS-nek a formátuma kényelmes - kényelmesebb a megtekintése (sok van ingyenes közművek, beleértve a FireFox szuper kiterjesztését). Harmadszor, bizonyos esetekben el kellett érni az előfizetőket azokról a gépekről, amelyeken nincs kapcsolat a MySQL szerverrel. Ebben az esetben elég az SQLite adatbázis fájlt másolni, és ezen a gépen minden információhoz hozzáférhet.

A kirakodás naponta egyszer, éjszaka történik. Az adatok 1C-be történő bevitele ugyanúgy automatizálható. Például rögzíteni kell az előfizetők által a személyes fiók webhelyén hagyott leolvasásokat. Ebben az esetben ismét csatlakozunk az 1C-hez, és programozottan létrehozzuk és végrehajtjuk a „Tanúságtételi aktus” dokumentumot. Az alábbiakban megadom a kódot.

A COM-objektumokkal való munka Pythonban kissé szokatlan. Először is, a kód „pytonicitása” elvész - az 1C változók és függvények elnevezésére vonatkozó szabályok enyhén szólva nem felelnek meg a Python Zenének. Másodszor, mindenki tudja, hogy az 1C objektumokat gyakran cirill karaktereknek nevezik, ami problémákat okoz a Pythonban való fejlesztés során ... de megoldhatók. Azt javaslom, nézd meg a kódot:

Import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_szerver;Ref=v8_db;Usr=felhasználónév;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Amint a kódból látható, az ügyfél inicializálva van az 1C-vel való együttműködésre. A COM objektumot a "V82.COMConnector" név határozza meg. Kérjük, vegye figyelembe, hogy ez a név a V8.2 platformra érvényes, ha 8.1-es verziója van, akkor a név "V81.COMConnector" lesz.

Az inicializált kliensen meghívjuk a Connect() metódust, átadva neki a kapcsolódási karakterláncot. A karakterlánc a szerver nevéből, az adatbázisból, a felhasználóból és a jelszóból áll. Az eredményül kapott V82 objektum tárolja a kapcsolatot az 1C alkalmazással. Nincs benne Disconnect() metódus vagy ilyesmi. Az alapról való leválasztáshoz elegendő az objektumot a del () függvénnyel eltávolítani a memóriából, vagy a változót None-ra rendelni.

Objektum birtokában hozzáférhet az 1C globális kontextus bármely mezőjéhez és metódusához, és olyan univerzális objektumokkal dolgozhat, mint a TabularDocument, TableValues ​​stb. Fontos megjegyezni, hogy amikor COM-kapcsolaton keresztül dolgozik, az 1C "Külső kapcsolat" módban működik. Nem tartalmaz semmilyen interaktív munka funkciót, például felugró párbeszédpaneleket, értesítéseket és, ami a legfontosabb, űrlapokat. Biztos vagyok benne, hogy többször is átkozni fogja a konfigurációfejlesztőket, akik a legtöbb következtetést vonják le fontos funkcionalitás a Button1Press() eljáráshoz a dokumentum űrlap modulban.

Beszéljünk egy olyan fontos dologról, mint a cirill attribútumok. Annak ellenére, hogy az 1C kétnyelvű környezet, és minden orosz módszernek van angol megfelelője, előbb-utóbb a cirill attribútumhoz kell fordulnia. Ha bekapcsolva PHP nyelvek vagy VBSCript nem okoz problémát,

Set Con = CreateObject("v81.COMConnector") Set v8 =Connect("Kapcsolódási karakterlánc") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsWrite.Write()

Ekkor a python kód egyszerűen összeomlik egy szintaktikai hibával. Mit kell tenni? Szerkeszti a konfigurációt? Nem, csak használja a getattr és setattr metódusokat. Ha ezeknek a függvényeknek egy COM objektumot és egy cirill attribútumnevet adunk át, akkor ennek megfelelően kaphatunk és állíthatunk be értékeket:

#coding=cp1251 katalógus = getattr(V82.Katalógusok, "Személyes fiókok")

A következők fontosak: az attribútumneveket, valamint a függvény- és metódusparamétereket a cp1251 kódolásban kell átadni. Ezért a kódolási zavarok elkerülése érdekében célszerű a fájl elején deklarálni: #coding=cp1251. Ezt követően átadhatja a karakterláncokat anélkül, hogy aggódnia kellene a kódolásuk miatt. De! Az 1C-től kapott összes karakterlánc (a függvényhívások eredményei, kérések) UTF-8 kódolású lesz.

Példa egy olyan kódra, amely végrehajt egy lekérdezést az 1C környezetben, iterálja az eredményt, és elmenti az adatbázist SQLite-ba:

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS kód, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS cím, PersonalAccounts.Subscriber.Name AS fio, PersonalAccounts.Division.Name AS psu, EXPRESS(CharacteristicsPersonal AccountsSliceLast. Value AS Directory.Territorial NetworkOrganizations).Név AS tso, PersonalAccounts.Building.Settlement.Name AS np, PersonalAccounts.Building.Street.Name AS street, ASUSAccounts.s.BuildinghousesH Szobaszám AS flat , Personal Accounts.Division.Parent.Description AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT JOIN Data register.CharacteristicsPersonalAccounts.SliceLast(,CharacteristicsType = VALUE(Directory.Characteristics). eLast Software = V82.NewObject("Lekérdezés ", q) kiválasztás = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = modellek.Abonent() abonent. account = kiválasztás.code.strip() abonent.code = kiválasztás.kód abonent.fio = kiválasztás.fio abonent.address = kiválasztás.cím abonent.psu = kiválasztás.psu abonent.tso = kiválasztás. tso abonent.forrás = u" ASRN" abonent.np = kiválasztás.np abonent.street = kiválasztás.utca abonent.house = kiválasztás.ház abonent.flat = kiválasztás.lakás abonent.mro = Selection.mro CONN.add(abonent) CONN.commit()

Itt a CONN a kapcsolódási munkamenet az SQLite adatbázissal. Létrejön egy lekérdezési objektum, a szövege kitöltésre kerül. Amint fentebb megjegyeztük, a kérés szövegének cp1251-ben kell lennie, amelyhez a kódolást először deklarálják. A lekérdezés végrehajtása után minden előfizető törlődik az adatbázisból, nehogy duplikátumokat adjanak hozzá, majd egy ciklusban hozzáadják őket, és következik a végső véglegesítés.

A kérések kezelése során a következő szabályokat fedeztem fel.

A mezők kijelölésénél adjunk latin nevet, sokkal kényelmesebb lesz a getattr( helyett) szelektoron (dot) keresztül elérni őket.
- Csak primitív adattípusokat válasszon: karakterláncok, számok, dátumok és logikai értékek. Soha ne válasszon hivatkozásokat egy objektumra (dokumentumra, könyvtárra)! Ebben az összefüggésben abszolút nincs szükség hivatkozásokra, sőt káros is, mert a hivatkozás attribútumához vagy metódusához való bármilyen hozzáférés egy COM-kapcsolaton keresztüli kérést eredményez. Ha ciklusban éri el a hivatkozás attribútumait, az rendkívül lassú lesz.
- Ha kiválaszt egy Dátum mezőt, az PyTime objektumként jelenik meg. Ez egy speciális adattípus a dátum/idő átadására a COM-kapcsolaton. Nem olyan kényelmes vele dolgozni, mint a szokásos dátumidővel. Ha ezt az objektumot átadja az int()-nek, akkor egy időbélyeg jelenik meg, amelyből a fromtimestamp() metódussal lekérheti a datetime-ot.

Most nézzük meg, hogyan készülnek a nyomtatott dokumentumok. A helyzet az, hogy a fogyasztónak lehetőséget kell adni arra, hogy letöltse az előre elkészített dokumentumokat, például fizetési bizonylatot vagy egyeztető aktust. Ezeket a dokumentumokat az 1C-ben állítják elő a megállapított követelményeknek megfelelően, megvalósításuk Pythonban sok időt vesz igénybe. Ezért jobb a dokumentumokat 1C-ben generálni és elmenteni excel formátumban.

Tehát az egyeztetési aktus dokumentumot egy speciális generálja külső feldolgozás. Azok számára, akik nem ismerik az 1C terminológiát: a feldolgozás egy autonóm program, amely saját modullal, űrlapokkal, sablonokkal rendelkezik, amelyeket az 1C környezetben való futtatásra terveztek. Inicializálni kell a feldolgozást, ki kell tölteni az adatait, és meghívni egy függvényt, amely visszaküldi nekünk az 1C-ben való megtekintésre szánt táblázatos dokumentumot. Ezt a dokumentumot Excel formátumban kell elmenteni és a szerverre másolni vagy az adatbázisba írni.

Link = getattr(V82.Catalogs, "SystemReports").FindByDescription("Elen ellenőrzési törvény") nav_url = V82.GetURL(link, "Report") name = V82.ExternalReports.Connect(nav_url) ExternalReports = V82.CreateReport (név) setattr(Külső Jelentés, "Személyes fiók", hivatkozás) table_doc = KülsőJelentés.GetDoc() elérési út = V82.GetTempFileName("xls") table_doc.Write(elérési út, V82 .SpreadsheetDocumentFileType.XLS) jelentés = model. .account = referencia.Code.strip() report.type = u"act" report.document = open(elérési út, "rb").read() CONN.add(jelentés)

A fenti részlet a következőket teszi. A dokumentumot alkotó feldolgozás össze van kapcsolva. A feldolgozás beépíthető a konfigurációba, tárolható lemezen vagy 1C adatbázisban (valamilyen könyvtárban). Mivel a feldolgozás gyakran változik, hogy a konfiguráció ne frissüljön minden alkalommal, a leggyakrabban változó feldolgozás a „ReportsSystem” könyvtárban, az „értéktár” típusú Report nevű attribútumban kerül tárolásra. A feldolgozás inicializálható úgy, hogy kirakjuk az adatbázisból a lemezre és betöltjük, vagy a GetURL() metódussal, amelybe át kell adni egy hivatkozást a könyvtárelemre és az attribútum nevére. Az eredményül kapott feldolgozó objektumhoz attribútumértékeket rendelünk, meghívjuk az exportált GetDoc() függvényt, és kapunk egy táblázatkezelő dokumentumot, amelyet egy ideiglenes Excel fájlba mentünk. Ennek a fájlnak a tartalma az SQLite adatbázisba van írva.

Az utolsó dolog, amit figyelembe kell venni, az adatok programozott bevitele az 1C-be. Tételezzük fel, hogy kötelező az előfizetőktől származó jelzések megadása. Ehhez elegendő létrehozni és lefolytatni a „Bizonyítási aktus” dokumentumot:

#coding=cp1251 acts = getattr(V82.Dokumentumok, "Tanússágfelvételi aktus") act = acts.CreateDocument() setattr(act, "Indication", 1024.23) setattr(act, "előfizető", "Ivanov") # Kitöltés egyéb részletekben. ...act.Write()
Most az adatbevitel automatizált.

Tehát felvázoltam egy módszert, amely az adatok programozott fel- és letöltésén alapul COM-kapcsolaton keresztül. Ez a módszer közel egy éve működik sikeresen szervezetemben. Az 1C-ből kialakított bázis 3 fizetési rendszert, internetes elfogadást (kártyás fizetés az interneten keresztül), valamint személyes számlát szolgál ki. Ezenkívül különféle szkriptek csatlakoznak az adatbázishoz, hogy automatizálják a rutint.

A módszer hiányosságai ellenére (a COM-kapcsolat lassú sebessége) általában stabilan működik. Adataink vannak platformfüggetlen formában (SQLite), amelyekkel bármilyen nyelvről dolgozhatunk. A kód fő része pedig Pythonban van írva, ami azt jelenti, hogy számos olyan eszköz és technika áll rendelkezésre, amiről 1C-ben még csak álmodni sem lehet.

Ez az egyik lehetséges módjai kölcsönhatás az 1C-vel. Biztos vagyok benne, hogy nem új, és valószínűleg valaki már tesztelte és optimalizálta. Igyekeztem azonban a folyamat minél több részletét felvázolni, hogy megkíméljem Önt azoktól a buktatóktól, amelyekbe én magam léptem bele.

Sok szerencsét kívánok mindenkinek, és ne feledje, hogy az 1C nem olyan ijesztő, mint ahogy le van festve!

) Úgy van

Ugyanakkor nem egyszer láttam, amikor egyszerűen "felszállnak" azok a kiadványok, amelyek 10 pontot sem húznak.
Miért történt ez? Valószínűleg azért, mert valakinek nyilvánvalóan tetszettek.


Erről beszélek, és azt mondom, hogy jó lenne nem minősítés alapján olvasni a cikket, hogy megértsd, mennyire van rá szükséged, vagy nem olyan primitíven értékeled +/-. Ami nekem tetszett, azt a következőképpen javítanám ki: azért szerzett ennyit, mert így alakultak a sztárok, és nagyon sokan összegyűltek az oldalon és sokaknak tetszett, te magad is megérted, hogy ez a kérdés a véletlennek. amint megjelenik a cikk kezdőlap akkor már csak kérésre megtalálható, és így mindenki szavaz. A főoldal támogatására pedig, amennyire én értem, csak állandó kommentelést engedélyeznek = a cikk népszerűsítése.
Ezért rakják ki az üzleteket a főutcákba - elvégre sokszor nem a termék minősége és relevanciája a lényeg, hanem a hely átjárhatósága, a sétálók gyakran azt veszik meg, amit másnap kidobnak, csak a folyamat kedvéért. Ez egy jól ismert betegség - shopomania. Vagy egyszerűen az áramlás növelése növeli a megfelelő vevő valószínűségét.

És az előnyök és hátrányok... csak egyfajta „köszönöm” az eltöltött időért és munkáért


Azok. A mínusz is "köszönömnek" számít? Ezért szerettem volna megtudni a hozzáállását, hogy kell-e ilyen esetekben megfogalmazni, és mások mennyire tartják érdekesnek? Függetlenül attól, hogy akkor tegye, amikor a cikk káros / rossz, vagy ha egyszerűen haszontalan / üres az Ön számára.
Véleményem szerint a cikk csak egy értékelésemelésnek tűnik, mert:
1. Az általam megadott típusokkal kapcsolatos problémát a szerző általában figyelmen kívül hagyta, bár nem volt lusta egy csomó megjegyzést írni.
2. Egyértelmű pontatlanság van a cikkben: állítólag ez az egyetlen út

V82 = Új COMobject("V82.Comnnector"); Kód = ContractorCOM.Code;


de nyugodtan csinálom a következő feldolgozás segítségével:

Notify(Base.Directories.Counterparties.FindBy Name("LLC").Code);


és minden rendben van! És a V82.ComConnector kapcsolatot választom
Valahogy furcsa, hogy a szerzőt egyáltalán nem érdekli, hogy cikkében ilyen problémák vannak, amelyekre rámutattak, de nem reagál rá.
3. De továbbra is probléma van, ha megjelenik az "Osztály nem létezik" hibaüzenet
4. De akkor van probléma, ha a 8.2 telepítve van, majd a 8.1 - próbálja meg OLE / COM-on keresztül cserélni egy tipikus UT-BP cserével!
5. Meg tudnád jelezni az oldalon a fő feldolgozást, amely lehetővé teszi az OLE / COM-on keresztüli univerzális csatlakozást, hogy a kezdők ne vesztegetik az idejüket, írj nekik! Egyébként valamiért a képe pompázik veled, miért tenné?. És ennek eredményeként 2 szó érdemben, és további 6 a színfalak mögött.

Általában nem sárral dobálom, hanem konkrét hiányosságokra mutatok rá, de nincs reakció. Ha ezt a tapasztalatot osztja meg, akkor az valahogy hibás és hiányos.
Úgy értem, ha a szerzőnek volt kedve összeszedni az összes hibát, akkor legalább meghallgathatta valaki más tapasztalatait, és nem csattant fel a megjegyzéseken. Rögtön olyan helyzet áll elő, hogy aki elolvassa, az többet tud, mint a szerző, azt mondják neki (néha rosszul), és ő is visszavág. Ennek eredményeként minden információ nem a cikkben, hanem a megjegyzésekben található! Vicces! Gyakran előfordul, de ugyanakkor nem kell azon pihenned, amit a legjobban akartál – én megmutatom, hogyan jobb, és mások mutatják meg! Tegye ezt bele a cikkbe, és megéri, nem mindenkit érdekel ez a csetepaté.

Az adatok egyik 1C konfigurációból a másikba való átvitelének egyik módja a szoftveres kapcsolat COM használatával. Sok vállalat több különböző alapot használ, amelyek között léteznie kell bizonyos kapcsolatokatés függőségek. Ha nem csak adatátvitelre van szükség, hanem bizonyos adatfeldolgozások végrehajtására is, akkor a COM kapcsolat lesz az optimális mechanizmus. Egy másik 1C adatbázisból származó adatok elemzésének képessége minden fejlesztő számára hasznos.

COM-on keresztül csatlakozunk az 1C adatbázishoz

A COM-kapcsolat megvalósításához az 1C-ben egy speciális, COMConnector nevű mechanizmust használnak. Ez az objektum a platformmal együtt kerül telepítésre, és információs bázisok összekapcsolására szolgál. Meg kell jegyezni, hogy a 8.2-es és 8.3-as verziók esetében különböző nevű objektumok használatosak - "V82.COMConnector" és "V83.COMConnector".

Ne feledje, hogy a licenc az adatbázishoz való COM-kapcsolat idejére érvényes – nem szabad elragadtatnia magát több kapcsolat egyidejű létrehozásával. Ez különösen fontos azon szervezetek számára, amelyek korlátozott számú licenccel rendelkeznek. Ez a probléma megoldható a rutinfeladatokat amelyek akkor futnak le, ha nincs aktív felhasználói kapcsolat az információs bázissal.

Ahhoz, hogy egy másik adatbázishoz kapcsolódhasson és a szükséges információkat lekérhesse, a következő adatokat kell ismernie:

  1. Milyen típusú - fájl vagy kliens-szerver;
  2. Hol található;
  3. milyen néven és jelszó alatt lehet beírni;
  4. Milyen adatok érdekelnek.

Az első három pontból a COM-kapcsolat megvalósításához paraméter-karakterláncot kell alkotnia. Az IB típusától függően eltérő lehet kinézet. A kapott karakterlánc segítségével létrejön egy kapcsolat, amellyel egy másik adatbázisból adatokat gyűjthet elemzés és feldolgozás céljából bármilyen módszerrel.

ConnectionParametersFileIB = "Fájl=""Alap_útvonala""; Usr=""Felhasználónév"";Pwd=""Jelszó"""; ConnectionParametersClientServerIB = "Srvr=""Szerver_neve""; Ref=""Alapnév""; Usr=""Felhasználói_név""; Pwd=""Jelszó""";

A csatlakozási funkció egyszerű, és nem vethet fel kérdéseket, ha minden paraméter helyes. A hibakeresés és elemzés felgyorsítása érdekében lehetséges hibákat jobb, ha a kapcsolatot egy Kísérlet konstrukcióba zárjuk. A függvény egy "COM objektum" típusú értéket ad vissza, amellyel dolgoznia kell, megszerezve a szükséges adatokat.

&AtServer függvény ConnectToBase() export ConnectionParametersIB = "Fájl=""E:\base 1c\ERP""; Usr=""Rendszergazda"";Pwd=""1"""; V83COMCon= Új COMObject("V83.COMConnector"); Return kísérlet V83COMCon.Connect(ConnectionParametersIB); Kivétel jelentés(ErrorDescription()); Return Undefined; A kísérlet vége; EndFunctions

COM-kapcsolaton keresztül nem csak adatokat jelölhet ki, hanem hozzáadhatja azokat az adatbázishoz, amelyhez csatlakozik. Ne feledje, hogy 4 primitív adattípust tudunk átvinni egy COM objektumon keresztül. A többi típust a platformba épített keresőfunkciók segítségével kell megadni. Vegye figyelembe, hogy a globális platformfüggvények COM-kapcsolaton keresztül is meghívásra kerülnek.

Az 1C adatbázisból kapunk adatokat

Miután megkapta a kívánt objektumot, ki kell olvasnia az adatokat egy másik adatbázisból. Ehhez egy kérést alkalmazunk egy COM-kapcsolaton keresztül az 1C 8.3-ban a függvénytől kapott "COM objektum" típusú érték felhasználásával. Fontos, hogy először csatlakozzon az adatbázishoz, majd hajtsa végre a lekérdezést. A végrehajtás a NewObject metóduson keresztül történik, az objektum típusának karakterlánc formában történő feltüntetésével - "Kérés" paraméterként.

&OnServer eljárás TestCOMOnServer() Connection = ConnectToBase(); Ha TypeValue(Connection) Type("Undefined") akkor QueryBPO = Connection.NewObject("Lekérdezés"); Query BPZO.Text = "Válassza ki az első 15 | Felhasználói címtárat. Név AS név | FROM | Felhasználói címtár AS felhasználói címtár"; Selection = QueryBPO.Run().select(); While Sample.next() ciklus Report(Selection.Number); EndCycle; EndIf; Az eljárás vége >

Például, hogy információt kapjunk egy bizonyos részleg felhasználóiról, paramétereken keresztül feltételt állítunk be a kérésben. Az egyik paraméter egyszerű típusú lesz - egy karakterlánc, a részleg pedig egy hivatkozás az "Enterprise Structure" könyvtár elemére. A lekérdezés eredménye egy olyan táblázat, amely felsorolt ​​mezőket tartalmazza abban az adatbázisban, amelyhez a COM-kapcsolat létrejött. Ha más típusokra kell konvertálnia, használja a szabványos platformfunkciókat:

  • Vonal();
  • Szám();
  • Időpontja().
RequestBPO = Connection.NewObject("Kérés"); QueryBPO.Text = "KIVÁLASZTÁSA az első 15-ből | Felhasználói címtár.név AS név |FROM | Címtár.Felhasználók AS felhasználói címtár I WHERE | Felhasználói címtár.Osztály = &Kívánt részleg | És UserDirectory.Name, mint ""%"" + &KívántName+ ""%" "" ; BPZO Request.SetParameter("Kívánt részleg", Connection.Directories.Enterprise Structure.FindByCode("00-000023")); RequestBPO.SetParameter("RequiredName","Jekaterina"); Selection = QueryBPO.Run().select(); While Selection.next() ciklus Report(Selection.Name); EndCycle;

Ha egy tömböt kell átvinni az adatbázisba több paraméter, például felosztás, kijelölés céljából, akkor a NewObject parancs is használatos. Hasonlóképpen átadhat egy értéklistát vagy táblázatot, feltöltve azokat egy másik adatbázis elemeivel a kapcsolaton keresztül. A platform összes létező objektum- és mechanizmusmódszere elérhető a kereséshez.

RequestBPO = Connection.NewObject.("Kérés"); QueryBPO.Text = "KIVÁLASZTÁSA az első 15-ből | Felhasználói címtár.név AS név | FROM | Címtár.Felhasználók AS felhasználói címtár I WHERE | Felhasználói címtár.részleg (&Kívánt részleg) | És felhasználói könyvtár.név, mint ""%"" + &Kívántnév+ "" %" ""; Subdivisions Array = Connection.NewObject("Tömb"); Osztályok array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000023")); Osztályok array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000038")); Osztályok array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000046")); Lekérdezés BPZO.SetParameter("Kívánt alosztály", Alosztályok tömbje); RequestBPO.SetParameter("RequiredName","Jekaterina"); Selection = QueryBPO.Run().select(); While Selection.next() ciklus Report(Selection.Name); EndCycle;

Dokumentumok vagy könyvtárelemek átvitelekor mindig felmerül a kérdés, hogy egy adott objektum átvitelét ellenőrizzük. A COM-kapcsolatokkal az ilyen problémákat egyedi azonosító segítségével oldhatja meg. Meg kell találnia egy objektumot a csatlakoztatható adatbázisban az aktuális IB azonosítója alapján a "GetLink" függvény segítségével, az azonosítót karakterláncként használva. Ha nincs ilyen, létrehozhatja COM-kapcsolaton keresztül.

StrIdent = String(Directories.Users.FindByCode("00-0000313").EgyediIdentifier()); Ha NEM ValueFilled(Connection.Catalogs.Users.GetReference(Connection.NewObject("EgyediIdentifier", StrIdent))), akkor NewUser = Connection.Catalogs.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Név; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Egyén; NewUser.Write(); EndIf;

Ezenkívül a COM-kapcsolatnak joga van az általános 1C modulokból származó eljárások és funkciók használatára, ha a „Külső kapcsolat” tulajdonság engedélyezve van. Ezen a feltételen túlmenően a hívott függvénynek vagy eljárásnak exportálási függvénynek kell lennie, és nem tartalmazhat a kiszolgálón végrehajtott interaktív műveleteket. Ellenkező esetben hibaüzenet jelenik meg az érvénytelen műveletről.

Összetett..; VariableFromFunction = Kapcsolat..; függvényhívás>közös modulnév>eljáráshívás>közös modulnév>

Az 1C másik adatbázisával való külső kapcsolat lehetőségei meglehetősen szélesek, és számos feladat elvégzését teszik lehetővé. Fontos az eszköztár helyes értékelése és kiválasztása optimális megoldás. A legtöbb esetben ez a készség csak tapasztalattal vagy tapasztalt szakemberek munkájának tanulmányozásával jelenik meg.