Join sinistro e destro nelle query 1c. TIPO a richiesta

Il linguaggio di query è uno dei meccanismi fondamentali di 1C 8.3 per gli sviluppatori. Utilizzando le query, puoi recuperare rapidamente tutti i dati archiviati nel database. La sua sintassi è molto simile a SQL, ma presenta alcune differenze.

I principali vantaggi del linguaggio di query 1C 8.3 (8.2) rispetto a SQL:

  • dereferenziare i campi di riferimento (riferire uno o più punti ai dettagli dell'oggetto);
  • lavorare con i risultati è molto conveniente;
  • la possibilità di creare tabelle virtuali;
  • la richiesta può essere scritta sia in inglese che in russo;
  • capacità di bloccare i dati per evitare situazioni di stallo.

Svantaggi del linguaggio di query in 1C:

  • a differenza di SQL, in 1C le query non consentono la modifica dei dati;
  • mancanza di procedure memorizzate;
  • impossibilità di convertire una stringa in un numero.

Diamo un'occhiata al nostro mini tutorial sui costrutti base del linguaggio di query 1C.

Dato che le query in 1C consentono solo di ricevere dati, qualsiasi query deve iniziare con la parola "SELECT". Dopo questo comando vengono indicati i campi da cui devono essere ricavati i dati. Se si specifica "*", verranno selezionati tutti i campi disponibili. Dopo la dicitura “DA” è indicato il luogo dal quale verranno prelevati i dati (documenti, registri, elenchi, ecc.).

Nell'esempio discusso di seguito, i nomi dell'intera nomenclatura vengono selezionati dalla directory “Nomenclatura”. Dopo la parola “COME” vengono indicati gli alias (nomi) delle tabelle e dei campi.

SCEGLIERE
Nomenclatura Nome AS Nome della nomenclatura
DA
Directory.Nomenclature AS Nomenclatura

Accanto al comando "SELEZIONA" è possibile specificare parole chiave:

  • VARIE. La query selezionerà solo le righe che differiscono in almeno un campo (senza duplicati).
  • PRIMO n, Dove N– il numero di righe dall'inizio del risultato che devono essere selezionate. Molto spesso, questa costruzione viene utilizzata insieme all'ordinamento (ORDER BY). Ad esempio, quando è necessario selezionare un certo numero di documenti recenti per data.
  • CONSENTITO. Questa struttura consente di selezionare dal database solo i record disponibili per l'utente corrente. In base all'utilizzo di questa parola chiave, l'utente riceverà un messaggio di errore quando tenta di interrogare i record a cui non ha accesso.

Queste parole chiave possono essere utilizzate insieme o separatamente.

PER CAMBIARE

Questa proposta blocca i dati per prevenire conflitti reciproci. I dati bloccati non verranno letti da un'altra connessione fino al termine della transazione. In questa clausola è possibile specificare tabelle specifiche che devono essere bloccate. Altrimenti verranno tutti bloccati. Il design è rilevante solo per la modalità di blocco automatico.

Molto spesso, la clausola "FOR CHANGE" viene utilizzata quando si ricevono saldi. Dopotutto, quando più utenti lavorano contemporaneamente nel programma, mentre uno riceve i saldi, l'altro può modificarli. In questo caso il resto risultante non sarà più corretto. Se blocchi i dati con questa proposta, finché il primo dipendente non riceve il saldo corretto ed esegue tutte le manipolazioni necessarie con esso, il secondo dipendente sarà costretto ad attendere.

SCEGLIERE
Accordi reciproci Dipendente,
Accordi reciproci Importo degli accordi reciproci Saldo
DA
Registro dei cumuli Liquidazioni reciproche con i dipendenti Saldi AS Liquidazioni reciproche
PER CAMBIARE

DOVE

La progettazione è necessaria per imporre un qualche tipo di selezione sui dati caricati. In alcuni casi in cui si ottengono dati dai registri, è più ragionevole specificare le condizioni di selezione nei parametri delle tabelle virtuali. Quando si utilizza "WHERE", vengono prima recuperati tutti i record e solo successivamente viene applicata la selezione, il che rallenta notevolmente la query.

Di seguito è riportato un esempio di richiesta per ottenere contatti per una posizione specifica. Il parametro di selezione ha il formato: &ParameterName (il nome del parametro è arbitrario).

SELEZIONE (CASO)

La progettazione consente di specificare le condizioni direttamente nel corpo della richiesta.

Nell'esempio seguente, il campo “AdditionalField” conterrà del testo a seconda che il documento venga pubblicato o meno:

SCEGLIERE
AmmissioneT&U.Link,
SCELTA
QUANDO è stata effettuata l'ammissione al T&U
POI “Il documento è stato approvato!”
ALTRIMENTI “Il documento non è stato pubblicato...”
FINE AS Campo aggiuntivo
DA
Documento Ricezione di Beni e Servizi COME Ricevuta T&C

GIUNTURA

I join collegano due tabelle in base a una condizione di relazione specifica.

CONNESSIONE SINISTRA/DESTRA

L'essenza del LEFT join è che la prima tabella specificata viene presa nella sua interezza e la seconda viene collegata ad essa in base alle condizioni di connessione. Se non ci sono record corrispondenti alla prima tabella nella seconda, allora NULL viene sostituito come loro valore. In poche parole, la tabella principale è la prima tabella specificata e i dati della seconda tabella (se presente) sono già sostituiti ai suoi dati.

Ad esempio, è necessario ottenere le posizioni degli articoli dai documenti “Ricezione di beni e servizi” e i prezzi dal registro informativo “Prezzi degli articoli”. IN in questo caso, se il prezzo per qualsiasi posizione non viene trovato, sostituiscilo con NULL. Tutti gli articoli del documento verranno selezionati indipendentemente dal fatto che abbiano o meno un prezzo.

SCEGLIERE
Ricevuta e nomenclatura U.,
Prezzi.Prezzo
DA
Documento Ricezione di beni e servizi Merci COME Ricevuta e specifiche
INTERNAL JOIN RegisterInformation.PricesNomenclature.SliceLast AS Prezzi
Ricevuta software&Nomenclatura U = Prezzi.Nomenclatura

NELLA DESTRA tutto è esattamente il contrario.

CONNESSIONE COMPLETA

Questo tipo di connessione differisce dai precedenti in quanto di conseguenza verranno restituiti tutti i record sia della prima tabella che della seconda. Se non viene trovato alcun record nella prima o nella seconda tabella in base alla condizione di collegamento specificata, verrà invece restituito NULL.

Quando si utilizza una connessione completa nell'esempio precedente, verranno selezionati tutti gli articoli dal documento "Ricevuta di merci e servizi" e tutti i prezzi più recenti dal registro "Prezzi articoli". I valori dei record non trovati sia nella prima che nella seconda tabella saranno uguali a NULL.

UNIONE INTERNA

La differenza tra INNER JOIN e FULL JOIN è che se un record non viene trovato in almeno una delle tabelle, la query non lo visualizzerà affatto. Di conseguenza, verranno selezionati solo gli articoli del documento "Ricezione di beni e servizi" per i quali sono presenti record nel registro delle informazioni "Prezzi degli articoli", se nell'esempio precedente sostituiamo "COMPLETO" con "INTERNO".

RAGGRUPPA PER

Il raggruppamento in query 1C consente di comprimere le righe della tabella (campi di raggruppamento) in base a una determinata caratteristica comune (campi di raggruppamento). I campi di raggruppamento possono essere visualizzati solo utilizzando funzioni aggregate.

Il risultato della seguente query sarà un elenco di tipi di prodotto con i relativi prezzi massimi.

SCEGLIERE
,
MAX(Prezzo.Prezzo) AS Prezzo
DA

RAGGRUPPA PER
Prezzi.Nomenclatura.Tipo di nomenclatura

RISULTATI

A differenza del raggruppamento, quando si utilizzano i totali, vengono visualizzati tutti i record e ad essi vengono aggiunte le righe dei totali. Il raggruppamento visualizza solo i record generalizzati.

I risultati possono essere riepilogati per l'intera tabella (utilizzando la parola chiave “GENERALE”), per più campi, per i campi con struttura gerarchica (parole chiave “GERARCHIA”, “SOLO GERARCHIA”). Quando si riepilogano i risultati, non è necessario utilizzare funzioni aggregate.

Diamo un'occhiata a un esempio simile a quello precedente utilizzando il raggruppamento. In questo caso, il risultato della query restituirà non solo campi raggruppati, ma anche record dettagliati.

SCEGLIERE
Prezzi.Nomenclatura.Tipo di nomenclatura AS Tipo di nomenclatura,
Prezzi.Prezzo COME Prezzo
DA
Registro delle informazioni, nomenclatura dei prezzi, istantanea degli ultimi prezzi AS
RISULTATI
MASSIMO(Prezzo)
DI
TipoNomenclatura

AVENDO

Questo operatore è simile all'operatore WHERE, ma viene utilizzato solo per funzioni aggregate. I restanti campi, ad eccezione di quelli utilizzati da questo operatore, devono essere raggruppati. L'operatore WHERE non è applicabile alle funzioni aggregate.

Nell'esempio seguente vengono selezionati i prezzi massimi di un articolo se superano 1000, raggruppati per tipologia di articolo.

SCEGLIERE

MAX(Prezzo.Prezzo) AS Prezzo
DA
Registro delle informazioni, nomenclatura dei prezzi, istantanea degli ultimi prezzi AS
RAGGRUPPA PER
Prezzi.Nomenclatura.Tipo di nomenclatura
AVENDO
MASSIMO(Prezzi.Prezzo) > 1000

ORDINA PER

L'operatore ORDER BY ordina il risultato di una query. Per garantire che i record vengano visualizzati in un ordine coerente, viene utilizzato AUTO ORDER. I tipi primitivi sono ordinati secondo le solite regole. I tipi di riferimento sono ordinati per GUID.

Un esempio per ottenere un elenco di dipendenti ordinati per nome:

SCEGLIERE
Dipendenti.Nome Nome AS
DA
Directory.Employees COME Dipendenti
ORDINA PER
Nome
ORDINE AUTOMATICO

Altri costrutti del linguaggio di query 1C

  • COMBINA– risultati di due query in una.
  • COMBINA TUTTO– simile a COMBINE, ma senza raggruppare righe identiche.
  • TAVOLA VUOTA– talvolta utilizzato quando si uniscono query per specificare una tabella nidificata vuota.
  • POSTO– crea una tabella temporanea per ottimizzare query 1C complesse. Tali richieste sono chiamate richieste batch.

Funzionalità del linguaggio di query

  • SOTTOSTRINGA tronca una stringa da una posizione specificata a un numero specificato di caratteri.
  • ANNO...SECONDO consentono di ottenere il valore selezionato di tipo numerico. Il parametro di input è la data.
  • INIZIO DEL PERIODO e FINE DEL PERIODO utilizzato quando si lavora con le date. Come parametro aggiuntivo viene indicato il tipo di periodo (GIORNO, MESE, ANNO, ecc.).
  • AGGIUNGI DATA consente di aggiungere o sottrarre un'ora specifica di un certo tipo da una data (SECONDO, MINUTO, GIORNO, ecc.).
  • DATA DIFFERENZIATA determina la differenza tra due date, indicando il tipo di valore in uscita (GIORNO, ANNO, MESE, ecc.).
  • È ZERO sostituisce il valore mancante con l'espressione specificata.
  • RAPPRESENTAZIONE e LINK DI RAPPRESENTAZIONE ottenere una rappresentazione di stringa del campo specificato. Applica rispettivamente a qualsiasi valore e solo ai valori di riferimento.
  • TIPO, TIPO VALORI vengono utilizzati per determinare il tipo del parametro di input.
  • COLLEGAMENTOè un operatore di confronto logico per il tipo di valore dell'attributo.
  • ESPRIMERE utilizzato per convertire un valore nel tipo desiderato.
  • APPUNTAMENTO ottiene un valore di tipo "Data" da valori numerici(Anno, Mese, Giorno, Ora, Minuto, Secondo).
  • SENSO in una richiesta 1C viene utilizzato per indicare valori predefiniti: directory, enumerazioni, piani per tipi di caratteristiche. Esempio di utilizzo: " Dove Persona giuridica = Valore(Enumerazione. Persona giuridica. Persona)«.

Generatore di query

Per creare query con 1C esiste un meccanismo integrato molto conveniente: il query designer. Contiene le seguenti schede principali:

  • "Tabelle e campi": contiene i campi che devono essere selezionati e le relative origini.
  • “Connessioni” - descrive le condizioni per la struttura CONNESSIONE.
  • "Raggruppamento": contiene una descrizione delle strutture di raggruppamento e dei campi sommati basati su di esse.
  • “Condizioni” - è responsabile della selezione dei dati nella richiesta.
  • "Avanzate": parametri di query aggiuntivi, come parole chiave per il comando "SELECT", ecc.
  • “Join/Alias” - vengono indicate le possibilità di unire le tabelle e vengono specificati gli alias (il costrutto “HOW”).
  • "Ordine" è responsabile dell'ordinamento del risultato delle query.
  • “Totali” - simile alla scheda “Raggruppamento”, ma utilizzata per il costrutto “TOTALI”.

Il testo della richiesta stessa può essere visualizzato cliccando sul pulsante “Richiesta” in basso a sinistra. In questa forma può essere corretto manualmente o copiato.


Richiedi Consolle

Per visualizzare rapidamente il risultato di una query in modalità Enterprise o eseguire il debug di query complesse, utilizzare . Contiene il testo della richiesta, imposta i parametri e visualizza il risultato.

È possibile scaricare la console delle query sul disco ITS o tramite file .

Attenzione! Questa è una versione introduttiva della lezione, i cui materiali potrebbero essere incompleti.

Accedi al sito come studente

Accedi come studente per accedere ai materiali scolastici

Linguaggio di query 1C 8.3 per programmatori principianti: connessioni

Si unisce alle query

L'adesione è una delle operazioni più importanti e necessarie eseguite dai sistemi di gestione di database relazionali.

Le connessioni sono abituate abbinare le stringhe una tabella alle righe di un'altra tabella.

Per comprendere la necessità di connessioni, risolviamo il seguente problema.

Abbiamo una directory nel nostro database Clienti:

Direttorio Colori:

E un libro di consultazione Associazioni:

Il nostro compito è ricavare le associazioni preferite dei clienti in base al colore.

Quindi, per Natasha, l'erba sarà la sua associazione preferita, poiché il suo colore preferito è il verde. E per Peter: il sole. Stai leggendo una versione di prova della lezione, sono disponibili lezioni complete.

Per Andrey non esiste alcuna associazione adatta, poiché il suo colore preferito è il rosso e non ci sono associazioni del rosso nel database.

Risolveremo il problema gradualmente.

All'inizio chiederemo a tutti i clienti quali sono i loro colori preferiti:

Poi Richiedono tutte le associazioni ed i loro colori:

Se proviamo a eseguire questa richiesta, riceveremo un errore:

Il motivo dell'errore è che il campo Nome presente in entrambe le tabelle contemporaneamente ( Clienti E Associazioni) e il sistema semplicemente non conosce il campo da quale tabella si riferisce.

Per eliminare tali ambiguità quando si campiona da più di una tabella, è consuetudine indicare nomi di campi completi. Il nome completo del campo include il nome completo della tabella (ad esempio, Directory.Client) e il nome del campo stesso (ad esempio, Nome).

Quindi il nome completo del campo è Nome dal tavolo Clienti Volere Directory.Client.Nome.

E il nome completo del campo Nome dal tavolo Associazioni Volere Directory.Associazioni.Nome.

Connessione incrociata

Riscriviamo la query precedente con i nomi dei campi completi:

Abbiamo appena prodotto collegamento incrociato due tavoli. Presta attenzione a come si è formato il risultato:

Unione interna

Ovviamente, il risultato di un cross-join di due tabelle non è una soluzione al nostro problema. Non abbiamo bisogno di tutti i record del cross join, ma solo di quelli i cui campi Colore preferito E Colore hanno lo stesso significato:

Per ottenere questi record, aggiungi una sezione alla richiesta precedente DOVE:

Questo è ciò di cui abbiamo bisogno: abbiamo risolto il problema!

Nell'ultima query abbiamo utilizzato un cross join con una condizione aggiuntiva (nella sezione DOVE). Stai leggendo una versione di prova della lezione, sono disponibili lezioni complete. Tale connessione è chiamata interna.

C'è un altro modo per scrivere la stessa cosa unione interna:

Confronta questa e la richiesta precedente. Sono esattamente gli stessi dal punto di vista della piattaforma, hanno solo una sintassi diversa. Sia questa che le query precedenti contengono un join di tabella interna Clienti con tavolo Associazioni per campi Colore preferito E Colore rispettivamente.

Collegamento a sinistra

Tieni presente che il risultato dell'inner join non include Andrey. E tutto perché il suo colore preferito è il rosso e non abbiamo alcuna associazione con il rosso nel nostro database.

Si scopre che per Andrey con il suo colore rosso semplicemente non c'era corrispondenza dal tavolo delle associazioni.

Riscriviamo la query in modo che il risultato includa quei record della prima tabella per i quali non sono state trovate coppie dalla seconda tabella (in questo caso Andrey):

Questa connessione si chiama a sinistra unisciti.

Rrisultato dell'unione a sinistra rappresenta: tutto record dall'inner join INOLTRE tutto record della prima tabella, non compreso nell'interno

Giusto collegamento

Ma torniamo nuovamente all'inner join:

Tieni presente che il risultato dell'inner join non contiene l'associazione Biancaneve, poiché non c'era un solo cliente il cui colore preferito fosse il bianco.

Riscriviamo la query in modo che il risultato includa quei record della seconda tabella per i quali non sono state trovate coppie dalla prima tabella (in questo caso, neve bianca):

Questa connessione si chiama giusta connessione.

Risultato dell'unione correttaè: PIÙ tutto record della seconda tabella, non compreso nell'interno connessione (per la quale non è stata trovata alcuna coppia).

Connessione completa

Ma cosa succede se abbiamo bisogno che il risultato della query includa oltre all'inner join Andrej E Nevicare contemporaneamente?

Per fare ciò, dovrai combinare i risultati dei join sinistro e destro. Questo tipo di connessione è già stata inventata e si chiama connessione completa:

Risultato della connessione completa rappresenta un: tutti i record dell'inner join PIÙ tutti i record della prima tabella che non sono inclusi nell'interno connessione (per la quale non è stata trovata alcuna coppia) PLUS tutti i record della seconda tabella che non sono inclusi nella tabella interna connessione (per la quale non è stata trovata alcuna coppia).

Alias ​​di tabella

D'accordo sul fatto che tutte le query che abbiamo scritto in questa lezione sembrano piuttosto ingombranti. Ciò è dovuto al fatto che siamo costretti a indicare nomi completi campi per evitare ambiguità.

Per abbreviare il nome completo della tabella (ad esempio, Directory.Client) è consentito (così come per i campi stessi) utilizzare alias.

Riscriviamo l'ultima query in modo che quando si generano nomi di campi completi invece di Directory.Client potresti usare uno pseudonimo A, e invece Directory.Associazioni- pseudonimo UN:

E per rendere ancora più chiaro il risultato della query, aggiungiamo gli alias per i campi che abbiamo già visto in una delle lezioni precedenti:

Gestione NULL

Dai un'occhiata più da vicino ai risultati dell'ultima query (così come a molte precedenti in questa lezione).

Quali sono i valori del campo? Associazione E Il suo colore per la prima riga? Cosa puoi dire dei campi? Cliente E Il suo colore per l'ultima riga?

Sono uguali NULLO, che, come già sappiamo, significa assenza di qualsiasi significato:

E da allora NULLO significa l'assenza di un valore, quindi qualsiasi tentativo di eseguire qualsiasi operazione con esso (confronto, addizione...) causerà un comportamento indefinito del database, un errore imprevedibile.

Ecco perché l'elaborazione dei valori è considerata obbligatoria NULLO ogni volta che possono sorgere.

Ciò che intendiamo per elaborazione è che dobbiamo dire nella nostra richiesta che se uno dei campi è uguale a NULLO, allora qualche altro valore dovrebbe essere sostituito in questo campo.

In questo caso, per i campi Cliente E Associazione in caso di rilevamento NULLO sostituiremo la stringa vuota "".

Ed ecco i campi Il suo colore E Il suo colore sono collegamenti a elementi di directory Colori, pertanto, è possibile sostituirli solo con valori che sono riferimenti ai tipi specificati. Ogni tipo di riferimento (come Directory o Documento) ha un elemento predefinito Collegamento vuoto. Per indicarne il valore nella richiesta utilizzeremo la funzione SENSO.

Per determinare cosa c'è nel campo NULLO Utilizzeremo una funzione che ci è già familiare dalle lezioni precedenti È ZERO:

SELECT ISNULL( K. Nome, "" ) AS Client, ISNULL( K. FavoriteColor, VALUE(Directory. Colors. VuotoLink) ) AS ItsColor, ISNULL( A. Nome, "" ) AS Associazione, ISNULL( A. Color, VALUE (Directory. Colors. VuotoLink) ) COME È HerColor DALLA Directory. Clienti COME COMPLETARE LA CONNESSIONE Directory. Associazioni COME A DA K. Colore preferito = A. Colore

In apparenza (dalla console delle query) il risultato non è cambiato. Vediamo ancora campi vuoti. Ma questo è solo perché le rappresentazioni di stringhe hanno NULLO e i campi vuoti di tutti i tipi sono uguali e uguali alla stringa vuota.

Infatti questi campi vuoti non esistono più NULLO(nessun valore) , Ora hanno valori (vuoti) con cui puoi già lavorare (eseguire operazioni).

Ricorda, un valore vuoto e nessun valore sono due cose molto diverse.

Unione di più di due tabelle

Puoi unire in sequenza tutte le tabelle che desideri.

Supponiamo di dover risolvere il seguente problema. Stai leggendo una versione di prova della lezione, sono disponibili lezioni complete. Visualizza tutte le possibili opzioni dei clienti e delle loro associazioni preferite e dei loro prodotti preferiti in base al loro colore preferito.

Per fare ciò, colleghiamo la tabella in sequenza per colore Clienti con tavolo Associazioni e poi (il risultato risultante) con la tabella Cibo:

Fai il test

Inizia la prova

1. Le connessioni sono abituate

; Query nidificate (in sviluppo).

Attività n. 1: utilizzare una query per selezionare tutti i documenti pubblicati Vendita di beni e servizi,

Spiegazione: configurazioni Contabilità 2.0/3.0 L'implementazione non memorizza un collegamento alla fattura emessa. Il collegamento tra questi documenti è inverso: nella fattura (nei dettagli Una base di documenti) viene memorizzato un riferimento all'implementazione a cui si riferisce. Quindi, per capire quali implementazioni non hanno fatture, dovrai utilizzare due tabelle nella query: Vendite di beni e servizi E Fattura emessa.

Compito n. 2: diciamo nel database della directory Contratti delle controparti informazioni aggiuntive create Rinvio(registro dei luoghi di archiviazione Informazioni aggiuntive). Utilizzare una query per selezionare tutti gli accordi della controparte specificata con un ritardo compreso tra 0 e 10 giorni.

Spiegazione: in questo compito si potrebbe fare a meno di utilizzare due tabelle, se non ad una condizione: la scelta di contratti con differimento zero. Il punto è quello nel registro Informazioni aggiuntive I valori vuoti per informazioni aggiuntive non vengono memorizzati, quindi non ci saranno voci per il differimento zero. Pertanto, dovrai allegare questo registro alla directory Contratti delle controparti, se non esiste alcun record con un differimento per nessuno dei contratti, allora è zero.

Nuove schede: Connessioni

Nuovi meccanismi: verifica della nullità nella richiesta 1C.

Parte teorica della lezione n. 3

Se una query 1C utilizza solo una tabella, i dati verranno presi solo da essa. Ma se devi selezionare dati da più tabelle, dovresti impostare le relazioni tra queste tabelle. Le relazioni sono necessarie per confrontare le righe di una tabella del database con le righe di un'altra tabella e ottenere così, quando si forma una query, una tabella finale che conterrà i dati necessari da tutte le tabelle di query.

Ogni relazione specifica è configurata tra due tabelle, una di queste viene chiamata Sinistra, altro Giusto. Esistono tre tipi di connessioni:

  • UNIONE INTERNA- un record della tabella di sinistra apparirà nel risultato della query solo se la condizione di connessione è soddisfatta, un record della tabella di destra apparirà nel risultato della query solo se la condizione di connessione è soddisfatta;
  • CONNESSIONE SINISTRA- Un record della tabella di sinistra verrà comunque incluso nel risultato della query, un record della tabella di destra verrà incluso nella selezione solo se la condizione di connessione è soddisfatta. L'analogo della sinistra è ISCRIVITI GIUSTO i dati della tabella di destra vengono comunque inclusi nel risultato, i dati della tabella di sinistra solo se la condizione è soddisfatta. Di solito quando si scrive una query viene utilizzato Collegamento a sinistra, se usi quello di destra, la prossima volta che apri la query, il designer della query la convertirà in quella di sinistra, scambiando le tabelle;
  • CONNESSIONE COMPLETA- nel risultato della query apparirà per primo un record della tabella di sinistra, poi solo se la condizione di connessione è soddisfatta, nel risultato della query apparirà per primo in ogni caso un record della tabella di destra, poi solo se la condizione di connessione è soddisfatto. In questo caso, le righe duplicate risultanti vengono escluse dal campione.

In teoria, unire le tabelle delle query è abbastanza difficile da capire per un programmatore 1C inesperto, ma studiando gli esempi, tutti i punti poco chiari diventeranno più chiari.

Scheda Relazioni in Progettazione query

Nella finestra di progettazione query, vai alla scheda Connessioni. È una tabella in cui viene creato il numero richiesto di connessioni per tutte le diverse coppie di tabelle. Puoi aggiungere, eliminare, copiare e modificare le connessioni utilizzando i pulsanti situati sopra la tabella (non li analizzeremo ciascuno in dettaglio).

Dopo aver aggiunto una nuova connessione, è necessario compilare tutte le colonne della tabella. Diamo un'occhiata a ciascuna colonna della tabella delle connessioni:

  • Tabella 1. In questa colonna viene selezionata la tabella di comunicazione di sinistra. Puoi utilizzare solo le tabelle selezionate nella scheda Tabelle e campi;
  • Tutto. Il flag in questa colonna viene posizionato se è necessario selezionare tutti i dati per la tabella di sinistra (per Sinistra O Pieno collegamenti);
  • Tabella 2. In questa colonna è selezionata la tabella di connessione corretta;
  • Tutto. Il flag in questa colonna viene posizionato se è necessario selezionare tutti i dati per la tabella giusta (per Giusto O Pieno collegamenti);
  • gratuito. Flag con cui è possibile passare alla modalità di modifica manuale della condizione di connessione;
  • Condizione di connessione. Una condizione in un linguaggio di query, simile alle condizioni discusse in . È un'espressione che deve sempre restituire uno dei due valori: VERO O Menzogna. In genere, una condizione di collegamento è composta da tre parti:
    • Lato sinistro. Solitamente un campo nella tabella di sinistra, ma può anche essere un campo nella tabella di destra o un parametro (solo in modalità di modifica delle condizioni personalizzate);
    • Operatore di confronto. Per impostazione predefinita, "=", "<>», «<«, «>», «>=», «<=». Но в произвольном режиме редактирования можно использовать и некоторые другие, например «Между»;
    • Parte destra. Solitamente un campo nella tabella di destra, ma può anche essere un campo nella tabella di sinistra o un parametro (solo in modalità di modifica delle condizioni personalizzate);

Compilazione e modifica Termini di comunicazione, simile alla modifica di una condizione regolare discussa nell'ultima lezione, con l'eccezione che, per impostazione predefinita, non è specificato un parametro nella parte destra della condizione, ma un campo nella tabella destra. Nella modalità gratuita è disponibile anche un editor di espressioni gratuito.

Parte pratica della lezione n. 3

Diamo un'occhiata alla soluzione dei problemi indicati all'inizio della lezione.

Compito n. 1

Seleziona tutti i documenti pubblicati con una query Vendita di beni e servizi, per il periodo specificato, per il quale non è stata creata alcuna fattura.

  • Creiamo una nuova richiesta;
  • Selezioniamo le tabelle Vendite di beni e servizi E Fattura emessa dal filo Documentazione;
  • Dal tavolo Vendite di beni e servizi selezionare un campo Collegamento;
  • Andiamo alla scheda Condizioni;
  • Nel capitolo Campi, apriamo il thread Vendite di beni e servizi utilizzando il pulsante “+”;
  • Troviamo gli oggetti di scena data e trascinalo nella sezione delle condizioni, seleziona l'operatore di confronto Fra e indicare, ad esempio, i parametri per l'inizio e la fine del periodo Inizio periodo E Fine del periodo;
  • Dalla sezione Campi trasciniamo gli oggetti di scena Condotto, metti un flag in linea con la condizione gratuito e cancella la parte extra della condizione “= &Passed”;
  • Andiamo alla scheda Comunicazioni;
  • Creiamo una nuova connessione utilizzando il pulsante “Aggiungi”;
  • Nel campo Tabella 1 seleziona una tabella Vendite di beni e servizi(questa sarà la tabella a sinistra) ;
  • Per risolvere correttamente il problema è necessario procurarsi tutte le implementazioni, allegare loro le fatture e, se la fattura non viene trovata, visualizzare l'implementazione come risultato della richiesta. Dividiamo questo compito in due sottoattività:
    • Selezioniamo tutte le vendite e, utilizzando la connessione, proviamo a trovare la loro fattura;
    • Utilizzando la condizione, selezioneremo solo quelle righe in cui non è presente fattura;
  • Dal paragrafo precedente ne consegue che dobbiamo usare Collegamento a sinistra, per selezionare tutte le implementazioni. Pertanto, inseriamo un flag nella colonna Tutto
  • Nel campo Tavolo 2 seleziona una tabella Fattura emessa(questa sarà la tabella giusta);
  • Poiché il collegamento all'implementazione è memorizzato nei dettagli della fattura D DocumentBase, nella condizione di connessione scegliamo:
    • Sul lato sinistro del campo Vendita di beni e servizi.Link;
    • Sul lato destro del campo: InvoiceInvoiceIssued.DocumentBase.
  • La configurazione della connessione è completata;

Con un left join, se per una riga della tabella di sinistra non esiste una sola riga della tabella di destra che soddisfi le condizioni di connessione, tutti i campi della tabella di destra per una data riga della tabella di sinistra hanno il valore NULLO. Usiamolo per selezionare solo quelle righe della tabella di sinistra per le quali non esiste fattura;

Il linguaggio di query 1C ha uno speciale operatore logico che consente di verificare se un campo contiene un valore NULLO, la sua sintassi <Поле>È ZERO. Restituisce un valore VERO se il campo ha un valore NULLO E Menzogna- nel caso opposto.

Tieni presente che controlla il valore del campo tramite NULLOè possibile solo utilizzando la funzione specificata, costruzione <Поле>= NULLO Questo controllo non sarà possibile.

  • Andiamo alla scheda Condizioni;
  • Trascina uno dei campi della tabella nella sezione delle condizioni Fattura emessa, ad esempio campo Collegamento;
  • Imposta una bandiera sulla linea gratuito e aggiungi l'operatore dopo il campo È ZERO, avendo precedentemente cancellato la parte non necessaria della condizione;

Richiesta = Nuova richiesta; Request.SetParameter("StartPerid" , StartPerid); Request.SetParameter("Fine del periodo", Fine del periodo); Request.Text = "SELECT | Vendite di beni e servizi. Link | DA | Documento. Vendite di beni e servizi AS Vendite di beni e servizi | COLLEGAMENTO A SINISTRA Documento. Fattura emessa AS Fattura Fattura emessa | Software Vendite di beni e servizi. Link = Fattura emessa. Base del documento | DOVE | Vendite di beni e servizi. Data TRA & Inizio del periodo e & Fine del periodo | E Vendite di beni e servizi. Effettuate | E Fattura emessa. Riferimento NULL";

Compito n. 2

  • Creiamo una nuova richiesta;
  • Lanciamo il designer delle query;
  • Sulla scheda Tabelle e campi Selezioniamo due tabelle: Contratti delle controparti dal filo Directory E Informazioni aggiuntive dal filo Registri di informazione;
  • Dal tavolo Contratti delle controparti selezionare un campo Collegamento;

Secondo la condizione, il risultato della richiesta dovrebbe includere contratti di una sola controparte, il cui valore verrà trasmesso alla richiesta tramite un parametro. La controparte a cui appartiene il contratto è memorizzata sul campo Proprietario directory Contratti delle controparti.

  • Andiamo alla scheda Condizioni. Dal tavolo Contratti delle controparti spostare il campo nella sezione condizioni Proprietario. Sul lato destro della condizione imposteremo il nome del parametro a cui trasferiremo la controparte di cui abbiamo bisogno, chiamiamolo Controparte;
  • Divideremo inoltre il compito di selezionare i contratti con ritardi da 0 a 10 in due sottoattività:
    • Selezioniamo tutti i contratti e, utilizzando i collegamenti, proviamo a trovare le loro dilazioni;
    • utilizzando la condizione selezioneremo solo i contratti con le dilazioni di cui abbiamo bisogno;
  • Impostiamo i collegamenti tra contratti e informazioni aggiuntive. Andiamo alla scheda Connessioni e aggiungiamo una nuova connessione;
  • Nel campo Tabella 1 seleziona una tabella Contratti delle controparti(questa sarà la tabella di sinistra);
  • Poiché abbiamo bisogno di tutti i contratti, utilizzeremo Collegamento a sinistra. Mettiamo un flag nella colonna Tutto, che appartiene alla tabella di sinistra;
  • Nel campo Tavolo 2 seleziona una tabella Informazioni aggiuntive(questa sarà la tabella giusta);
  • Poiché il riferimento al contratto è memorizzato nella dimensione Un oggetto registro delle informazioni Informazioni aggiuntive, nella condizione di connessione scegliamo:
    • Sul lato sinistro del campo Contratti delle controparti.Link;
    • Lasciamo l'operatore di confronto standard "=";
    • Sul lato destro del campo: UlterioriInfo.Object.

Abbiamo aggiunto un collegamento con il quale selezioneremo tutti gli aggiuntivi. informazioni su ciascun contratto. Ma poiché ne abbiamo bisogno solo uno in più. miscelazione - Rinvio, dobbiamo aggiungere un'altra connessione. In questo caso Rinvioè una proprietà aggiuntiva. Ulteriori proprietà sono di tipo Piano delle tipologie delle caratteristiche Dettagli ed Informazioni Aggiuntive. Nel registro Informazioni aggiuntive valore aggiuntivo le proprietà sono memorizzate in dimensione Proprietà. Pertanto, dobbiamo aggiungere una relazione che limiti le informazioni aggiuntive solo alla proprietà Deferral.

  • Aggiungiamo una nuova connessione;
  • Nel campo Tabella 1 seleziona una tabella Contratti delle controparti;
  • È importante sapere che se sono presenti più relazioni sulla stessa coppia di tabelle, è necessario utilizzare per esse lo stesso tipo di join. Nel nostro caso, questo è Collegamento a sinistra. Pertanto, inseriamo un flag nella colonna Tutto, relativo alla tabella di sinistra;
  • Nel campo Tavolo 2 seleziona una tabella Informazioni aggiuntive;
  • Nella condizione della relazione non avremo bisogno di utilizzare il campo della tabella a sinistra, ma imporremo invece una condizione sulla dimensione Proprietà, equiparandolo ad aggiuntivo. proprietà Rinvio, che verrà passato alla richiesta utilizzando il parametro;
  • Mettiamo la bandiera gratuito nel significato VERO e scrivere manualmente il seguente testo condizionale: “Additional Information.Property = &PropertyDelay”;

  • La configurazione della connessione è completata;

Ora non resta che imporre una condizione sull’entità del differimento. Poiché utilizziamo l'intervallo da 0 a 10, sarà necessario utilizzare l'operatore di confronto Tra. Poiché il backoff zero non viene memorizzato in informazioni aggiuntive, quando connessi in questo caso, tutti i campi del registro restituiranno il valore NULLO. Per sostituire il valore in una condizione NULLO a 0, utilizzeremo la funzione del linguaggio di query È ZERO(<Выражение1>, <Выражение2>) . La funzione ritorna Espressione1, se non è uguale NULLO E Espressione2 Altrimenti.

  • Andiamo alla scheda Condizioni progettazione query e aggiungere una nuova condizione;
  • Mettiamoci una bandiera gratuito e vai all'editor di espressione libera;
  • Nella sezione delle funzioni del linguaggio di query espanderemo il ramo Funzioni -> Altre funzioni;
  • Trasciniamo una funzione nella sezione delle espressioni È ZERO;
  • Dopo la costruzione risultante, inseriremo l'operatore di confronto Tra e imposteremo l'intervallo: 0 e 10;
  • Fare clic su OK, la condizione è pronta;

L'ultima cosa da fare è visualizzare il valore del differimento nei campi della richiesta. Per invece NULLOè stato visualizzato il valore 0, utilizziamo anche l'editor di espressioni libere e la funzione È ZERO.

  • Andiamo alla scheda Tabelle e campi e aggiungi un nuovo campo;
  • Nell'editor delle espressioni libere che si apre, seleziona la funzione È ZERO;
  • Invece di Espressione 1, inserisci il campo AdditionalInformation.Value e invece di Espressione 2, inserisci 0;
  • Fare clic su OK, il campo è pronto;

Di conseguenza, riceveremo una richiesta con il seguente testo:

Richiesta = Nuova richiesta; Query.SetParameter("PropertyDelay", PropertyProperty); Request.SetParameter("Account", Account); Query.Text = "SELECT | Accordi di controparte. Link, | ISNULL(Informazioni aggiuntive. Valore, 0) AS Campo1 | FROM | Directory. Accordi di controparte AS Accordi di controparte | LEFT JOIN Informazioni Registro. Informazioni aggiuntive | AS Informazioni aggiuntive | ON Accordi di controparte .Link = Informazioni aggiuntive.Oggetto | AND (AdditionalInformation.Property = &PropertyDelay) |WHERE |Contratti della controparte.Proprietario = &Controparte | AND ISNULL(AdditionalInformation.Value, 0) BETWEEN 0 AND 10";

Leggi anche articoli sul linguaggio di query 1C 8.

Quando vogliamo vedere i dati di più tabelle contemporaneamente, ad es. per raccogliere più tabelle in una, nasce il concetto di connessione di tabelle e relazioni tra loro. Esistono quattro tipi di connessioni:

  • Sinistra;
  • Giusto,
  • interno;
  • completare.

Esamineremo ciascun tipo utilizzando un esempio astratto. Sono presenti 2 tabelle, nella prima conserviamo le informazioni descrittive della voce, nella seconda i suoi saldi:

Per ottenerne uno da queste tabelle, dobbiamo indicare esplicitamente quali campi collegheremo, in base a quale condizione e tipologia. Ora diventerà più chiaro.

Collegamento a sinistra

Utilizzando un join sinistro, diciamo al sistema che di conseguenza vogliamo vedere tutti i record della tabella di sinistra e i record di destra che soddisfano la condizione di connessione. Supponiamo di collegare le tabelle tramite il campo prodotto con la condizione uguale, quindi otterremo una tabella come:

Richiesta.Testo =
"SCEGLIERE
| Nomenclatura.Prodotto,
| Nomenclatura.Color AS ColorNomenclatura,
| Remains.Color AS ColorRemains,
| Saldi.Quantità
|DA

";

Non ci sono corrispondenze per la sedia dalla tabella dei resti, quindi i campi sono stati riempiti con valori NULL, che devono essere elaborati dalla funzione ISNULL, vedere 1C 8 Query Language Functions.

Il join sinistro funziona più o meno come un loop all'interno di un loop: prende il primo record dalla tabella di sinistra ed esegue tutti i record della tabella di destra per garantire che la condizione di connessione sia soddisfatta. Quindi viene preso il secondo record dalla tabella di sinistra e così via. Se all'improvviso diversi record della tabella di destra soddisfano la condizione di connessione, verranno aggiunte diverse righe alla tabella risultante (in base al numero di connessioni riuscite). Come possiamo vedere, la tabella risultante non è informativa, i dati non riflettono la vera essenza, quindi è meglio collegare queste tabelle tramite due campi: Product e Color, solo che questa volta gestiremo NULL:

Richiesta.Testo =
"SCEGLIERE
| Nomenclatura.Prodotto,
| Nomenclatura.Colore,
| ISNULL(Quantità.Rimanente, 0) AS Quantità
|DA
| Nomenclatura AS Nomenclatura
| LEFT JOIN Resto AS Resto
| Nomenclatura software.Prodotto = Prodotto rimanente

Giusto collegamento

La connessione destra essenzialmente non è diversa da quella sinistra. Se si scambiano le tabelle, il join destro si trasformerà in un join sinistro; inoltre, quando si utilizza il costruttore, il sistema stesso converte tutti i join destri in join sinistri.

Unione interna

Utilizzando un inner join, diciamo al sistema che di conseguenza vogliamo vedere solo quei record che soddisfano la condizione di connessione sia dalla tabella di destra che da quella di sinistra. Pertanto, il numero di record risultanti sarà inferiore o uguale al numero di record della tabella più breve che partecipa all'unione. Applichiamo un inner join ai campi Product e Color delle nostre tabelle:

Richiesta.Testo =
"SCEGLIERE
| Nomenclatura.Prodotto,
| Nomenclatura.Colore,
| Rimanenze.Quantità COME Quantità
|DA
| Nomenclatura AS Nomenclatura
| INNER JOIN Resto AS Resto
| Nomenclatura software.Prodotto = Prodotto rimanente
| E Nomenclature.Color = Rimanente.Colore";

Connessione completa

Un'unione completa risulterà in tutti i record di entrambe le tabelle, i record che soddisfano la condizione di connessione verranno collegati, i record che non soddisfano la condizione di connessione finiranno comunque nel risultato della query, ma con alcuni campi NULL. Completo è come connessioni sinistra e destra in una.

Possono esserci molti problemi su questo argomento, proviamo a risolverne uno. La nostra organizzazione è rivenditore di 2 fabbriche di mobili: "Zarya" e "Rassvet". L'assortimento con il costo di ciascuna fabbrica è archiviato in tabelle diverse. È necessario creare un unico listino prezzi, e includere i prodotti al prezzo minimo:

Applichiamo un full join con una selezione di tutti i campi, ci collegheremo per prodotto:

Richiesta.Testo =
"SCEGLIERE
| NomenclaturaZarya.Prodotto AS ProdottoZarya,
| NomenclaturaZarya.Prezzo AS PrezzoZarya,
| Nomenclatura Rassvet Prodotto AS Prodotto Rassvet,
| NomenclaturaRassvet.Prezzo AS PrezzoRassvet
|DA

Questo non è esattamente ciò di cui abbiamo bisogno, combiniamo il campo product in uno solo ed elaboriamo i NULL:

Richiesta.Testo =
"SCEGLIERE
//la costruzione ISNULL è stata discussa nella sezione delle funzioni del linguaggio di query
//se il prezzo non è definito, inizializzalo
//perché 1000000 vedi la spiegazione di seguito
| ISNULL(NomenclatureZarya.Price, 1000000) AS PrezzoZarya,
| ISNULL(NomenclatureRassvet.Price, 1000000) AS PrezzoRassvet
|DA
| NomenclaturaZarya AS NomenclaturaZarya
| CONNESSIONE COMPLETA NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Non resta che scegliere il prezzo minimo. Il testo della richiesta finale sarà simile al seguente:

Richiesta.Testo =
"SCEGLIERE
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS Prodotto,
| SCELTA
| QUANDO ISNULL(NomenclatureZarya.Price, 1000000) > ISNULL(NomenclatureRassvet.Price, 1000000)
| THEN ISNULL(NomenclatureRassvet.Price, 1000000)
| ALTRIMENTI ISNULL(NomenclatureZarya.Price, 1000000)
| FINE COME PREZZO
|DA
| NomenclaturaZarya AS NomenclaturaZarya
| CONNESSIONE COMPLETA NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Se il prezzo non è definito (NULL), deve essere inizializzato con un valore, altrimenti l'operazione di confronto per più/meno fallirà con un errore. Inizializziamo il prezzo con un importo irrealisticamente elevato in modo che “perda” nell'operazione di confronto, perché in base alle condizioni del problema selezioniamo il prezzo più basso.

← Funzioni del linguaggio di interrogazione 1C 8 | Si unisce alle query 1C 8 →

Condividi con gli amici o salva per te stesso:

Caricamento...