LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere La Campana?
Niente spam

Per lo scambio di informazioni tra due infobase senza upload e scambio di file estranei, non c'è niente di meglio di una connessione COM. Ed è difficile discuterne, perché l'uso di questo tipo di connessione è abbastanza semplice e stabile. Ma dentro e dentro questo meccanismo C'è un collo di bottiglia e un punto sgradevole, che è il tempo necessario per stabilire una connessione con un'altra base. In alcuni casi può raggiungere valori sufficientemente grandi, ad es. essere molto lungo.

Che cosa c'é?

Al momento della connessione tramite una connessione COM, la base da collegare carica completamente la configurazione della base alla quale ci stiamo connettendo. Avendo provato, ad esempio, a connettersi al database "Enterprise Accounting", i clic sarebbero durati abbastanza a lungo, poiché il volume di configurazione ammonta a centinaia di megabyte. Diventa chiaro che per di più lavoro veloce tutte le connessioni devono essere memorizzate nella cache e mantenute.

Analisi di performance

Chiediamoci se è necessario memorizzare nella cache le connessioni e se darà i suoi frutti con un intenso lavoro dell'utente con una connessione COM. Misuriamo il tempo di connessione a una configurazione di 20 KB.

Possiamo vedere che la connessione a un piccolo database ha richiesto 3,5 secondi. Quando ci si connette a un database più grande, il tempo aumenterà più volte.

Quando si memorizza una connessione supportata, questi passaggi richiederanno diversi ordini di grandezza in meno.

Come manteniamo attiva la nostra connessione COM?

Il problema è che la piattaforma 1C non fornisce mezzi standard per memorizzare le connessioni COM nella sicurezza delle informazioni. Non ha senso preservare la connessione nei libri di riferimento e nei documenti, poiché può cambiare spesso. L'opzione più promettente è memorizzare la connessione in un parametro di sessione. Ma anche qui non tutto è così liscio. Dopotutto, non esiste un tipo di dati adatto per l'archiviazione di una connessione COM.

Queste considerazioni portano al fatto che l'archiviazione è possibile solo sul client in alcune variabili. Consideriamo l'opzione per un modulo gestito. È necessario inizializzare nel form una variabile con la direttiva & OnClient, dove salveremo i valori di connessione. Di conseguenza, questa connessione può essere chiamata anche solo sul client, poiché non è possibile trasferire un oggetto COM dal client al server. Per i moduli regolari, non c'è separazione tra server e client e questo meccanismo diventa ancora più semplice. Ricordati di disconnetterti prima di chiudere il modulo che stai utilizzando per evitare perdite di memoria.

Invece di uscita

Benchè questo schema risolve alcuni problemi di prestazioni, ma è tutt'altro che ideale. Ogni modulo che deve mantenere una connessione COM creerà una nuova sessione in base di informazioni il destinatario, di conseguenza, saranno necessarie più licenze. Inoltre, uno dei principali svantaggi è l'esclusione del supporto per la connessione sul server

Il prossimo articolo esaminerà un modo migliore per eliminare questi problemi (connessione tramite servizi Web).

Stampa (Ctrl + P)

Una delle opzioni per lo scambio di dati tra le basi 1C è lo scambio tramite una connessione COM. Utilizzando una connessione COM, è possibile connettersi a un altro da un database 1C e leggere o scrivere dati. Questo metodo può essere utilizzato sia nelle versioni client-server dei database, sia in basi di file... Questo articolo discute questo tipo di connessioni sulla piattaforma 8.3

connessione com

È possibile creare due tipi di oggetti COM per un'applicazione 1C. È una connessione vecchia V83.Applicazione e connessioni com Connettore V83.COM ... In caso di V83.Applicazione viene lanciata quasi un'istanza a tutti gli effetti dell'applicazione 1C. In caso di utilizzo Connettore V83.COM un piccolo parte server... In questo caso la velocità operativa è maggiore, ma alcune funzioni potrebbero non essere disponibili. In particolare, lavorare con form e con moduli comuni per i quali non è impostata la proprietà di lavorare con join esterni. Per lo più devi usare Connettore V83.COM e solo in caso di mancanza di funzionalità V83.Applicazione... La differenza di velocità può essere particolarmente evidente su database di grandi dimensioni. Per la piattaforma 8.2 viene utilizzato V82.Applicazione o V82.COMConnettore

Stabilire una connessione OLE

Connessione = Nuovo COMObject ("V83.Application");

Stabilire una connessione COM

Connessione = Nuovo COMObject ("V83.COMConnector");

Stringa di connessione

// Per l'opzione client-server
StringConnection= “Srvr =“ “ServerName” “; Ref =“ “BaseName”;
// Per l'opzione della modalità file:
StringConnection= "File =" "Percorso alla base" “; Usr = NomeUtente; Pwd = Password ";
Tentativo
Connessione = Connessione ... Collegare(Stringa di connessione);
Eccezione
Messaggio = Nuovo messaggio all'utente;
Messaggio ... Testo = "Impossibile connettersi alla base" + DescrizioneErrori (); Messaggio ... Per segnalare();
Fine dei tentativi;

Interrompi la connessione

Connessione = Indefinito;
Per oggetto V83.Applicazioneè imperativo terminare la connessione, altrimenti resterà sospesa una sessione non terminata, che dovrà poi essere cancellata manualmente. In caso di Connettore V83.COM la connessione viene terminata automaticamente al termine della procedura in cui è stata effettuata la connessione.E c'è un altro piccolo momento. Per l'utente sotto il quale viene effettuata la connessione, la casella di controllo "Chiedi conferma alla chiusura del programma" deve essere disabilitata nelle sue impostazioni.

Metodo NewObject()

Per creare un nuovo oggetto, puoi utilizzare il metodo NewObject(), ad esempio:

per Connettore V83.COM

RichiestaCOM = Connessione. NuovoOggetto ( "Inchiesta ") ;
TabellaCOM = Connessione. NuovoOggetto ( "Tabella dei valori") ;
ArrayCOM = Connessione. NuovoOggetto ("Array");

WidCOM = Connection.NewObject

per V83.Applicazione

RichiestaOLE = Connessione. NuovoOggetto (“ Inchiesta ") ;
Tabella OLE = Connessione. NuovoOggetto("Tabella dei valori") ;
ArrayOLE = Connection.NewObject("Vettore");
WidCOM = Connection.NewObject(“UniqueIdentifier”, StringUID);

RichiestaCOM ... Testo ="SELEZIONARE
| Posizioni delle organizzazioni Codice,
| Posizioni delle organizzazioni.
| DA | Directory.Posizioni delle organizzazioni
AS Posizioni delle Organizzazioni”;

Risultato = RichiestaCOM. Correre ();
Campione = Risultato. Selezionare () ;
Durante il campionamento. Prossimo()Ciclo
Fine del ciclo;
Puoi anche usare i gestori di oggetti di configurazione:
RiferimentoCOM = Connessione. Libri di riferimento. Nome della directory;
documentoCOM = Connessione. I documenti. Nome del documento;
Registra COM = Connessione. Registri informativi... Nome del registro;

Ricezione e confronto di un'enumerazione su una connessione COM

Per confrontare i valori degli elementi di enumerazione definiti nella configurazione, è necessario convertire questi elementi in uno di tipi primitivi, il cui confronto non è difficile. Questi tipi possono essere di tipo numerico o stringa. Puoi convertire il valore di un elemento di enumerazione in un tipo numerico come questo

EnumerationElement = Connection.Directories.Directory1.FindByCode (1) .Props1;

PossibleValues ​​= EnumerationElement.Metadata().EnumerationValues;

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

Se EnumerationElementNumber = 0 Then Report ( "EnumerazioneValore1");

ElseIf EnumerationElementNumber = 1 Quindi Report (“EnumerationValue2”);

Finisci se;

Ottenere un oggetto tramite COM tramite identificatore

Tramite i gestori degli oggetti di configurazione, otteniamo un oggetto com, ad esempio:
documentoCOM = Connessione. I documenti. Nome del documento;

Quindi otteniamo la stringa identificativa univoca:

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

ID = Nuovo U IDunivoco (StringUID);
INSIEME A linkById = Documenti [NomeDocumento] .GetLink (ID);

Se hai bisogno di trovare un oggetto com per documento per identificatore, devi scrivere in questo modo:

WidCOM = Connection.NewObject(“UniqueIdentifier”, StringUID);
ReferenceById = Connection.Dokumenty [DocumentName] .GetLink (UidCOM);

Ciao Habravchans!

In questo articolo, voglio parlare di come si stabilisce l'integrazione con la piattaforma 1C nella mia organizzazione. Quello che mi ha spinto a farlo è stata l'assenza quasi totale informazioni tecniche su questo argomento. Leggendo vari articoli e rapporti sul tema del collegamento di 1C con qualsiasi sistema informativo, più e più volte sei convinto che siano tutti di marketing, dimostrativi e mai tecnici, che riflettono il problema e l'essenza della sua soluzione.

Ti avverto che il metodo non pretende in alcun modo di essere universale. Poiché ci sono molte configurazioni 1C stesse, e sistemi di informazione, lingue e piattaforme - ancora di più, il numero di combinazioni possibili è enorme. Il mio obiettivo è dimostrare una delle possibili soluzioni.


Ho scelto Python come linguaggio che si integrerà con 1C. È molto adatto per l'automazione dei processi. Ciò è facilitato dalla sintassi minimalista (il codice viene digitato molto rapidamente), dalla ricca libreria standard (meno necessità di moduli di terze parti), multipiattaforma - con un'alta probabilità, il codice scritto nel sistema operativo Linix funzionerà con successo su Finestre.

Per cominciare, delineerò i dati con cui lavoreremo. L'organizzazione, una società di vendita di energia nella regione dell'Estremo Oriente, serve circa 400 mila abbonati, base 1C su una configurazione auto-scritta. Per ogni abbonato vengono memorizzati i suoi pagamenti, addebiti, servizi consumati e schemi di calcolo, dispositivi di misurazione, letture e molti altri dati.

Una volta nell'organizzazione c'era un programma scritto in Delphi e che usava MSSQL/Firebird come database. In quei tempi gloriosi, era possibile connettersi al database utilizzando qualsiasi lingua ed eseguire molte azioni: selezionare gli abbonati debitori, inviare i pagamenti ricevuti, registrare le letture degli strumenti. Non sorprende che la raccolta di script che automatizzano la routine sia cresciuta costantemente. I programmatori possono eseguire qualsiasi azione senza aprire il programma stesso.

Purtroppo, con il passaggio a 1C, l'omaggio è terminato: non era più possibile connettersi direttamente alla base. In generale, la stessa piattaforma 1C è indivisibile e non va bene per l'integrazione con altri sistemi. Lei, come si dice, è una cosa in sé. Quando carichi i dati in 1C, dovresti ricordare che non sarà così facile estrarli da lì. Ma in considerazione del fatto che l'organizzazione aveva bisogno di implementare sistemi di pagamento e Area Personale, era necessario trovare un qualche tipo di soluzione.

I compiti principali che mi aspettavano erano la capacità di ottenere rapidamente dati su uno specifico account personale- Nome completo, indirizzo, dispositivi di misurazione, letture dello strumento, pagamenti, addebiti. Oltre alla formazione di documenti: un atto di riconciliazione, una ricevuta di pagamento. Quindi, non esiste una connessione diretta al database: tutti coloro che hanno esaminato il database 1C sul server SQL hanno visto che era difficile comprendere la massa di tabelle del formato aaa1, aaa2. E costruire query con tali nomi di tabelle e campi è semplicemente irrealistico. Inoltre, molte tabelle 1C (soprattutto le più importanti, come un taglio di quest'ultima, residui e rivoluzioni) sono virtuali e sparse su diverse tabelle fisiche, raccolte da più join. Questo metodo non è adatto.

La piattaforma 1C offre la possibilità di connettersi ad essa tramite una connessione COM. Come molti programmi Windows, durante l'installazione di 1C, nel sistema vengono registrati due oggetti COM: Automation Server e COM Connector. Puoi lavorare con entrambi gli oggetti utilizzando un linguaggio che supporti la tecnologia COM.

L'oggetto Automation Server è un'applicazione 1C che non è quasi diversa da una normale applicazione client. La differenza è che in più c'è un'opportunità controllo del programma un'istanza dell'applicazione. Quando si lavora con l'oggetto COM Connector, viene avviata una versione leggera dell'applicazione 1C, in cui non sono disponibili moduli, funzioni e metodi relativi all'interfaccia e agli effetti visivi. L'applicazione stessa viene avviata nella modalità "Connessione esterna". Inizializzazione delle variabili globali (ad esempio, definendo utente attuale e le sue impostazioni) devono essere eseguite nel modulo di connessione esterno 1C. Se nella modalità di connessione esterna nel codice viene chiamata una funzione che non è disponibile in questa modalità, verrà sollevata un'eccezione (che verrà passata al nostro script python). Le chiamate di funzioni non sicure dovrebbero essere circondate da costrutti come

# If NOT OuterConnection Then Warning ("Ciao!"); # Finisci se

Poiché lavorare con oggetti COM è una tecnologia esclusivamente di Windows, non sorprende che sia assente nel pacchetto Python standard. Dovrai installare un'estensione: un insieme di moduli che forniscono l'intero funzionalità richiesta per la programmazione Windows in Python. Può essere scaricato come un programma di installazione exe già assemblato. L'estensione stessa fornisce l'accesso al registro, ai servizi, agli oggetti ODBC, COM, ecc. In alternativa, puoi installare immediatamente la distribuzione ActiveState Python, che viene fornita con l'estensione Win32 pronta all'uso.

Da tempo ho sperimentato la connessione COM nello sviluppo di applicazioni web, in particolare il mio account personale. Sono stati individuati i seguenti svantaggi:

La connessione COM è lenta. Le scarse prestazioni sono un noto svantaggio della tecnologia COM.
- Il processo per stabilire una connessione con 1C, a seconda della configurazione, può richiedere da 1 a 8 secondi (nel mio caso, 6 secondi). Inutile dire che stabilire una connessione per ogni richiesta comporterà il caricamento di ogni pagina in 8 secondi.
- Poiché le applicazioni web in Python funzionano come server indipendenti, il punto precedente può essere compensato memorizzando la connessione in qualche variabile globale e, in caso di errore, ripristinandola. Ad essere onesti, non ho pensato a come mantenere una connessione in PHP.
- La funzionalità multipiattaforma dell'applicazione web è persa.

Sulla base dei punti sopra elencati, è stato deciso di modificare il principio di interazione, dividendolo in 2 parti: la prima dipendente dalla piattaforma (Windows), che scarica i dati 1C in un formato conveniente e la seconda, indipendente dalla piattaforma, in grado di lavorare con i dati senza sospettare nulla di 1C in linea di principio.

La strategia di azione è la seguente: lo script python si connette a 1C, esegue le richieste necessarie e carica i dati su Base SQLite... Puoi connetterti a questo database da Python, PHP, Java. La maggior parte dei nostri progetti funziona in Python e, poiché non sopporto di scrivere query SQL grezze a mano, tutto il lavoro con il database SQLite viene eseguito tramite SQLAlchemy ORM. Era solo necessario descrivere la struttura dei dati del database in uno stile dichiarativo:

From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBey, ForeignKey Base = declarative_base () class Abonent (Base): __tablename__ = "abonents" id = Column (Integer, primary_key = True) account = Colonna (Unicode (32), indice = True) codice = Colonna (Unicode (32)) indirizzo = Colonna (Unicode (512)) fio = Colonna (Unicode (256)) source = Colonna (Unicode (16) ) psu = Colonna (Unicode (256)) tso = Colonna (Unicode (256)) np = Colonna (Unicode (256)) street = Colonna (Unicode (256)) house = Colonna (intero) flat = Colonna (intero) mro = Colonna (Unicode (256)) classe Pagamento (Base): __nometabella__ = "pagamenti" # e così via...

Ora è sufficiente importare questo modulo in qualsiasi progetto Python e puoi lavorare con i dati.

Prevedo la tua domanda: "perché SQLite"? Il motivo principale è che il database è di sola lettura, quindi i problemi con la scrittura su SQLite non dovrebbero preoccuparci. In secondo luogo, il formato di questo DBMS è conveniente: è più conveniente visualizzarlo (ce ne sono molti utilità gratuite, inclusa una superestensione per FireFox). In terzo luogo, in alcuni casi era necessario ottenere l'accesso agli abbonati da quelle macchine che non hanno una connessione al server MySQL. In questo caso è sufficiente copiare il file del database SQLite e questa macchina avrà accesso a tutte le informazioni.

Lo scarico avviene una volta al giorno di notte. L'inserimento dei dati in 1C può essere automatizzato allo stesso modo. Ad esempio, è necessario registrare le letture lasciate dagli abbonati sul sito web del proprio account personale. In questo caso, ci colleghiamo di nuovo a 1C e programmaticamente creiamo e realizziamo il documento "L'atto di prendere letture". Fornirò il codice sotto.

Lavorare con oggetti COM in Python è un po' insolito. Innanzitutto, la "pitonicità" del codice è persa: le regole per nominare variabili e funzioni in 1C, per usare un eufemismo, non corrispondono allo Zen di Python. In secondo luogo, tutti sanno che gli oggetti 1C sono spesso chiamati caratteri cirillici, il che causerà problemi durante lo sviluppo in Python ... ma possono essere risolti. Ti suggerisco di familiarizzare con il codice:

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

Come puoi vedere dal codice, il client è inizializzato per funzionare con 1C. L'oggetto COM è definito dal nome "V82.COMConnector". Si prega di notare che questo nome è valido per la piattaforma V8.2, se si dispone della versione 8.1, il nome sarà "V81.COMConnector".

Su un client inizializzato, chiamiamo il metodo Connect(), passandogli una stringa di connessione. La stringa è composta dal nome del server, dal database, dall'utente e dalla password. L'oggetto V82 risultante memorizza la connessione con l'applicazione 1C. Non ha un metodo Disconnect() o qualcosa del genere. Per disconnettersi dalla base è sufficiente cancellare l'oggetto dalla memoria tramite la funzione del() oppure assegnarlo alla variabile None.

Avendo un oggetto, puoi accedere a qualsiasi campo e metodo del contesto globale 1C, operare con oggetti universali come TabularDocument, TableValues, ecc. È importante tenere presente che quando si lavora tramite una connessione COM, 1C opera in modalità "Connessione esterna". Non fornisce alcuna funzionalità interattiva, come finestre di dialogo popup, notifiche e, soprattutto, moduli. Sono sicuro che maledirai più di una volta gli sviluppatori della configurazione, che racchiudono le funzionalità più importanti nella procedura Button1Click () nel modulo del modulo del documento.

Parliamo di una cosa così importante come gli attributi cirillici. Nonostante il fatto che 1C sia un ambiente bilingue e per ogni metodo russo esista un analogo in lingua inglese, prima o poi sarà necessario ricorrere all'attributo cirillico. Se attivo Linguaggi PHP o VBSCript non causerà alcun problema,

Set Con = CreateObject ("v81.COMConnector") Set v8 = Con.Connect ("ConnectionString") Set AccountsManager = v8.Documents.Invoices .... Set AccountsRecord = AccountsManager.CreateElement () AccountsRecord.Contractor = .... .... AccountScrivi.Scrivi ()

Quindi il codice Python si bloccherà semplicemente con un errore di sintassi. Cosa fare? Modifica configurazione? No, è sufficiente utilizzare i metodi getattr e setattr. Passando l'oggetto COM e il nome cirillico dell'attributo a queste funzioni, è possibile ottenere e impostare i valori di conseguenza:

# coding = cp1251 catalog = getattr (V82.Catalogs, "Account personali")

È importante quanto segue: i nomi degli attributi, così come i parametri di funzioni e metodi, devono essere passati nella codifica cp1251. Pertanto, per evitare in anticipo il percorso di codifica, ha senso dichiararlo all'inizio del file: # coding = cp1251. Successivamente, puoi trasferire le stringhe senza preoccuparti della loro codifica. Ma! Tutte le stringhe ricevute da 1C (risultati di chiamate di funzione, richieste) verranno codificate in UTF-8.

Un esempio di codice che esegue una query in un ambiente 1C, scorre il risultato e salva il database in SQLite:

# coding = cp1251 q = "" "SELECT PersonalAccounts.Code AS code, PersonalAccounts.Structure.PopulatedPart.Name +", "+ PersonalAccounts.ShortAddress AS indirizzo, PersonalAccounts.A subscriber.Nome AS fio, PersonalAccounts.CA Divisione psu.Nome EXPRESS (Caratteristiche PersonalAccountsSliceLast.Value AS Directory.TerritoriallyNetworkOrganizations) .Nome AS tso, PersonalAccounts.Structure.PopolatedPart.Name AS np, PersonalAccounts.Via.Room.Room.Number.AS. Street, Face.Accounts. , PersonalAccounts.Division.Parent. Nome AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT JOIN Data Register.CharacteristicsPersonalAccounts.SliceLast (, TypeCharacteristics = VALUE (Directory.TypesCharacteristics. = V82.NewObject ( "Query", q) selection = query.Execute ().Scegli () 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 = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add (abonent) CONN.commit ()

Qui CONN è una sessione per connettersi al database SQLite. L'oggetto query viene creato, il suo testo viene riempito. Come notato sopra, il testo della richiesta deve essere in cp1251, per il quale viene dichiarata per prima la codifica. Dopo aver eseguito la richiesta, tutti i sottoscrittori vengono eliminati nel database in modo da non aggiungere duplicati, quindi vengono aggiunti in un ciclo e segue il commit finale.

Quando si lavora con le query, ho trovato le seguenti regole.

Quando si scelgono i campi, assegna loro nomi in lettere latine, sarà molto più comodo fare riferimento ad essi tramite un selettore (punto), anziché getattr ().
- Scegli solo tipi di dati primitivi: stringhe, numeri, data e booleani. Non selezionare mai riferimenti a un oggetto (documento, riferimento)! In questo contesto, i collegamenti sono assolutamente inutili per te e persino dannosi, perché qualsiasi chiamata a un props o a un metodo di collegamento porterà a una richiesta tramite una connessione COM. Se accedi agli attributi del collegamento in un ciclo, sarà estremamente lento.
- Se selezioni un campo Data, verrà restituito come oggetto PyTime. Questo è un tipo di dati speciale per il passaggio di data/ora in una connessione COM. Non è così conveniente lavorarci come con il solito datetime. Se passi questo oggetto a int(), verrà restituito il timestamp, dal quale puoi ottenere il datetime usando il metodo fromtimestamp().

Ora diamo un'occhiata a come si formano i documenti stampati. Il fatto è che al consumatore deve essere data l'opportunità di scaricare documenti già preparati, ad esempio una ricevuta di pagamento o un rapporto di riconciliazione. Questi documenti sono generati in 1C in conformità con i requisiti stabiliti, la loro implementazione in Python richiederà molto tempo. Pertanto, è meglio generare documenti in 1C e salvarli in Formato Excel.

Quindi, il documento dell'atto di riconciliazione è generato da uno speciale elaborazione esterna... Per coloro che non hanno familiarità con la terminologia 1C: processing è un programma autonomo che ha il proprio modulo, moduli, modelli, progettato per essere eseguito in un ambiente 1C. È necessario inizializzare l'elaborazione, inserire i suoi dettagli e chiamare una funzione che ci restituirà foglio di calcolo, destinato alla visualizzazione in 1C. Questo documento deve essere salvato in formato Excel e copiato sul server o scritto nel database.

Link = getattr (V82.Catalogs, "SystemReports"). FindByDescription ("Elaine Reconciliation Act") nav_url = V82.GetURL (link, "Report") name = V82.ExternalReports.Connect (nav_url) ExternalReport = V82.ExternalReports.Creport (nome) setattr (ExternalReport, "Conto personale", riferimento) table_doc = ExternalReport.GetDoc () percorso = V82.GetTempFileName ("xls") table_doc.Write (percorso, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report () report .account = reference.Code.strip() report.type = u "act" report.document = open (percorso, "rb") read() CONN.add (report)

Il frammento di cui sopra fa quanto segue. L'elaborazione che forma il documento è connessa. L'elaborazione può essere incorporata nella configurazione, archiviata su disco o nel database 1C (in una sorta di libro di riferimento). Poiché i trattamenti cambiano frequentemente, in modo che ogni volta che la configurazione non viene aggiornata, i trattamenti che cambiano più frequentemente vengono memorizzati nella directory "Report di sistema", nell'attributo del tipo "value store" denominato Report. L'elaborazione può essere inizializzata scaricandola dal database su disco e caricandola, oppure utilizzando il metodo GetURL(), in cui è necessario passare un collegamento a un elemento del catalogo e il nome di un attributo. Assegniamo i valori degli attributi all'oggetto di elaborazione ricevuto, chiamiamo la funzione esportata GetDoc (), otteniamo un documento del foglio di calcolo che viene salvato in un file Excel temporaneo. Il contenuto di questo file viene scritto nel database SQLite.

L'ultima cosa che resta da considerare è l'inserimento software dei dati in 1C. Supponiamo di voler inserire le letture degli abbonati. Per fare ciò, è sufficiente creare ed eseguire il documento "L'atto di prendere letture":

# coding = cp1251 act = getattr (V82.Documents, "Acceptance Act") act = act.CreateDocument () setattr (act, "Indication", 1024.23) setattr (act, "Subscriber", "Ivanov") # Compilando altro dettagli. .. act.Write ()
Ora l'inserimento dei dati è automatizzato.

Quindi, ho delineato un metodo basato sullo scaricamento e il caricamento di dati a livello di codice utilizzando una connessione COM. Questo metodo funziona con successo nella mia organizzazione da quasi un anno. La base, formata da 1C, serve 3 sistemi di pagamento, Internet acquiring (pagamento con carte via Internet), nonché un account personale. Inoltre, vari script sono collegati al database per automatizzare la routine.

Nonostante le carenze del metodo (bassa velocità della connessione COM), in generale funziona stabilmente. Disponiamo di dati in una forma indipendente dalla piattaforma (SQLite) con cui è possibile lavorare da qualsiasi lingua. E la parte principale del codice è scritta in Python, il che significa che ci sono molti strumenti e tecniche disponibili che non possono nemmeno essere sognati in 1C.

Questo è uno di modi possibili interazione con 1C. Sono sicuro che non è nuovo e probabilmente è già stato testato e ottimizzato da qualcuno. Tuttavia, ho cercato di indicare i massimi dettagli del processo per salvarti dalle insidie ​​​​che io stesso ho calpestato.

Auguro a tutti buona fortuna e ricordate che 1C non è così spaventoso come è dipinto!

) Giusto

Allo stesso tempo, ho visto più di una volta quando le pubblicazioni che non hanno tirato nemmeno di 10 punti hanno semplicemente "decollato".
Perché è successo? Apparentemente perché a qualcuno chiaramente piacevano.


Parlo di questo e dico che sarebbe bello non leggere l'articolo sul rating per capire quanto ne hai bisogno, o per valutarlo non così primitivamente +/-. Per quanto riguarda quello che mi è piaciuto, lo correggerei così: ha segnato così tanto a causa del fatto che le stelle si sono formate in questo modo e molte persone si sono riunite sul sito e a molti è piaciuto, tu stesso capisci che è una questione di possibilità, t. appena l'articolo esce home page allora si può già trovare solo su richiesta, e così tutti passano per voto. E per mantenere sulla pagina principale, per quanto ho capito, sono solo commenti costanti = promozione dell'articolo che consente.
È per questo che aprono negozi per le strade - dopotutto, spesso non è la qualità e la pertinenza della merce che è importante, ma la permeabilità del luogo, le persone che camminano spesso comprano ciò che buttano via il giorno dopo, solo per il bene del processo. Questa è una malattia nota a tutti da molto tempo: la shopomania. Oppure, aumentare semplicemente il flusso aumenta la probabilità dell'acquirente giusto.

E i pro e i contro... sono solo una sorta di "grazie" per il tempo e il lavoro spesi


Quelli. meno è considerato anche un "grazie"? Quindi volevo sapere il tuo atteggiamento sul fatto che sia necessario metterlo in questi casi e quanto pensano gli altri interessanti? Sia metterlo quando l'articolo è dannoso/cattivo o quando è semplicemente inutile/vuoto per te.
A mio avviso, l'articolo si presenta come un semplice aumento della valutazione, perché:
1. Il problema con i tipi da me citati è stato generalmente ignorato dall'autore, sebbene non fosse troppo pigro per scrivere un mucchio di commenti.
2. C'è una chiara inesattezza nell'articolo: si dice che questo è l'unico modo

V82 = Nuovo oggetto COM ("V82.ComConnector"); Codice = ControparteSOM.Codice;


ma lo faccio tranquillamente usando un'elaborazione come questa:

Report (Base. Libri di riferimento. Appaltatori. FindByName ("LLC"). Codice);


e va tutto bene! E scelgo la connessione V82.ComConnector
È in qualche modo strano che all'autore non importi affatto che il suo articolo contenga tali problemi come indicato, ma non reagisce in alcun modo.
3. Ma c'è ancora un problema quando viene visualizzato l'errore "La classe non esiste"
4. E c'è un problema quando è installato 8.2, quindi 8.1 è installato: prova a scambiare su OLE / COM con un tipico scambio UT-BP!
5. Potresti indicare la lavorazione principale sul sito che ti permette di connetterti universalmente via OLE/COM in modo che i neofiti non perdano tempo, scrivi per loro! Lo stesso dal modo in cui la sua foto per qualche motivo ostenta, perché dovrebbe?. Di conseguenza, 2 parole in sostanza e altre 6 dietro le quinte.

In generale, non lancio fango, ma indico spazi specifici, ma le reazioni sono zero. Se questa è l'esperienza che stai condividendo, allora è una sorta di errore e incompleto.
Quello che voglio dire è che se l'autore avesse il desiderio di raccogliere tutti i glitch, allora potrebbe almeno ascoltare l'esperienza di qualcun altro e non aggredire i commenti. Immediatamente, si verifica una situazione in cui chi lo ha letto ne sa più dell'autore, glielo dicono (a volte in modo errato) e anche lui reagisce. Di conseguenza, tutte le informazioni non sono nell'articolo, ma nei commenti! È divertente! Questo accade spesso, ma allo stesso tempo non è necessario riposare su ciò che volevi essere il migliore: lo mostro il meglio e gli altri lo mostrano! Includi questo nell'articolo e ne varrà la pena, non tutti sono interessati a leggere questa scaramuccia.

Una delle opzioni per lo scambio di dati tra le basi 1C è lo scambio tramite una connessione COM.

Utilizzando una connessione COM, è possibile connettersi a un altro da un database 1C e leggere o scrivere dati. Questo metodo può essere utilizzato sia nelle versioni client-server dei database, sia nei database di file. In questo articolo analizzeremo esempi di questo tipo di connessioni. Gli esempi utilizzano la piattaforma 8.2.

È possibile creare due tipi di oggetti COM per un'applicazione 1C. esso V82.Applicazione e Connettore V82.COM... In caso di V82.Applicazione viene lanciata quasi un'istanza a tutti gli effetti dell'applicazione 1C. in caso di utilizzo Connettore V82.COM si avvia una piccola parte del server.
In questo caso la velocità operativa è maggiore, ma alcune funzioni potrebbero non essere disponibili. In particolare, lavorare con form e con moduli comuni per i quali non è impostata la proprietà di lavorare con join esterni. Per lo più devi usare Connettore V82.COM e solo in caso di mancanza di funzionalità V82.Applicazione... La differenza di velocità può essere particolarmente evidente su database di grandi dimensioni.

Quindi iniziamo

  1. Creiamo un oggetto COM
    • per V82.Applicazione Connessione = Nuovo COMObject ("V82.Application");
    • per Connettore V82.COM Connessione = Nuovo COMObject ("V82.COMConnector");
  2. Formiamo una stringa di connessione
    • per la versione server del database ConnectionString = "Srvr =" "ServerName" "; Ref =" "BaseName";
    • per la versione del file del database ConnectionString = "File =" "Path to Base" "; Usr = Nome utente; Pwd = Password";
  3. Ci colleghiamo alla base Tentativo di connessione = Connetti. Connetti (stringa di connessione); Messaggio di eccezione = Nuovo messaggio all'utente; Messaggio. Text = + DescriptionErrors (); Messaggio. Per segnalare(); Fine dei tentativi;
  4. Rompiamo la connessione con la base Connessione = Indefinito;

    Per oggetto V82.Applicazioneè imperativo terminare la connessione, altrimenti resterà sospesa una sessione non terminata, che dovrà poi essere cancellata manualmente. In caso di Connettore V82.COM la connessione viene terminata automaticamente al termine della procedura in cui è stata effettuata la connessione.E c'è un altro piccolo momento.

    Per l'utente sotto il quale viene effettuata la connessione, la casella di controllo "Chiedi conferma alla chiusura del programma" deve essere disabilitata nelle sue impostazioni.

Ora mettiamo insieme tutto il codice.

Connessione = Nuovo COMObject ("V82.Application"); // Connection = New COMObject ("V82.COMConnector"); ConnectionString = "Srvr =" "Server1C" "; Ref =" "MyBase" "; Usr = Petya; Pwd = 123"; // ConnectionString = "File =" "С: \ MyBase" "; Usr = Petya; Pwd = 123"; Tentativo di connessione = Connetti. Connetti (stringa di connessione); Messaggio di eccezione = Nuovo messaggio all'utente; Messaggio. Testo = "Impossibile connettersi al database"+ DescrizioneErrori (); Messaggio. Per segnalare(); Fine dei tentativi; Connessione = Indefinito;

Per tipo di connessione V82.Applicazione il metodo viene utilizzato per un oggetto COM che è stato originariamente creato e per Connettore V82.COM il metodo viene applicato alla connessione. ulteriore lavoro con la richiesta va con mezzi standard 1C. nel codice appare così:

Richiesta = Connessione. NuovoOggetto ("Richiesta"); // per Connettore V82.COM Richiesta = Connessione. NuovoOggetto ("Richiesta"); // per V82.Applicazione Inchiesta. Testo = "SELEZIONA" | Posizioni delle organizzazioni Codice, | Posizioni delle organizzazioni.| DA | Directory. Posizioni delle organizzazioni AS Posizioni delle organizzazioni "; Risultato = Richiesta. Correre (); Campione = Risultato. Selezionare() ; Durante il campionamento. Successivo () Ciclo Fine del Ciclo;

Per la versione 1C: Enterprise 8.3, tutto rimane invariato, tranne che quando si creano oggetti COM, è necessario utilizzare "Connettore V83.COM" o "V83.Applicazione".

LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere La Campana?
Niente spam