Come configurare smartphone e PC. Portale informativo
  • casa
  • Sicurezza
  • Connessione Com in un'applicazione gestita. V8: connessione COM

Connessione Com in un'applicazione gestita. V8: connessione COM

) Giusto

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


Questo è quello che sto dicendo, che sarebbe bello capire quanto ne hai bisogno senza leggere l'articolo di valutazione, o valutarlo in modo non così primitivo +/-. Quanto a ciò che mi è piaciuto, lo correggerei così: ha guadagnato tantissimo perché le stelle si sono allineate e molte persone si sono radunate sul sito e a molti è piaciuto, tu stesso capisci che è una questione di fortuna perché Non appena un articolo esce dalla pagina principale, può essere trovato solo su richiesta, quindi tutti quelli che passano votano. E, per quanto ho capito, commenti costanti = promozione dell'articolo ti consentono di mantenerlo nella pagina principale.
Proprio per questo hanno messo i negozi nelle strade pubbliche: dopo tutto, ciò che spesso è importante non è la qualità e la pertinenza della merce, ma la viabilità del luogo, spesso le persone che camminano comprano qualcosa che poi buttano via il giorno dopo; per il bene del processo. Questa è una malattia nota a tutti da tempo: la dipendenza dallo shopping. Oppure semplicemente aumentando il flusso aumenta la probabilità di trovare l’acquirente giusto.

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


Quelli. Un meno vale anche come “grazie”? Volevo sapere la tua opinione sull'opportunità di usarlo in questi casi e quanto pensano gli altri di essere interessanti? Dovresti metterlo quando l'articolo è dannoso/cattivo o quando è semplicemente inutile/vuoto per te?
Secondo me l’articolo sembra un semplice aumento di rating, perché:
1. Il problema con i tipi che ho citato è stato completamente ignorato dall'autore, sebbene non fosse troppo pigro per scrivere un sacco di commenti.
2. Nell'articolo c'è un'inesattezza evidente: si dice che questa sia l'unica strada

V82 = Nuovo COMObject("V82.ComConnector"); Codice = AccountCOM.Codice;


ma posso farlo facilmente utilizzando un'elaborazione come questa:

Report(Base. Directory. Controparti. Trova per nome("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 i problemi segnalati, ma non reagisca in alcun modo.
3. Ma c'è ancora un problema quando viene visualizzato l'errore "La classe non esiste".
4. Ma si verifica un problema quando viene installato 8.2 e poi viene installato 8.1: provare a scambiare tramite OLE/COM con uno scambio UT-BP standard!
5. Potresti indicare l'elaborazione principale del sito che ti consente di connetterti universalmente tramite OLE/COM in modo che i principianti non perdano tempo, scrivi per loro! A proposito, per qualche motivo la sua foto è sul tuo display, perché? E di conseguenza, 2 parole nel merito e altre 6 dietro le quinte.

In generale, non getto fango, ma segnalo lacune specifiche, ma non c'è reazione. Se questa è l'esperienza che stai condividendo, allora è in qualche modo errata e incompleta.
Il punto è che se l’autore avesse il desiderio di raccogliere tutti i difetti, potrebbe almeno ascoltare l’esperienza degli altri e non arrabbiarsi con i commenti. Si verifica immediatamente una situazione in cui chi lo legge sa più dell'autore, glielo dice (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 non è necessario concentrarsi sul fatto che volevi il meglio: io mostro ciò che è meglio e gli altri lo mostrano! Includilo nell'articolo e ne varrà la pena; non tutti sono interessati a leggere questa scaramuccia.

Per lo scambio di informazioni tra due banche dati senza caricamenti estranei e scambio di file non c'è niente di meglio di una connessione COM. Ed è difficile discuterne, perché l'utilizzo di questo tipo di connessione è abbastanza semplice e stabile. Ma in questo meccanismo c'è un collo di bottiglia e un posto spiacevole: stiamo parlando del tempo necessario per stabilire una connessione con un'altra base. In alcuni casi può raggiungere valori piuttosto elevati, ad es. essere molto lungo.

Qual è il problema?

Al momento della connessione tramite connessione COM, il database connesso carica completamente la configurazione del database a cui ci stiamo connettendo. Avendo provato, ad esempio, a connettersi al database di Enterprise Accounting, il tempo di attesa sarebbe stato piuttosto lungo, poiché il volume di configurazione ammonta a centinaia di megabyte. Diventa chiaro che per un funzionamento più rapido tutte le connessioni devono essere memorizzate nella cache e mantenute.

Analisi di performance

Chiediamoci se sia necessario memorizzare nella cache le connessioni e se ciò darà i suoi frutti quando l'utente lavorerà intensamente con una connessione COM. Misuriamo il tempo di connessione ad una configurazione da 20 kB.

Vediamo che la connessione a una base piccola ha richiesto 3,5 secondi. Quando ci si connette a un database più grande, il tempo aumenterà più volte.

Quando si memorizza una connessione mantenuta, queste azioni richiederanno diversi ordini di grandezza in meno.

Come possiamo mantenere attiva la nostra connessione COM?

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

Questi argomenti portano al fatto che l'archiviazione è possibile solo sul client in qualche variabile. Consideriamo l'opzione per un modulo gestito. È necessario inizializzare una variabile nel form con la direttiva &OnClient, dove salveremo i valori di connessione. Di conseguenza è possibile richiamare questo collegamento anche solo sul client, poiché non è possibile trasferire un oggetto COM dal client al server. Per i moduli regolari non esiste separazione tra server e client e questo meccanismo diventa ancora più semplice. Non dimenticare di chiudere la connessione prima di chiudere il modulo che stai utilizzando per evitare perdite di memoria.

Invece di uscita

Sebbene questo schema risolva alcuni problemi di prestazioni, è tutt'altro che ideale. Ogni modulo in cui sarà necessario supportare una connessione COM creerà una nuova sessione nell'infobase del ricevitore e di conseguenza sarà necessario un numero maggiore di licenze. Anche uno dei principali svantaggi è l'esclusione del supporto per la connessione al server

Nel prossimo articolo verrà preso in considerazione un metodo più avanzato che elimina questi problemi (connessione tramite servizi Web).


Parole chiave: COM, connessione, esterno, OLE, Automazione, Connect, ComConnector, Srvr

Quando si utilizzano connessioni COM 1C:Enterprise 8.0 per accedere ai dati, sono presenti i seguenti vantaggi rispetto all'utilizzo di un server di automazione:

  1. Creazione di una connessione più rapida, poiché non è necessario creare un processo separato del sistema operativo e tutte le azioni vengono eseguite all'interno del processo chiamante;

  2. Accesso più rapido alle proprietà e ai metodi degli oggetti 1C:Enterprise, poiché l'organizzazione di un accesso non richiede la comunicazione tra processi;
  3. Minore consumo di risorse del sistema operativo.

In generale, lavorare con 1C:Enterprise 8.0 tramite una connessione COM è simile a lavorare con 1C:Enterprise in modalità di automazione del server. Le differenze principali sono le seguenti:

  1. Nel caso di un server di automazione, viene avviata un'applicazione 1C:Enterprise 8.0 completa e, nel caso di una connessione COM, viene avviato un server COM in-process relativamente piccolo.

  2. Quando si lavora tramite una connessione COM, la funzionalità in un modo o nell'altro correlata all'organizzazione dell'interfaccia utente 1C:Enterprise 8.0 non è disponibile;
  3. Quando si utilizza una connessione COM, il modulo applicativo di configurazione 1C:Enterprise 8.0 non viene utilizzato. Il suo ruolo quando si lavora con una connessione COM è svolto dal modulo di connessione esterno.

1.1 Procedura per stabilire una connessione COM

Per organizzare l'accesso ai dati 1C:Enterprise 8.0 tramite una connessione COM, viene eseguita la seguente sequenza di azioni:

  1. viene creato un oggetto COM con l'identificatore V8.COMConnector, con l'aiuto del quale viene stabilita la connessione;

  2. viene richiamato il metodo Connect dell'oggetto V8.COMConnector creato in precedenza. Il metodo Connect restituisce un collegamento a un oggetto di connessione COM con l'infobase 1C:Enterprise 8.0;
  3. Attraverso l'oggetto di connessione COM ricevuto si accede ai metodi, alle proprietà e agli oggetti validi dell'infobase con cui viene stabilita la connessione.

Importante! A causa della mancanza di un'interfaccia utente in una connessione COM, non tutti gli oggetti, le proprietà e i metodi possono essere utilizzati in una connessione COM.

1C: Oggetti Enterprise accessibili dall'esterno tramite una connessione COM:

  1. Variabili esportate e procedure/funzioni del modulo join esterno

  2. Variabili esportate e procedure/funzioni dei moduli comuni
  3. Includere ed escludere interi moduli impostando le proprietà dei moduli comuni

  4. Includere ed escludere frammenti di moduli comuni utilizzando un preprocessore
  5. Contesto globale 1C:Enterprise 8.0, ad eccezione degli oggetti strettamente legati all'applicazione client (TextDocument, TabularDocument, ...)

1.2 Modulo di connessione esterno

Come già notato, le responsabilità del modulo applicativo quando si lavora tramite una connessione COM sono eseguite dal modulo di connessione esterno. Questo modulo può avere procedure di gestione eventi When SystemStarts() e WhenSystemCompletes(), che possono contenere azioni eseguite rispettivamente all'inizializzazione e alla terminazione della connessione.

Procedure, funzioni e variabili globali definite in un modulo join esterno con la parola chiave Export diventano, come nel caso di un modulo applicativo, parte del contesto globale.

1.3 Moduli comuni

Per i moduli comuni sono state introdotte le proprietà "Client", "Server" e "Connessione esterna". Hanno lo scopo di determinare nella configurazione l'utilizzo dei moduli nella versione client - server e in modalità di connessione COM.

1.4 Oggetto "V8.COMConnector"

L'unico compito risolto dall'oggetto COM V8.COMConnector è stabilire una connessione COM con la base di informazioni 1C:Enterprise 8.0. È possibile stabilire un numero illimitato di connessioni utilizzando un'istanza dell'oggetto V8.COMConnector. L'oggetto V8.COMConnector ha un singolo metodo Connect, progettato per stabilire una connessione COM con l'infobase 1C:Enterprise 8.0.

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

La linea di connessione con il sistema di sicurezza informatica è una catena di frammenti della forma Parametro=Valore. I frammenti sono separati tra loro da ";". Se un valore contiene spazi bianchi, deve essere racchiuso tra virgolette doppie (").

Parametri comuni:

Usr - nome utente;
Password: password.

Per la versione del file è definito il seguente parametro:

File: directory dell'infobase.

Per l'opzione client-server sono definiti i seguenti parametri:

Srvr - 1C: nome del server aziendale;
Rif: nome dell'infobase sul server.

Il metodo Connect stabilisce una connessione COM all'infobase 1C:Enterprise 8.0 e restituisce un collegamento all'oggetto connessione COM.

// Viene creato un oggetto connettore
V8 = Nuovo COMObject("V8.COMConnector");
// viene creato un oggetto di connessione COM
Connessione = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Direttore"";")

1.5 Oggetto connessione COM

Una connessione COM all'infobase 1C:Enterprise fornisce l'accesso completo al suo contesto globale (vedere “Contesto di esecuzione del modulo del programma”). Pertanto, una connessione COM può avere come metodi: costanti di sistema, valori specificati nel configuratore di oggetti a cui si accede tramite gestori (ad esempio costanti, enumerazioni, directory, documenti, log di documenti, report, elaborazioni, piani per tipi di caratteristiche, piani conti, piani di tipi di calcolo, registri), nonché variabili dichiarate nel modulo di connessione esterna con la parola chiave Esporta.

Inoltre, la connessione COM dispone di un metodo NewObject aggiuntivo che può essere utilizzato per creare valori di determinati tipi.

tz = Connessione. NuovoOggetto("TabellaValori");

Metodo stringa Consente di ottenere rappresentazioni di stringa dei valori 1C:Enterprise.

Visualizza = Connection.String(Data.UniqueIdentifier());

1.6. Caratteristiche di lavorare con una connessione COM

In Automation e in una connessione COM, TRUE e FALSE hanno i seguenti valori: -1 (meno uno) e 0.

È possibile organizzare un pool di connessioni COM. Allo stesso tempo, diversi oggetti di connessione COM vengono creati IN ANTICIPO sul server ricevente 1C:Enterprise e ci vuole ancora meno tempo per stabilire una connessione, poiché non è necessario creare un nuovo oggetto.

È stato implementato un nuovo oggetto Query Builder, progettato per generare testi di query in base alle impostazioni specificate. Questo oggetto supporta la funzionalità del generatore di report che non è correlata all'output del report in un documento di foglio di calcolo o ad altre attività correlate all'interfaccia utente. Questo oggetto può essere utilizzato sul server 1C:Enterprise e in una connessione COM.

È possibile utilizzare oggetti COM quando si esegue il linguaggio integrato sul server 1C:Enterprise.

Gli errori COM vengono convertiti in eccezioni di lingua incorporate.

Se la configurazione tenta di creare un oggetto non valido, ad esempio un foglio di calcolo, in un modulo di join esterno, in un modulo comune o in un modulo oggetto, la connessione COM potrebbe non essere stabilita o potrebbe essere terminata in via eccezionale.

Stampa (Ctrl+P)

Una delle opzioni per lo scambio di dati tra i database 1C è lo scambio tramite una connessione COM. Utilizzando una connessione COM, puoi connetterti da un database 1C a un altro e leggere o scrivere dati. Questo metodo può essere utilizzato sia nelle versioni client-server dei database che nei database di file. Questo articolo discute questi tipi di connessioni sulla piattaforma 8.3

connessione com

È possibile creare due tipi di oggetti COM per l'applicazione 1C. Queste sono vecchie connessioni V83.Applicazione e connessioni com V83.COMConnettore . In caso di V83.Applicazione Viene lanciata una copia quasi completa dell'applicazione 1C. In caso di utilizzo V83.COMConnettore Viene avviata una piccola parte del server. La velocità operativa in questo caso è maggiore, ma alcune funzioni potrebbero non essere disponibili. In particolare, lavorare con moduli e moduli comuni per i quali non è impostata la proprietà di lavorare con connessioni esterne. Per lo più dovresti usare V83.COMConnettore e solo in caso di mancanza di funzionalità V83.Applicazione. La differenza nella velocità operativa può essere particolarmente evidente nei database di grandi volumi. Per la piattaforma 8.2 utilizzato V82.Application o V82.COMConnector

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
Stringa di connessione= “Srvr = ““NomeServer” “;Rif = “ “NomeBase” ;
//Per l'opzione modalità file:
Stringa di connessione= "File = ""PathKBase" “; Usr = Nome Utente; Password = Password”;
Tentativo
Connessione = Connessione . Collegare(StringaConnessione) ;
Eccezione
Messaggio = Nuovo messaggio all'utente;
Messaggio . Testo = “Impossibile connettersi al database” + DescrizioneErrori(); Messaggio . Per segnalare();
Finetentativo;

Disconnessione

Connessione = Non definita;
Per oggetto V83.ApplicazioneÈ necessario terminare la connessione, altrimenti rimarrà una sessione incompleta che dovrà poi essere cancellata manualmente. In caso di V83.COMConnettore la connessione si interrompe automaticamente una volta completata la procedura con cui è stata effettuata la connessione. C'è ancora un piccolo punto. Per l'utente con cui viene effettuata la connessione, la casella di controllo "Richiedi 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 V83.COMConnettore

RichiestaCOM = Connessione. NuovoOggetto( "Richiesta ") ;
TabellaCOM = Connessione. NuovoOggetto( “Tabella dei valori”) ;
ArrayCOM = Connessione. NuovoOggetto("Array");

ViewCOM =Connessione.NuovoOggetto

Per V83.Applicazione

RichiestaOLE = Connessione. NuovoOggetto(" Richiesta ") ;
TableOLE = Connessione. NuovoOggetto(“Tabella dei valori”) ;
ArrayOLE = Connection.NewObject("Vettore");
ViewCOM =Connessione.NuovoOggetto("Identificatore univoco", StringUID);

RichiestaCOM . Testo ="SCEGLIERE
| Posizioni delle Organizzazioni.
| Posizioni delle organizzazioni.Nome
|DA | Directory.Posizioni delle organizzazioni
COME POSIZIONI DELLE ORGANIZZAZIONI”;

Risultato = RichiestaCOM. Correre();
Campione = Risultato. Scegliere () ;
Ciao selezione. Prossimo()Ciclo
FineCiclo;
Puoi anche utilizzare i gestori degli oggetti di configurazione:
DirectoryCOM = Connessione. Directory. Nome Directory;
DocumentCOM = Connessione. Documentazione. Nome del documento;
RegisterCOM = Connessione. Registri di informazione. NomeRegistro;

Ricezione e confronto dell'enumerazione tramite connessione COM

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

Articolo enum = Connection.Directories.Directory1.FindByCode(1).Props1;

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

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

Se EnumerationItemNumber = 0 Allora Report( "ValoreEnumerazione1");

ElseIfEnumerationItemNumber = 1 Poi Report("ValoreEnumerazione2");

finisci se;

Recupero di un oggetto tramite COM tramite identificatore

Attraverso i gestori di oggetti di configurazione otteniamo un oggetto com, ad esempio:
DocumentCOM = Connessione. Documentazione. Nome del documento;

Quindi otteniamo una stringa identificativa univoca:

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

Identificatore = Nuova U Identificatore univoco(StringUID);
CON linkByIdentifier = Documenti[NomeDocumento].GetLink(Identificatore);

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

WidCOM = Connessione.NewObject("Identificatore univoco", StringUID);
LinkByIdentifier = Connection.Documents[NomeDocumento].GetLink(WidCOM);

I migliori articoli sull'argomento