Jedním ze způsobů přenosu dat z jedné konfigurace 1C do druhé je softwarové připojení pomocí COM. Mnoho společností používá několik různých základen, mezi kterými musí existovat určitá spojení a závislosti. Pokud je nutné nejen přenášet data, ale také provádět určité zpracování dat, pak bude optimálním mechanismem připojení COM. Schopnost analyzovat data z jiné databáze 1C je užitečná pro každého vývojáře.

Připojujeme se přes COM k databázi 1C

Pro implementaci COM spojení v 1C se používá speciální mechanismus zvaný COMConnector. Tento objekt je nainstalován s platformou a slouží ke komunikaci informační základny. Je třeba poznamenat, že pro verze 8.2 a 8.3 jsou použity objekty různých jmen - "V82.COMConnector" a "V83.COMConnector".

Pamatujte, že licence je utracena po dobu připojení COM k databázi - neměli byste se nechat unést vytvářením několika připojení současně. To je důležité zejména pro organizace, které mají omezený počet licencí. Tento problém lze vyřešit pomocí rutinní úkoly které se spouštějí, když neexistují žádná aktivní uživatelská připojení k infobázi.

Aby bylo možné se připojit k jiné databázi a požádat nezbytné informace musíte znát následující údaje:

  1. Jaký je to typ - soubor nebo klient-server;
  2. Kde se to nachází;
  3. Pod jakým jménem a heslem jej můžete zadat;
  4. O jaké údaje máte zájem.

Z prvních tří bodů, abyste mohli implementovat připojení COM, musíte vytvořit řetězec parametrů. V závislosti na typu IB se bude lišit vzhled. Pomocí přijatého řetězce se vytvoří spojení, pomocí kterého můžete sbírat data z jiné databáze pro analýzu a zpracování libovolnými metodami.

ConnectionParametersFileIB = "Soubor=""Cesta_k_základně""; Usr=""Uživatelské_jméno"";Pwd=""Heslo"""; ConnectionParametersClientServerIB = "Srvr=""Název_serveru""; Ref=""Název_základny""; Usr=""Jméno_uživatele""; Pwd=""Heslo""";

Funkce připojení je jednoduchá a neměla by vyvolávat otázky, pokud jsou všechny parametry správné. Pro urychlení ladění a analýzy možné chyby je lepší uzavřít spojení do konstrukce Pokus. Funkce vrátí hodnotu typu "COM objekt", se kterou budete muset pracovat a získat potřebná data.

&AtServer Function ConnectToBase() export ConnectionParametersIB = "File=""E:\base 1c\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nový COMObject("V83.COMConnector"); Pokus o návrat V83COMCon.Connect(ConnectionParametersIB); Zpráva o výjimce(ErrorDescription()); Návrat Nedefinováno; Konec pokusu; EndFunctions

Prostřednictvím připojení COM můžete data nejen vybírat, ale také je přidávat do databáze, ke které se připojujete. Pamatujte, že prostřednictvím objektu COM můžeme přenášet 4 primitivní datové typy. Jiné typy bude nutné specifikovat pomocí vyhledávacích funkcí zabudovaných do platformy. Vezměte prosím na vědomí, že globální funkce platformy jsou také volány prostřednictvím připojení COM.

Dostáváme data z databáze 1C

Poté, co obdržíte požadovaný objekt, musíte načíst data z jiné databáze. K tomu aplikujeme požadavek přes COM spojení v 1C 8.3 pomocí přijaté hodnoty typu "COM object" z funkce. Je důležité se nejprve připojit k databázi a poté provést požadavek. Spuštění probíhá pomocí metody NewObject s uvedením typu objektu ve formě řetězce - "Request" jako parametr.

&Procedura OnServer TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then QueryBPO = Connection.NewObject("Query"); Query BPZO.Text = "VYBERTE prvních 15 | Adresář uživatelů. Jméno AS Jméno | FROM | Adresář uživatelů AS Adresář uživatelů"; Výběr = QueryBPO.Run().select(); While Sample.next() loop Report(Selection.Number); EndCycle; EndIf; Konec procedury >

Například pro získání informací o uživatelích určitého oddělení nastavíme v požadavku podmínku prostřednictvím parametrů. Jeden parametr bude jednoduchého typu – řetězec, a oddělení – odkaz na prvek adresáře „Enterprise Structure“. Výsledkem dotazu je tabulka s výčtovými poli typu, který existují v databázi, ke které došlo ke spojení COM. Pokud je potřebujete převést na jiné typy, použijte standardní funkce platformy:

  • Čára();
  • Číslo();
  • Datum().
RequestBPO = Connection.NewObject("Požadavek"); QueryBPO.Text = "VYBRAT prvních 15 | User Directory.Name AS Name |FROM | Directory.Users AS User Directory I WHERE | User Directory.Department = &DesiredDepartment | A UserDirectory.Name jako ""%"" + &DesiredName+ ""%" "" ; BPZO Request.SetParameter("Desired Department", Connection.Directories.Enterprise Structure.FindByCode("00-000023")); RequestBPO.SetParameter("PožadovanéNázev","Ekaterina"); Výběr = QueryBPO.Run().select(); While Selection.next() smyčka Report(Selection.Name); EndCycle;

Pokud potřebujete přenést pole do databáze pro výběr podle několika parametrů, například dělení, použije se také příkaz NewObject. Podobně můžete předat seznam nebo tabulku hodnot a naplnit je prvky jiné databáze prostřednictvím připojení. Všechny jsou k dispozici k vyhledávání. stávající metody objekty a mechanismy platformy.

RequestBPO = Connection.NewObject.("Požadavek"); QueryBPO.Text = "VYBRAT prvních 15 | User Directory.Name AS Name | FROM | Directory.Users AS User Directory I WHERE | User Directory.Department In (&DesiredDepartment) | A UserDirectory.Name jako ""%"" + &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")); Dotaz BPZO.SetParameter("Desired Subdivision", Array of Subdivisions); RequestBPO.SetParameter("PožadovanéNázev","Ekaterina"); Výběr = QueryBPO.Run().select(); While Selection.next() smyčka Report(Selection.Name); EndCycle;

Při přenosu dokumentů nebo prvků adresářů vždy vyvstává otázka kontroly přenosu konkrétního objektu. Pomocí připojení COM můžete tyto problémy vyřešit pomocí jedinečného identifikátoru. V zásuvné databázi potřebujete najít objekt podle identifikátoru z aktuálního IB pomocí funkce "GetLink" s použitím identifikátoru jako řetězce. Pokud žádný neexistuje, můžete jej vytvořit pomocí připojení COM.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); If NOT 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(); EndIf;

Také připojení COM má právo používat procedury a funkce z běžných modulů 1C s povolenou vlastností "Externí připojení". Kromě této podmínky musí být volaná funkce nebo procedura exportní funkcí a nesmí zahrnovat interaktivní akce prováděné na serveru. V opačném případě se zobrazí chyba o neplatné operaci.

Sloučenina..; VariableFromFunction = Připojení..; volání funkce>společný název modulu>volání procedury>společný název modulu>

Možnosti externího propojení s jinou databází v 1C jsou poměrně rozsáhlé a mohou vám umožnit provádět mnoho úkolů. Důležité je umět správně vyhodnotit nástroje a vybrat nejlepší řešení. Ve většině případů se tato dovednost objevuje pouze se zkušenostmi nebo studiem příkladů práce zkušených odborníků.

) To je správně

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


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

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


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

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


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

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


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

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

Ahoj Khabravchans!

V tomto článku chci mluvit o tom, jak je v mé organizaci zavedena integrace s platformou 1C. Donutil mě to udělat prakticky úplná absence technické informace na toto téma. Při čtení různých článků a zpráv na téma propojení 1C s jakýmkoli informačním systémem se znovu a znovu přesvědčujete, že všechny jsou marketingové, demonstrační povahy a nikdy ne technické, odrážející problém a podstatu jeho řešení.

Upozorňuji vás, že metoda v žádném případě netvrdí, že je univerzální. Protože existuje mnoho konfigurací 1C samotných, a informační systémy, jazyky a platformy - ještě více, počet možných kombinací je obrovský. Mým cílem je ukázat jedno možné řešení.


Jako jazyk, který se bude integrovat s 1C, jsem zvolil Python. Velmi dobře se hodí pro automatizaci procesů. To je usnadněno minimalistickou syntaxí (kód je napsán velmi rychle), bohatou standardní knihovnou (menší potřeba modulů třetích stran), multiplatformní - s vysokou pravděpodobností bude kód napsaný v OS Linix úspěšně fungovat v Okna.

Pro začátek nastíním data, se kterými budeme pracovat. Organizace - dodavatel energie v regionu Dálného východu - obsluhuje přibližně 400 tisíc předplatitelů, základna je 1C na vlastní konfiguraci. Pro každého účastníka jsou uloženy jeho platby, časové rozlišení, spotřebované služby a kalkulační schémata, měřicí zařízení, odečty a mnoho dalších dat.

Jednou v organizaci byl program napsaný v Delphi a používající MSSQL / Firebird jako databázi. V oněch slavných dobách bylo možné se k databázi připojit pomocí libovolného jazyka a provádět mnoho akcí - vybírat dlužné odběratele, zaúčtovat přijaté platby, zaznamenat odečty přístrojů. Není divu, že sbírka skriptů, které automatizují rutinu, neustále roste. Programátoři mohli provést jakoukoli akci bez otevření samotného programu.

Bohužel s přechodem na 1C skončilo freebie - již nebylo možné se připojit přímo k databázi. Obecně platí, že samotná platforma 1C je nedělitelná a špatně integrovaná s jinými systémy. Je to, jak se říká, věc sama o sobě. Při načítání dat do 1C je třeba mít na paměti, že extrahovat je odtud nebude tak snadné. Ale s ohledem na skutečnost, že organizace byla povinna zavést platební systémy a Osobní oblast, muselo se najít řešení.

Hlavní úkoly, se kterými jsem se potýkal, byla schopnost rychle získat data o konkrétním osobní účet- Celé jméno, adresa, měřicí zařízení, odečty přístrojů, platby, poplatky. Plus, tvorba dokumentů - akt smíření, potvrzení o platbě. Neexistuje tedy možnost přímého připojení k databázi - každý, kdo si prohlédl databázi 1C na SQL serveru, viděl, že je těžké to zjistit v mase tabulek jako aaa1, aaa2. A sestavovat dotazy s takovými názvy tabulek a polí je prostě nereálné. Kromě toho je mnoho stolů 1C (zejména ty nejdůležitější, jako je řez posledního, zůstatky a otáčky) virtuálních a jsou rozptýleny po různých fyzických stolech a shromažďují se ve více spojeních. Tato metoda není vhodná.

Platforma 1C poskytuje možnost připojit se k ní prostřednictvím připojení COM. Stejně jako mnoho programů pro Windows jsou během instalace 1C v systému registrovány dva objekty COM - Automation Server a COM Connector. S oběma objekty můžete pracovat pomocí jazyka, který podporuje technologii COM.

Objekt Automation Server je aplikace 1C, která se téměř neliší od běžné klientské aplikace. Rozdíl je v tom, že navíc existuje příležitost ovládání programu instance aplikace. Při práci s objektem COM Connector je spuštěna odlehčená verze aplikace 1C, ve které nejsou k dispozici formuláře, stejně jako funkce a metody související s rozhraním a vizuální efekty. Samotná aplikace se spustí v režimu "Externí připojení". Inicializace globálních proměnných (například určení aktuálního uživatele a jeho nastavení) musí být provedena v modulu externího připojení 1C. Pokud je v režimu vnějšího připojení v kódu zavolána funkce, která není v tomto režimu dostupná, bude vyvolána výjimka (která bude předána našemu python skriptu). Volání nebezpečných funkcí by měla být orámována konstrukcemi formuláře

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

Vzhledem k tomu, že práce s objekty COM je technologie pouze pro okna, není divu, že není součástí standardní distribuce Pythonu. Budete muset nainstalovat rozšíření - sadu modulů, které poskytují všechny potřebné funkce pro programování pod Windows v Pythonu. Lze jej stáhnout jako již sestavený exe instalační program. Samotné rozšíření poskytuje přístup k registru, službám, objektům ODBC, COM a tak dále. Případně můžete rovnou nainstalovat distribuci ActiveState Python, ve které je rozšíření Win32 jako z krabice.

Nějakou dobu jsem experimentoval s COM připojením při vývoji webových aplikací, zejména osobního účtu. Byly zjištěny následující nevýhody:

Připojení COM je pomalé. Nízký výkon je známým mínusem technologie COM.
- Proces navázání spojení s 1C může v závislosti na konfiguraci trvat 1 až 8 sekund (v mém případě - 6 sekund). Netřeba říkat, že navázání připojení pro každý požadavek způsobí načtení každé stránky za 8 sekund.
- Protože webové aplikace pythonu fungují jako nezávislé servery, lze předchozí bod kompenzovat uložením připojení do nějaké globální proměnné a jeho obnovením v případě chyby. Jak udržet spojení v PHP, mě, upřímně řečeno, ještě nenapadlo.
- Ztracená webová aplikace pro různé platformy.

Na základě výše uvedených bodů bylo rozhodnuto změnit princip interakce a rozdělit jej na 2 části - první závislou na platformě (Windows), načítání dat 1C do libovolného vhodného formátu, a druhá, na platformě nezávislá, schopná pracovat s daty, aniž bychom měli v zásadě cokoli o 1C.

Akční strategie je následující: python skript se připojí k 1C, provede se správné dotazy a nahraje data do databáze SQLite. K této databázi se můžete připojit z Pythonu, PHP, Java. Většina našich projektů je v pythonu, a protože nesnáším ruční psaní raw SQL dotazů, veškerá práce s databází SQLite probíhá přes SQLAlchemy ORM. Bylo pouze nutné popsat datovou strukturu databáze v deklarativním stylu:

Z sqlalchemy.ext.declarative import declarative_base z sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Primary_key= True) účet = Column(Unicode(32), index=True) code = Column(Unicode(32)) adresa = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) ulice = Column(Unicode(256)) dům = Column(Integer) flat = Column(Integer) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "platby" # a tak dále...

Nyní stačí tento modul importovat do libovolného python projektu a můžete s daty pracovat.

Předvídám vaši otázku - "proč SQLite"? hlavní důvod- databáze je potřeba pouze pro čtení, takže bychom se neměli obávat problémů se zápisem na SQLite. Za druhé, formát tohoto DBMS je pohodlný - je pohodlnější jej prohlížet (existuje mnoho bezplatné služby, včetně super rozšíření pro FireFox). Za třetí, v některých případech bylo nutné získat přístup k předplatitelům z těch strojů, na kterých není připojení k serveru MySQL. V tomto případě stačí zkopírovat databázový soubor SQLite a na tomto stroji budete mít přístup ke všem informacím.

Vykládání probíhá jednou denně v noci. Zadávání dat do 1C lze automatizovat stejným způsobem. Například je nutné zaznamenat údaje zanechané předplatiteli na webových stránkách osobního účtu. V tomto případě se opět připojíme k 1C a programově vytvoříme a provedeme dokument „Act of Takeing Testimonies“. Níže poskytnu kód.

Práce s objekty COM v Pythonu je trochu neobvyklá. Za prvé, „pytonicita“ kódu je ztracena - pravidla pro pojmenování proměnných a funkcí v 1C, mírně řečeno, neodpovídají Zen of Python. Za druhé, každý ví, že objekty 1C se často nazývají znaky azbuky, což způsobí problémy při vývoji v Pythonu ... ale jsou řešitelné. Navrhuji, abyste se podívali 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)

Jak můžete vidět z kódu, klient je inicializován pro práci s 1C. Objekt COM je definován názvem "V82.COMConnector". Upozorňujeme, že tento název je platný pro platformu V8.2, pokud máte verzi 8.1, pak bude název „V81.COMConnector“.

Na inicializovaném klientovi zavoláme metodu Connect() a předáme jí připojovací řetězec. Řetězec se skládá z názvu serveru, databáze, uživatele a hesla. Výsledný objekt V82 ukládá připojení k aplikaci 1C. Nemá metodu Disconnect() ani nic podobného. K odpojení od báze stačí odstranit objekt z paměti funkcí del () nebo přiřadit proměnnou None.

S objektem můžete přistupovat ke všem polím a metodám globálního kontextu 1C, pracovat s univerzálními objekty, jako jsou TabularDocument, TableValues ​​atd. Je důležité si uvědomit, že při práci přes připojení COM pracuje 1C v režimu "Externí připojení". Neobsahuje žádné funkce pro interaktivní práci, jako jsou vyskakovací dialogy, upozornění a hlavně formuláře. Jsem si jistý, že nejednou budete proklínat vývojáře konfigurace, že nejdůležitější funkcionalitu zabalili do procedury Button1Press() v modulu formuláře dokumentu.

Pojďme se bavit o tak důležité věci, jako jsou atributy azbuky. Navzdory skutečnosti, že 1C je dvojjazyčné prostředí a pro každou ruskou metodu existuje anglický ekvivalent, dříve nebo později se budete muset obrátit na atribut azbuky. Pokud je zapnuto PHP jazyky nebo VBSCript to nezpůsobí žádné problémy,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Řetězec připojení") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... ..... AccountsWrite.Write()

Pak se kód pythonu jednoduše zhroutí s chybou syntaxe. Co dělat? Upravit konfiguraci? Ne, stačí použít metody getattr a setattr. Předáním objektu COM a názvu atributu cyrilice těmto funkcím můžete získat a nastavit hodnoty podle toho:

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

Důležité je následující: názvy atributů a také parametry funkcí a metod musí být předány v kódování cp1251. Proto, aby se předešlo zmatkům v kódování předem, má smysl jej deklarovat na začátku souboru: #coding=cp1251. Poté můžete řetězce předávat, aniž byste se museli starat o jejich kódování. Ale! Všechny řetězce přijaté od 1C (výsledky volání funkcí, požadavky) budou kódovány v UTF-8.

Příklad kódu, který provede dotaz v prostředí 1C, iteruje výsledek a uloží databázi do SQLite:

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS code, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS address, PersonalAccounts.Subscriber.Name AS fio, PersonalAccounts.Division.Name AS psu, Ac Oblečení. Dítě. Jméno jako mro z příručky. Málo důkazů jako obličejový popis levého spojení regestů. Charakteristiky signalizace. Následující (, vidcharakteristika = hodnota (příručka. Vidcharakteristika. Územní tvarovaná dohled. = V82.NewObject( "Dotaz", q) výběr = dotaz.Provést().Choose() 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 = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection.tso abonent.source = u"ASRN" abonent.np = výběr.np abonent.street = výběr.ulice abonent.house = výběr.dům abonent.byt = výběr.byt abonent.mro = výběr.mro CONN.add(abonent) CONN.commit()

Zde CONN je připojení k databázi SQLite. Vytvoří se objekt dotazu, vyplní se jeho text. Jak je uvedeno výše, text požadavku musí být v cp1251, pro které je kódování deklarováno jako první. Po provedení dotazu jsou všichni odběratelé smazáni v databázi, aby se nepřidávali duplikáty, pak jsou přidáváni v cyklu a následuje finální potvrzení.

Při práci s požadavky jsem objevil následující pravidla.

Při výběru polí jim dejte latinské názvy, bude mnohem pohodlnější k nim přistupovat pomocí selektoru (tečky), namísto getattr().
- Vyberte pouze primitivní datové typy: řetězce, čísla, data a booleany. Nikdy nevybírejte odkazy na objekt (dokument, adresář)! V tomto kontextu absolutně nepotřebujete reference a dokonce škodíte, protože jakýkoli přístup k atributu nebo metodě reference bude mít za následek požadavek prostřednictvím COM spojení. Pokud přistupujete k atributům odkazu ve smyčce, bude to extrémně pomalé.
- Pokud vyberete pole Datum, bude vráceno jako objekt PyTime. Jedná se o speciální datový typ pro předávání data/času při připojení COM. Není s ním tak pohodlné pracovat jako s běžným datetimem. Pokud tento objekt předáte int(), bude vráceno časové razítko, ze kterého pak můžete získat datetime pomocí metody fromtimestamp().

Nyní se podívejme, jak se tvoří tištěné dokumenty. Faktem je, že spotřebiteli musí být dána možnost stáhnout si předem připravené dokumenty, například potvrzení o platbě nebo doklad o odsouhlasení. Tyto dokumenty jsou generovány v 1C v souladu se stanovenými požadavky, jejich implementace v Pythonu zabere spoustu času. Proto je lepší generovat dokumenty v 1C a ukládat je do formátu excel.

Dokument aktu odsouhlasení je tedy generován speciálem externí zpracování. Pro ty, kteří nejsou obeznámeni s terminologií 1C: zpracování je samostatný program, která má svůj vlastní modul, formuláře, šablony, určené pro běh v prostředí 1C. Je potřeba inicializovat zpracování, vyplnit jeho údaje a zavolat funkci, která se nám vrátí tabulkový dokument, určený pro prohlížení v 1C. Tento dokument musí být uložen ve formátu Excel a zkopírován na server nebo zapsán do databáze.

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 (název) setattr(ExternalReport, "PersonalAccount", reference) table_doc = ExternalReport.GetDoc() cesta = 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(cesta, "rb").read() CONN.add(report)

Výše uvedený úryvek dělá následující. Zpracování, které tvoří dokument, je připojeno. Zpracování lze zabudovat do konfigurace, uložit na disk nebo do databáze 1C (v nějakém adresáři). Protože se zpracování často mění, aby se konfigurace neaktualizovala pokaždé, je nejčastěji se měnící zpracování uloženo v adresáři „ReportsSystem“ v atributu typu „value storage“ s názvem Report. Zpracování lze inicializovat jeho vyjmutím z databáze na disk a načtením, nebo metodou GetURL(), do které je potřeba předat odkaz na prvek adresáře a název atributu. Výslednému objektu zpracování přiřadíme hodnoty atributů, zavoláme exportovanou funkci GetDoc() a získáme tabulkový dokument, který se uloží do dočasného souboru aplikace Excel. Obsah tohoto souboru je zapsán do databáze SQlite.

Poslední věcí, kterou je třeba zvážit, je programové zadávání dat do 1C. Předpokládejme, že je nutné zadat indikace od účastníků. K tomu stačí vytvořit a provést dokument „Úkon o dokazování“:

#coding=cp1251 acts = getattr(V82.Documents, "Zákon o přijímání svědectví") act = Acts.CreateDocument() setattr(akt, "Indikace", 1024.23) setattr(akt, "Předplatitel", "Ivanov") # Vyplňování v dalších podrobnostech...act.Write()
Nyní je zadávání dat automatizované.

Nastínil jsem tedy metodu, která je založena na programovém nahrávání a stahování dat pomocí připojení COM. Tato metoda v mé organizaci úspěšně funguje již téměř rok. Základna, vytvořená z 1C, slouží 3 platebním systémům, získávání internetu (platba kartami přes internet) a také osobnímu účtu. Databáze je navíc propojena různé skripty pro rutinní automatizaci.

Přes nedostatky metody (pomalá rychlost připojení COM) obecně funguje stabilně. Máme data ve formě nezávislé na platformě (SQLite), se kterými lze pracovat z jakéhokoli jazyka. A hlavní část kódu je napsána v Pythonu, což znamená, že je k dispozici mnoho nástrojů a technik, o kterých se vám v 1C ani nesní.

Toto je jeden z možné způsoby interakce s 1C. Jsem si jist, že to není novinka a pravděpodobně to již někdo testoval a optimalizoval. Snažil jsem se však uvést co nejvíce podrobností procesu, abych vás uchránil před nástrahami, na které jsem sám šlápl.

Přeji vám všem hodně štěstí a pamatujte, že 1C není tak děsivé, jak je namalováno!

Tisknout (Ctrl+P)

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

com připojení

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

Vytvořte připojení OLE

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

Navažte spojení COM

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

Spojovací řetězec

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

Přerušení spojení

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

Metoda NewObject().

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

pro Konektor V83.COM

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

WidCOM = Connection.NewObject

pro V83.Aplikace

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

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

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

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

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

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

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

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

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

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

EndIf;

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

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

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

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

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

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

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

Jednou z možností výměny dat mezi databázemi 1C je výměna přes COM spojení.

Pomocí připojení COM se můžete připojit z jedné databáze 1C do druhé a číst nebo zapisovat data. Tuto metodu můžete použít jak ve verzích databází klient-server, tak v databázích souborů. V tomto článku budeme analyzovat příklady takových sloučenin. Příklady používají platformu 8.2.

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

Pojďme tedy začít

  1. Vytvoříme objekt COM
    • pro V82.Aplikace Connection = New COMObject("V82.Application" ) ;
    • pro Konektor V82.COM Connection = New COMObject("V82.COMConnector" ) ;
  2. Vytvoříme připojovací řetězec
    • pro serverovou verzi databáze ConnectionString = "Srvr = " "Název serveru" ";Ref = " "Název základny" ;
    • pro verzi souboru databáze ConnectionString = "File = " "PathKBase" "; Usr = Uživatelské jméno; Pwd = Heslo";
  3. Vytvoření připojení k databázi Pokus o připojení = připojení. Connect(ConnectionString) ; Výjimka Message = New MessageToUser; Zpráva. Text = + PopisChyby() ; Zpráva. Ohlásit() ; EndTry ;
  4. Odpojení od základny Připojení = Nedefinováno ;

    Pro objekt V82.Aplikace je povinné odpojit připojení, jinak zůstane nedokončená relace viset, která pak bude muset být ručně odstraněna. V případě Konektor V82.COM připojení se automaticky ukončí na konci procedury, ve které bylo připojení vytvořeno.A je tu ještě jeden malý okamžik.

    Pro uživatele, pod kterým je připojení navazováno, musí být v jeho nastavení deaktivováno zaškrtávací políčko „Při ukončení programu požádat o potvrzení“.

A teď dáme celý kód dohromady

Connection = New COMObject("V82.Application" ) ; //Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = ""Server1C"";Ref = ""MyBase""; Usr = Peter; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Peter; Pwd = 123"; Pokus o připojení = připojení. Connect(ConnectionString) ; Výjimka Message = New MessageToUser; Zpráva. Text = "Nelze se připojit k databázi"+ DescriptionError() ; Zpráva. Ohlásit() ; EndTry ; Připojení = Nedefinováno ;

Pro typ připojení V82.Aplikace metoda se použije na objekt COM, který byl původně vytvořen, a pro Konektor V82.COM metoda je aplikována na spojení. další práce s žádostí jde standardní prostředky 1C. v kódu to vypadá takto:

Požadavek = připojení. NewObject("Požadavek") ; // pro Konektor V82.COM Požadavek = připojení. NewObject("Požadavek") ; // pro V82.Aplikace Žádost. Text = "VYBRAT | Pozice organizací. Kodex, | Pozice organizací Název| OD | Adresář Pozice organizací AS Pozice organizací "; Výsledek = požadavek. Provést (); Ukázka = výsledek. Vybrat() ; Zatímco výběr. Next() Cyklus EndCycle ;

Pro verzi 1C:Enterprise 8.3 zůstává vše nezměněno, kromě toho, že při vytváření objektů COMObjects musíte použít "V83.COMConnector" nebo V83.Aplikace.