Il taccuino del programmatore. Selezione blocco appunti 1c del programmatore consentita

Il linguaggio di query 1C 8 è uno strumento indispensabile per un programmatore 1C; consente di scrivere codice più conciso, semplice e comprensibile e di utilizzare meno risorse di sistema quando si lavora con i dati. Questo articolo apre una serie di lezioni dedicate al linguaggio di query 1C 8 Nella prima lezione vedremo la struttura dell'operatore principale di questo linguaggio -. SCEGLIERE. Utilizzando questo operatore è possibile creare selezioni dalle tabelle del database. È possibile ordinare i dati della tabella selezionata, inserirvi condizioni, collegarli e combinarli con i dati di altre tabelle, raggrupparli in vari campi e molto altro ancora.

Linguaggio di query 1C impresa 8 - Struttura dell'operatore SELECT

Diamo un'occhiata alla struttura dell'operatore SELECT (le parti opzionali dell'operatore sono indicate tra parentesi quadre). Il linguaggio di query 1C fornisce un'ampia gamma di strumenti per la creazione di campioni di dati.

SELEZIONA [CONSENTITO] [DIFFERENTE] [PRIMO A] [Campo1] [AS Alias1], [Campo2] [AS Alias2], ... [CampoM] [AS AliasB] [PUT NomeTabellaTemporanea] [FROM Tabella1 AS AliasTable1 [[INNER JOIN ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [E Expression2]...[E ExpressionD]] .. . ... BY Espressione1 [E Espressione2]...[E EspressioneE]] ... [TabellaF AS TableF Alias] ... ] [GROUP BY RaggruppamentoCampo1[,] ... [RaggruppamentoCampoG]] [WHERE Espressione1 [AND Espressione2] ... [AND EspressioneH]] [UNITE TUTTI...] [; ...] [INDICE PER Alias1 ... AliasB] [TOTALI [FunzioneAggregation(Campo1)][,] [FunzioneAggregation(Campo2)][,] ... [FunzioneAggregation(CampoI)] BY [GENERAL][,] [ CampoRaggruppamento1][,] ... [CampoRaggruppamentoj]]

Parole chiave e blocchi per lavorare con i campi

  • SCEGLIERE— una parola chiave che indica l'inizio dell'operatore;
  • CONSENTITO indica che la selezione dovrebbe includere i record della tabella a cui è consentito l'accesso in lettura per un determinato utente;
  • VARIE indica che il campione dovrebbe includere solo flussi diversi (in tutti i campi). In altre parole, le righe duplicate verranno escluse dal campione;
  • PRIMO A se specifichi questa parola chiave, allora verrà inclusa nella selezione solo la prima A delle righe selezionate dalla query, dove A è un numero naturale;
  • Blocco di campo— questo blocco indica i campi che devono essere inclusi nella selezione. Questi campi saranno colonne selezionate. Nel caso più semplice, il campo avrà il seguente aspetto: Table Alias.TableFieldName AS Field Alias

    In questo modo indichiamo da quale tabella stiamo prendendo questo campo. Il linguaggio di query 1C consente di specificare eventuali alias, ma non devono essere ripetuti nella stessa istruzione SELECT. Un campo può essere più complesso, costituito da varie combinazioni di campi tabella, funzioni del linguaggio di query e funzioni aggregate, ma non tratteremo questi casi in questo tutorial;

Parole chiave e blocchi per lavorare con le tabelle

  • INSERIRE NomeTabellaTemporanea- parola chiave POSTO ha lo scopo di creare una tabella temporanea con un nome specifico, in cui verrà archiviata memoria ad accesso casuale in questa sessione 1C 8 fino al termine o fino alla distruzione della tabella temporanea. Va notato che i nomi delle tabelle temporanee in una sessione 1C 8 non devono essere ripetuti;
  • Blocco di tabelle e relazioni— il blocco indica tutte le tabelle utilizzate in questa richiesta, nonché le connessioni tra di loro. Il blocco inizia con parola chiave DA, seguito dal nome e dall'alias della prima tabella. Se questo tavoloè collegato ad altre tabelle, vengono indicati i collegamenti. Il linguaggio di query 1C contiene il seguente set di tipi di connessione:
    • UNIONE INTERNA— un record della tabella di sinistra sarà incluso nella selezione solo se la condizione di connessione è soddisfatta, un record della tabella di destra sarà incluso nella selezione solo se la condizione di connessione è soddisfatta;
    • CONNESSIONE SINISTRA— un record della tabella di sinistra verrà comunque inserito nella selezione, un record della tabella di destra verrà inserito nella selezione solo se la condizione di connessione è soddisfatta;
    • CONNESSIONE COMPLETA— un record della tabella di sinistra verrà comunque incluso per primo nella selezione, poi solo se la condizione di connessione è soddisfatta, un record della tabella di destra verrà comunque incluso per primo nella selezione, poi solo se la condizione di connessione è soddisfatto. In questo caso, le righe duplicate risultanti vengono escluse dal campione.

    Dopo il tipo di connessione vengono indicati il ​​nome e l'alias della seconda tabella. Poi arriva la parola chiave DI, seguite dalle condizioni di comunicazione collegate tra loro da operatori logici E, O. Ogni espressione nella condizione deve restituire un valore booleano (Vero, Falso). Se la prima tabella è connessa ad alcune tabelle diverse dalla seconda, viene nuovamente indicato il tipo di connessione e così via. Ognuna delle tabelle partecipanti alla connessione, a sua volta, può essere connessa ad altre tabelle, questo è mostrato nel diagramma della struttura della query. Se la tabella non è correlata alla prima, allora viene indicata senza tipo di connessione, poi possono seguire le sue connessioni, e così via;

Parole chiave e blocchi di conversione dati

  • Blocco del gruppo— questo blocco viene utilizzato per raggruppare le righe della tabella. Le righe vengono combinate in una se i valori dei campi specificati dopo la parola chiave RAGGRUPPA PER risultare essere lo stesso. In questo caso, tutti gli altri campi vengono sommati, calcolata la media, massimizzata o ridotta al minimo utilizzando funzioni aggregate. Le funzioni aggregate vengono utilizzate in un blocco di campo. Esempio: Maximum(TableAlias.TableFieldName) AS FieldAlias
  • Blocco delle condizioni- in questo blocco dopo la parola chiave DOVE sono indicate le espressioni condizionali separate da operatori logici E, O, affinché una qualsiasi delle righe selezionate venga inclusa nel campione, è necessario che tutte le condizioni nell'aggregato abbiano un valore VERO.
  • COMBINA TUTTO— questa parola chiave viene utilizzata per combinare le query (operatori SCEGLIERE). Il linguaggio di query 1C ti consente di combinare più query in una sola. Per poter unire le query, è necessario che abbiano lo stesso insieme di campi;
  • «;» - Il punto e virgola viene utilizzato per separare istruzioni indipendenti l'una dall'altra SCEGLIERE;
  • INDICE PER— la parola chiave viene utilizzata per indicizzare i campi specificati dopo di essa;
  • Blocco riassuntivo- utilizzato per costruire campioni simili ad alberi. Per ciascuno dei campi di raggruppamento specificati dopo la parola chiave DI, verrà creata una riga separata nella selezione. In questa riga, utilizzando le funzioni aggregate, verranno calcolati i valori totali dei campi specificati dopo la parola chiave RISULTATI.

Vuoi continuare ad imparare il linguaggio di query 1C 8? Allora leggi il prossimo articolo.

   

17 regole per elaborare una QUERY ottimale per i dati del database 1C

Per generare ed eseguire query sulle tabelle del database nella piattaforma 1C, viene utilizzato uno speciale oggetto del linguaggio di programmazione Richiesta. Questo oggetto viene creato chiamando il costrutto Nuova richiesta. La query è comoda da utilizzare quando è necessario ottenere un campione di dati complesso, raggruppato e ordinato secondo necessità. Un classico esempio di utilizzo di una query è ottenere un riepilogo dello stato del registro di accumulazione in un determinato momento. Inoltre, il meccanismo di interrogazione facilita l'ottenimento di informazioni in diversi periodi di tempo.

Il corpo della richiesta è l'istruzione secondo la quale la richiesta deve essere eseguita. Il corpo della richiesta descrive:

  • tabelle dell'infobase utilizzate come origini dati di query;
  • campi della tabella che devono essere elaborati nella query;
  • regole di raggruppamento;
  • risultati dell'ordinamento;
  • eccetera.

Le istruzioni sono redatte su linguaggio speciale– un linguaggio di query ed è costituito da parti separate: sezioni, frasi, parole chiave, funzioni, operatori aritmetici e logici, commenti, costanti e parametri.

Il linguaggio di query della piattaforma 1C è molto simile alla sintassi di altri linguaggi SQL, ma esistono delle differenze. I principali vantaggi del linguaggio di query integrato sono: campi di dereferenziazione, presenza di tabelle virtuali, lavoro conveniente con i risultati, campi non tipizzati nelle query.

Consigli per scrivere query di database nel linguaggio di query della piattaforma 1C:

1) Il corpo della richiesta può contenere dati di configurazione predefiniti, quali:

  • valori enumerativi;
  • dati predefiniti:
  • libri di riferimento;
  • piani per tipi di caratteristiche;
  • piani dei conti;
  • piani per tipi di calcoli;
  • collegamenti vuoti;
  • valori dei punti del percorso del processo aziendale.

Inoltre, il testo della richiesta può contenere i valori delle enumerazioni di sistema che possono essere assegnati ai campi delle tabelle del database: Tipo movimento di accumulo, Tipo conto e Tipo movimento contabile. Nelle query, è possibile accedere ai dati di configurazione predefiniti e ai valori di enumerazione del sistema utilizzando un valore letterale del tipo di funzione VALUE. Questo valore letterale consente di migliorare la leggibilità della query e ridurre il numero di parametri di query.

Esempio di utilizzo di un valore letterale SENSO:

  • WHERE Città = VALUE(Directory.Città.Mosca)
  • WHERE Città = VALUE(Directory.Cities.EmptyLink)
  • WHEREProductType = VALUE(Enumerazione.ProductTypes.Service)
  • WHEREMovementType = VALUE(MovementTypeAccumulation.Incoming)
  • DOVE RoutePoint = VALORE(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Utilizzando le istruzioni ORDINE AUTOMATICO il completamento della query può richiedere molto tempo, quindi se l'ordinamento non è richiesto, è meglio non utilizzarlo affatto. Nella maggior parte dei casi, è meglio utilizzare l'ordinamento delle istruzioni ORDINA PER.

L'ordinazione automatica funziona secondo i seguenti principi:

  • Se nella richiesta è stata specificata la clausola ORDER BY, ogni collegamento alla tabella trovata in questa clausola verrà sostituito dai campi in base ai quali la tabella è ordinata per impostazione predefinita (per i libri di consultazione questo è il codice o il nome, per i documenti - il data del documento). Se il campo da ordinare si riferisce ad una directory gerarchica, verrà applicato l'ordinamento gerarchico in base a questa directory.
  • Se la query non ha una clausola ORDER BY, ma ha una clausola TOTAL, il risultato della query verrà ordinato in base ai campi presenti nella clausola TOTAL dopo la chiave software di parole, nella stessa sequenza e, se i totali sono stati calcolati in base ai campi di riferimento, in base ai campi di ordinamento predefiniti delle tabelle a cui erano presenti collegamenti.
  • Se la query non contiene le clausole ORDER BY e TOTAL, ma è presente la clausola GROUP BY, allora il risultato della query sarà ordinato per i campi presenti nella clausola nella stessa sequenza e, se il raggruppamento è stato effettuato per campi di riferimento , quindi per impostazione predefinita verranno ordinate le tabelle dei campi a cui si fa riferimento.
  • Se la query non contiene clausole ORDER BY, TOTAL o GROUP BY, il risultato verrà ordinato in base ai campi di ordinamento predefiniti per le tabelle da cui vengono selezionati i dati, nell'ordine in cui appaiono nella query.
  • Se la query contiene una clausola TOTAL, ogni livello totale viene ordinato separatamente.

3) Per evitare di ripetere una query al database quando si visualizza il risultato della query all'utente (ad esempio, creando una query o visualizzando il risultato della query utilizzando un foglio di calcolo), è utile utilizzare l'istruzione INTRODUZIONELINK, che consente di ottenere una rappresentazione di un valore di riferimento. Esempio:

È anche possibile utilizzare le istruzioni PRESTAZIONE- progettato per ottenere una rappresentazione di stringa di un valore di tipo arbitrario. La differenza tra queste istruzioni è che nel primo caso, se le istruzioni passano un collegamento, il risultato sarà una stringa. Negli altri casi, il risultato sarà il valore del parametro passato. Nel secondo caso il risultato dell'istruzione sarà sempre una stringa!

4) Se la richiesta ha un campo di tipo composito, per tali campi è necessario convertire i valori del campo in alcuni un certo tipo utilizzando le istruzioni ESPRIMERE, che rimuoverà le tabelle non necessarie dal join sinistro del campo tipo composito dati e velocizzare l'esecuzione delle query. Esempio:

È presente un registro per l'accumulo dei Prodotti Residui, nel quale il campo Registrar è di tipo composito. Nella richiesta vengono selezionati la Data e il Numero del documento di ricevimento della merce, mentre quando si accede ai dettagli del documento tramite il campo Registrar, molti collegamenti a sinistra della tabella del registro di accumulo con le tabelle dei documenti del registrar non si verificano.

Codice 1C v 8.x SELEZIONA
EXPRESS(Merci rimanenti.Documento Registrar AS.Ricevuta delle merci).Numero AS Numero di ricevuta,
EXPRESS(Merci rimanenti.Documento Registro AS.Ricevuta merci).Data AS Data di ricevimento
DA
Registro delle accumuli di beni rimanenti COME Beni rimanenti

Se un cast di tipo è considerato non fattibile, il risultato sarà il valore NULLO.

5) Non dimenticare le istruzioni CONSENTITO, il che significa che la query selezionerà solo i record su cui l'utente corrente ha i diritti. Se data parola Se non si specifica, se la richiesta seleziona record per i quali l'utente non dispone dei diritti, la richiesta fallirà con un errore.

6) Se la query utilizza un join e alcune parti del join contengono tabelle nidificate (un documento con una parte tabellare) e altre no, diventa necessario integrare l'elenco di selezione con campi: tabelle nidificate vuote. Questo viene fatto utilizzando una parola chiave VUOTO, dopodiché tra parentesi vengono indicati gli alias dei campi che comporranno la tabella nidificata. Esempio:

Codice 1C v 8.x // Seleziona i campi Numero e Composizione
// dalla tabella virtuale Document.Exppenditure
SELEZIONARE Numero.Collegamento, TABELLA VUOTA.(N., Articolo, Quantità) COME Composizione
DA Documento.Fattura spese
COMBINA TUTTO
SELEZIONA Numero.Collegamento, Contenuto.(NumeroRiga, Prodotto, Quantità)
DA Documento.Fattura Documento.Fattura.Composizione.*

7) Per evitare che vengano visualizzate righe duplicate nel risultato della query, è necessario utilizzare l'istruzione VARIE, perché è più visivo e comprensibile, e le istruzioni RAGGRUPPA PER utilizzato per raggruppare utilizzando funzioni aggregate. Ksati, quando si utilizzano funzioni aggregate, un suggerimento RAGGRUPPA PER potrebbe non essere specificato affatto, ma tutti i risultati della query verranno raggruppati in un'unica riga. Esempio:

Codice 1C v 8.x // È necessario individuare quali controparti
// le merci sono state spedite per il periodo.
Seleziona Vari
Documento.Fattura.Controparte

8) Istruzioni RAGGRUPPA PER consente di accedere ai campi di livello superiore, senza raggruppare i risultati in base a questi campi, se le funzioni di aggregazione vengono applicate ai campi di una tabella nidificata. Sebbene la guida 1C affermi che quando si raggruppano i risultati della query, le funzioni aggregate devono essere specificate nell'elenco dei campi di selezione e, oltre alle funzioni aggregate nell'elenco dei campi di selezione, è consentito indicare solo i campi in base ai quali viene effettuato il raggruppamento . Esempio:

Codice 1C v 8.x SELEZIONA
Ricezione di beni e servizi (SOMMA (quantità), nomenclatura).
Ricezione di beni e servizi.
Ricezione di beni e servizi
DA
Documento Ricezione di Beni e Servizi COME Ricezione di Beni e Servizi
RAGGRUPPA PER
Ricezione di beni e servizi (nomenclatura).

9) Istruzioni È ZEROè destinato a sostituire il valore NULLO ad un altro valore, ma non dimenticare che il secondo parametro verrà convertito nel tipo del primo se il tipo del primo parametro è una stringa o un numero.

10) Quando si accede alla tabella principale, è possibile accedere in modo condizionale ai dati nella tabella subordinata. Questa funzionalità è chiamata dereferenziazione dei campi di una tabella subordinata.

Esempio (cercare documenti contenenti un prodotto specifico nella sezione tabellare):

Il vantaggio di questa query rispetto a una query sulla tabella subordinata Receipt.Goods è che se sono presenti duplicati nei documenti, il risultato della query restituirà solo documenti univoci senza utilizzare la parola chiave DIFFERENT.

11) Opzione interessante l'operatore B è un controllo per l'inclusione di un insieme ordinato nell'insieme di tali insiemi (Campo1, Campo2, ..., CampoN) B (Campo1, Campo2, ..., CampoN).

Codice 1C v 8.x SELEZIONA
Controparti.Link
DOVE
(Controparti.Link, Prodotti.Link) B
(SELEZIONARE Vendite.Cliente, Vendite.Prodotto
DA RegisterAccumulation.Sales COME Vendite)
DA
Direttorio.
Directory.Prodotti

12) Utilizzare tabelle di query virtuali quando possibile. Quando si crea una query, il sistema fornisce come origini dati una serie di tabelle virtuali: si tratta di tabelle che sono anche il risultato di una query che il sistema genera nel momento in cui viene eseguita la sezione di codice corrispondente.

Lo sviluppatore può ottenere autonomamente gli stessi dati che il sistema gli fornisce come tabelle virtuali, ma l'algoritmo per ottenere questi dati non sarà ottimizzato perché:

Tutte le tabelle virtuali sono parametrizzate, ovvero allo sviluppatore viene data la possibilità di impostare alcuni parametri che il sistema utilizzerà durante la generazione di una richiesta per la creazione di una tabella virtuale. A seconda dei parametri della tabella virtuale specificati dallo sviluppatore, il sistema può generare VARIE query per ottenere la stessa tabella virtuale e verranno ottimizzate in termini di parametri passati.

Non è sempre possibile per uno sviluppatore accedere ai dati a cui ha accesso il sistema.

13) Nella modalità operativa client-server, la funzione SOTTOSTRINGA() viene implementato utilizzando la funzione SUBSTRING() dell'istruzione SQL corrispondente, passata al server database SQL Server, che calcola il tipo di risultato della funzione SUBSTRING() da regole complesse a seconda del tipo e dei valori dei suoi parametri, nonché a seconda del contesto in cui viene utilizzato. Nella maggior parte dei casi, queste regole non hanno alcun effetto sull'esecuzione della query, ma in alcuni casi la lunghezza massima della riga dei risultati calcolata da SQL Server è importante per l'esecuzione della query. È importante tenere presente che in alcuni contesti quando si utilizza la funzione SUBSTRING(), la lunghezza massima del suo risultato potrebbe essere uguale a lunghezza massima stringhe di lunghezza limitata, che in SQL Server è di 4000 caratteri. Ciò potrebbe causare l'arresto anomalo imprevisto della query:

Provider Microsoft OLE DB per SQL Server: avviso: Query Processor non è riuscito a produrre un piano di query dall'ottimizzatore perché la lunghezza totale di tutti i le colonne nella clausola GROUP BY o ORDER BY superano gli 8000 byte.

HRESULT=80040E14, SQLSTATE=42000, nativo=8618

14) Usare con cautela O nella progettazione DOVE, poiché l'utilizzo di una condizione OR può rendere la query notevolmente più pesante. Il problema può essere risolto mediante la progettazione COMBINA TUTTO. Esempio:

Codice 1C v 8.x SELEZIONA

DA

DOVE
_Demo Contractors.Link = Link1
COMBINA TUTTO
SCEGLIERE
_Demo Contractors.NameFull
DA
Directory._Controparti Demo COME _Controparti Demo
DOVE
_Demo Contractors.Link = Link2

15) Condizione NON IN nella progettazione DOVE aumenta il tempo di esecuzione della query, poiché questo è un tipo di NON (OR1 OR2 ... ORn), quindi per tabelle di grandi dimensioni prova a utilizzare LEFT JOIN con condizione IS NULL. Esempio:

Codice 1C v 8.x SELEZIONA
_Demo Contractors.Link
DA
Directory._Controparti Demo COME _Controparti Demo
COLLEGAMENTO A SINISTRA Documento._Ordine demo acquirente COME FARE _Ordine demo acquirente
Link Software _Controparti Demo = _Ordine Demo dell'Acquirente
DOVE
_Ordine demo dell'Acquirente IS NULL

16) Durante l'utilizzo Tabelle temporaneeÈ necessario indicizzare la condizione e unire i campi in queste tabelle, MA, quando si utilizzano gli indici, la query può essere ancora più lenta. Pertanto, è necessario analizzare ogni query con e senza l'utilizzo di un indice, misurare la velocità di esecuzione della query e prendere una decisione finale.

Se inserisci i dati in una tabella temporanea inizialmente indicizzata da alcuni campi, la tabella temporanea non avrà più un indice su questi campi.

17) Se non usi Gestore tabelle temporanee, non è necessario eliminare esplicitamente la tabella temporanea, verrà eliminata al termine della query batch, altrimenti è necessario eliminare la tabella temporanea utilizzando uno dei seguenti metodi: comando DISTRUGGERE nella richiesta, chiamare il metodo TemporaryTableManager.Close().

E oltre al video di Evgeny Gilev: errori tipici durante la scrittura di query in 1C:

In questo articolo vogliamo discutere di tutto con te Funzioni del linguaggio di query 1C, E costrutti del linguaggio di interrogazione. Qual è la differenza tra funzionalità e design? La funzione viene chiamata con parentesi e i possibili parametri al loro interno e il costrutto viene scritto senza parentesi. Indubbiamente tutte le strutture e le funzioni del linguaggio di query 1C rendere il processo di acquisizione dati flessibile e multifunzionale. Queste funzioni e costrutti si applicano ai campi di query e alcuni si applicano anche alle condizioni.

Funzioni del linguaggio di query 1C

Perché una descrizione chiara 1c funzioni del linguaggio di queryè molto meno comune delle descrizioni delle strutture, abbiamo deciso di iniziare a guardare alle funzioni. Ora vediamoli singolarmente, descrivendone scopo, sintassi ed esempio di utilizzo, quindi:

1. Funzione APPUNTAMENTO- questa funzione crea un campo costante di tipo "Data".

Sintassi: APPUNTAMENTO(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Esempio di utilizzo:

2. Funzione DIFFERENZA DATA- restituisce la differenza tra due date in una delle dimensioni (anno, mese, giorno, ora, minuto, secondo). La misura viene passata come parametro.

Sintassi: DATA DIFFERENZIATA(<Дата1>, <Дата2>, <Тип>)

Esempio di utilizzo:

Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Numero di giorni";

3. Funzione VALORE- imposta un campo costante con un record predefinito dal database è anche possibile ottenere un collegamento vuoto di qualsiasi tipo;

Sintassi: VALORE(<Имя>)

Esempio di utilizzo:

Request.Text = "SELECT //elemento predefinito | VALUE(Directory.Currencies.Dollar) AS Dollaro, //link vuoto | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //transfer value | VALUE(Transfer Persona giuridica. Persona fisica) Persona fisica AS, //conto predefinito VALORE(Piano dei conti. Contabilità autonoma.Materiali) Conto AS_10" ;

4. Funzione SELEZIONA- abbiamo davanti a noi un analogo della costruzione IF, che viene utilizzata nel codice, solo che questa viene utilizzata nelle query 1C.

Sintassi: SCEGLI QUANDO<Выражение>POI<Выражение>ALTRIMENTI<Выражение>FINE

Esempio di utilizzo:

Request.Text = //se l'importo è superiore a 7500, allora dovrebbe esserci uno sconto di 300 rubli, //quindi se la condizione viene attivata, la funzione //restituisce Amount - 300 //altrimenti la richiesta restituirà semplicemente Amount "SELEZIONA | SELEZIONA | QUANDO TCReceipts.Amount > 7500 | THEN TCReceipts.Amount - 300 | ELSE TCReceipts.Amount | FINE AS AmountWithDiscount | FROM |

5. Funzione ESPRESSA- permette di esprimere un campo costante con un tipo specifico.

Sintassi: EXPRESS(NomeCampo AS NomeTipo)

Esempio di utilizzo:

Query.Text = "SELECT VARIOUS | Vendite.Registrar.Numero, | SELEZIONA | QUANDO Vendite.Registrar LINK Documento.Spese | THEN EXPRESS(Vendite.Registrar AS Documento.Spese) | ELSE SELECT | QUANDO Vendite.Registrar LINK Documento.Implementazione | THEN EXPRESS(Vendite.Registrar AS Document.Implementation) |. END |. AS Numero Registro AS Acquisti";

Un'altra opzione è utilizzare la funzione EXPRESS nei campi tipi misti dove si trovano questi? L'esempio più semplice è il “Registrar” per qualsiasi registro. Allora perché potremmo aver bisogno di qualificare il tipo nel registrar? Consideriamo la situazione quando selezioniamo il campo "Numero" dal registrar, da quale tabella verrà selezionato il numero? La risposta corretta a tutti! Pertanto, affinché la nostra query funzioni rapidamente, dobbiamo specificare un tipo esplicito utilizzando la funzione EXPRESS

Esempio di utilizzo:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. Funzione VAL.NULL(ortografia alternativa ISNULL) - se il campo è di tipo NULL, viene sostituito con il secondo parametro della funzione.

Sintassi: È ZERO(<Поле>, <ПодставляемоеЗначение>)

Esempio di utilizzo:

Si noti inoltre che è consigliabile sostituire SEMPRE il tipo NULL con qualche valore, perché il confronto con il tipo NULL restituisce sempre FALSE anche se si confronta NULL con NULL. Molto spesso, i valori NULL si formano come risultato dell'unione di tabelle (tutti i tipi di join tranne quelli interni).

Query.Text = //Seleziona l'intero articolo e i suoi saldi //se non c'è saldo in alcuni articoli, allora ci sarà un campo //NULL che verrà sostituito con il valore 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Rimanente |. Directory.Nomenclature AS N. |. CONNESSIONE SINISTRA RegisterAccumulations.GoodsInWarehouses.Remainings AS GoodsInWarehousesRemainings PO (GoodsInWarehousesRemainings.Nomenclature = No.Link)";

7. Funzione di RAPPRESENTAZIONE- permette di ottenere una rappresentazione del campo richiesta.

Sintassi: PRESTAZIONE(<НаименованиеПоля>)

Esempio di utilizzo:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenclature, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM |Accumulation Register.FreeRemaining.Remaining AS FreeRemainingRemaining";

Costruisce nel linguaggio di query 1C

Ne abbiamo discusso con te sopra Funzioni del linguaggio di query 1C, ora è il momento di considerare costrutti nel linguaggio di query 1C, non sono meno importanti e utili, cominciamo.

1. LINK di costruzione- è un operatore logico per verificare un tipo di riferimento. Si verifica più spesso quando si confronta un campo di tipo complesso con un tipo specifico. Sintassi: COLLEGAMENTO<Имя таблицы>

Esempio di utilizzo:

Request.Text = //se il tipo di valore è logger documento Ingresso, //allora la richiesta restituirà "Ricevuta di merci", altrimenti "Vendite di merci" "SELECT | SELECT | QUANDO Rimanenze. Registrar LINK Documento. Ricevuta di merci e servizi | THEN ""Ricevuta"" | ELSE ""Consumo" " | END AS Tipo movimento |FROM | Registro di accumulo. Merci rimanenti nei magazzini AS Rimanenze" ;

2. Progettare TRA- questo operatore controlla se il valore rientra nell'intervallo specificato.

Sintassi: FRA<Выражение>E<Выражение>

Esempio di utilizzo:

Request.Text = //recupera l'intera nomenclatura il cui codice è compreso tra 1 e 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. GERARCHIA di costruzione B e B- verificare se il valore è presente nell'elenco trasferito (array, tabelle di valori, ecc. possono essere trasferiti come elenco). L'operatore IN HIERARCHY permette di visualizzare la gerarchia (un esempio di utilizzo del piano dei conti).

Sintassi: IN(<СписокЗначений>), NELLA GERARCHIA(<СписокЗначений>)

Esempio di utilizzo:

Request.Text = //seleziona tutti i sottoconti del conto "SELECT | Autoportante. Collega conto AS | DA | Piano dei conti. Autoportante AS Autoportante | DOVE | Autoportante. Link IN GERARCHIA VALORE (Grafico di Conti autosufficienti.

4. Design SIMILE- Questa funzione ci permette di confrontare una corda con uno schema di corde.

Sintassi: COME "<ТекстШаблона>"

Opzioni del modello di riga:

% - una sequenza contenente un numero qualsiasi di caratteri arbitrari.

Un carattere arbitrario.

[...] - qualsiasi singolo carattere o sequenza di caratteri elencati tra parentesi quadre. L'enumerazione può specificare intervalli, ad esempio a-z, ovvero un carattere arbitrario incluso nell'intervallo, comprese le estremità dell'intervallo.

[^...] - qualsiasi singolo carattere o sequenza di caratteri elencati tra parentesi quadre eccetto quelli elencati dopo il segno di negazione.

Esempio di utilizzo:

Query.Text = //trova l'intera nomenclatura che contiene la radice TABUR e inizia //con una lettera minuscola o con lettere maiuscole t "SELECT | Nomenclatura. Link | DA | Directory. Nomenclatura AS Nomenclatura | DOVE | Prodotti. Nome LIKE "" [Tt]abur%""" ;

5. Progettazione AMMESSA- questo operatore consente di selezionare dal database solo i record per i quali il chiamante ha il permesso di lettura. Questi diritti sono configurati a livello di record (RLS).

Sintassi: ALLOWED viene scritto dopo la parola chiave SELECT

Esempio di utilizzo:

Request.Text = "SELECT CONSENTITO | Controparti. Link | FROM | Directory. Controparti AS Controparti";

6. Progettazione VARIE- consente di selezionare i record in cui non sono presenti record duplicati.

Sintassi: VARIOUS è scritto dopo la parola chiave SELECT

Esempio di utilizzo:

Request.Text = //seleziona i record sui quali il lettore ha diritti "SELECT VARIOUS | Controparti.Nome |FROM | Directory. Controparti AS Controparti" ;

Inoltre, la costruzione VARIE può essere utilizzata con l'operatore CONSENTITO e altri operatori.

Esempio di utilizzo:

Request.Text = //seleziona vari record su cui il lettore ha diritti "SELECT ALLOWED VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties";

7. Progetta PRIMA- seleziona il numero di record specificati nel parametro dal risultato della query.

Sintassi: PRIMO<число>

Esempio di utilizzo:

Request.Text = //seleziona i primi 4 numeri CCD dalla directory "SELECT FIRST 4 | CCD Numbers. Link | FROM | Directory. CCD Numbers AS CCD Numbers";

8. Progettare PER IL CAMBIAMENTO- permette di bloccare una tabella, funziona solo nelle transazioni (rilevante solo per i blocchi automatici).

Sintassi: PER CAMBIARE<НаименованиеТаблицы>

Esempio di utilizzo:

Query.Text = "SELECT | Residui liberi Residui. Nomenclatura, | Residui liberi Residui. Magazzino, | Residui liberi Residui. In magazzino Residui | DA | Registro degli accumuli. Residui liberi. Residui AS Residui liberi Residui | FOR CHANGE | Registro degli accumuli . Residui liberi";

9. ORDINA PER- organizza i dati in un campo specifico. Se il campo è un collegamento, quando si imposta il flag ORDINE AUTOMATICO L'ordinamento avverrà in base alla rappresentazione del collegamento; se il flag è disattivato, i collegamenti verranno ordinati in base all'anzianità dell'indirizzo del collegamento in memoria.

Sintassi: ORDINA PER<НаименованиеПоля>ORDINE AUTOMATICO

Esempio di utilizzo:

Query.Text = "SELECT | Rimanenze libere Rimanenze. Nomenclatura AS Nomenclatura, | Rimanenze libere Rimanenze. Magazzino AS Magazzino, | Rimanenze libere Rimanenze. Rimanente in magazzino | DA | Registra accumuli. Rimanenze libere. Rimanente AS Rimanenze libere rimanenti | | ORDER BY |. Nomenclatura |. LETTURA ORDINE AUTOMATICA";

10. Progettazione GRUPPO PER- utilizzato per raggruppare le stringhe di query in base a campi specifici. I campi numerici devono essere utilizzati con qualsiasi funzione aggregata.

Sintassi: RAGGRUPPA PER<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Esempio di utilizzo:

Query.Text = "SELEZIONA | ProductsInWarehouses.Nomenclature AS Nomenclature, | ProductsInWarehouses.Warehouse, | SUM(GoodsInWarehouses.InStock) AS INSTOCK |FROM | RegisterAccumulations.ProductsInWarehouses AS ProductsInWarehouses | |GRUPPO PER | ProductsInWarehouses.Nomenclature, | tesori.Warehouse";

11. Progettare AVERE- consente di applicare una funzione aggregata a una condizione di selezione dei dati, simile alla costruzione WHERE.

Sintassi: AVENDO<агрегатная функция с условием>

Esempio di utilizzo:

Query.Text = //seleziona i record raggruppati in cui il campo InStock è maggiore di 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | GRUPPO PER |. ProductsInWarehouses.Nomenclatura, |. ProductsInWarehouses.Warehouse | |IMPORTO DISPONIBILE (ProductsInWarehouses.In magazzino) > 3" ;

12. INDICE Edilizia PER- utilizzato per indicizzare il campo di query. Il completamento di una query con indicizzazione richiede più tempo, ma accelera la ricerca nei campi indicizzati. Può essere utilizzato solo nelle tabelle virtuali.

Sintassi: INDICE PER<Поле1, ... , ПолеN>

Esempio di utilizzo:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodiceOS";

13. Progetta DOVE- consente di imporre una condizione su qualsiasi campo di selezione. Il risultato includerà solo i record che soddisfano la condizione.

Sintassi: DOVE<Условие1 ОператорЛогСоединения УсловиеN>

Esempio di utilizzo:

Query.Text = //tutti i record con CompensationRemaining sono selezionati<>0 e //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Place DataTz |FROM | Accumulation Register.CompensationRP.Remains AS CompensationRPORemains |WHERE |CompensationRPORemaining. Compensazione rimanente<>0| E CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. RISULTATI della progettazione... GENERALE- utilizzato per calcolare i totali; la progettazione specifica i campi in base ai quali verranno calcolati i totali e le funzioni di aggregazione applicate ai campi totali. Quando si utilizzano i totali per ciascun campo dopo la costruzione TOTAL, i dati vengono raggruppati. Esiste un costrutto GENERAL opzionale; il suo utilizzo fornisce anche un raggruppamento aggiuntivo. Di seguito vedrai un esempio del risultato della richiesta.

Sintassi: RISULTATI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>DI<ОБЩИЕ> <Поле1, ... , ПолеN>

Esempio di utilizzo:

Request.Text = "SELECT | Calcoli. Accordo di controparte. Tipo di accordo Tipo di contratto AS, | Calcoli. Accordo di controparte Contratto AS, | Calcoli. Controparte, | Calcoli. Importo del saldo di regolamento reciproco Saldo AS | DA | Registro degli accumuli. Mutuo Regolamento CON Controparti. Saldi AS Calcoli |. IMPORTO (Saldo) |SU |GENERALE, |Tipo di accordo";

Nella figura sono schematizzati i raggruppamenti che si sono formati durante l'esecuzione della richiesta, quello superiore si riferisce alla sezione GENERALE, il secondo al campo Controparte AccordoTipo Accordo.

). L'utilizzo di questa parola chiave consente di evitare errori durante il recupero dei record per i quali l'utente non dispone dei diritti.

Problema: In alcuni casi, il risultato delle restrizioni di accesso ai dati in 1C 8.3 può dipendere dal piano di query del DBMS. Questo articolo esamina le possibili situazioni e fornisce consigli su come evitarlo.

Il problema della possibile dipendenza del risultato delle restrizioni di accesso ai dati dal piano di query del DBMS può sorgere quando si esegue una query del database senza una parola chiave CONSENTITO, se l'utente corrente ha restrizioni di accesso ai dati e la richiesta contiene uno o più confronti del modulo:

  • <Выражение над полями>(IN|NON IN) (<Вложенный запрос>)
  • (<Выражение над полями 1>, …, <Выражение над полями N>) (IN|NON IN) (<Вложенный запрос>)

Se in questo caso < > (una query nella query) utilizza tabelle di database sulle quali sono imposte restrizioni di accesso, è possibile che su alcuni DBMS la query venga eseguita con successo, mentre su altri verrà emesso un messaggio a condizione che i dati nelle basi informative siano completamente identici .

Ottieni 267 lezioni video su 1C gratuitamente:

Motivo delle differenze

La possibile differenza di comportamento è dovuta all'implementazione delle restrizioni di accesso ai dati senza parola chiave CONSENTITO in 1C Enterprise 8.3.

Interrogazione senza parola chiave CONSENTITO verrà eseguito con successo solo se durante la sua esecuzione non si verifica alcun accesso a dati vietati. A tale scopo viene aggiunto un campo di segnale speciale che acquisisce il valore VERO per quei record alla cui formazione hanno partecipato solo i dati consentiti, e il valore Menzogna per tutte le altre voci. Se almeno un record di esempio contiene il valore Menzogna nel campo del segnale, l'esecuzione della richiesta termina in modo anomalo.

Lo stesso campo segnale viene aggiunto ai risultati delle query annidate nel confronto IN/NON IN. Inoltre, il controllo del valore della colonna del segnale in questo caso viene eseguito utilizzando gli strumenti DBMS. Pertanto, se durante l'esecuzione di una query nidificata si accedesse a dati vietati, la query dovrebbe fallire con un errore L'utente non dispone di diritti sufficienti per eseguire un'operazione sul database.

Tuttavia, quando si crea un piano di query, il DBMS potrebbe non ricevere l'esempio completo <Вложенным запросом> e ricevere solo i record effettivamente necessari per verificare la condizione IN/NON IN. In questo caso la richiesta potrebbe avere successo anche se il <Вложенного запроса> come richiesta autonoma potrebbe verificarsi l'accesso a dati vietati.

Diamo un'occhiata a un semplice esempio. Mettiti sul tavolo Directory.Individui vengono imposte restrizioni sull’accesso ai dati. In questo caso la richiesta:

Tabella.Individuale AS Individuale

verrà eseguito con un errore a causa di un tentativo di accesso a dati vietati. Se questa query è coinvolta in un confronto, ad esempio:

Tabella.Individuale AS Individuale

Directory.Individui AS Tabella)

quindi, a seconda del piano di query DBMS selezionato, la query può essere eseguita con successo o con un errore. Questo comportamento della richiesta non è un errore perché è possibile o meno accedere ai dati vietati durante l'esecuzione della richiesta. Per ottenere un risultato più prevedibile, è necessario costruire una query in modo tale che sia garantito che la query annidata non acceda a dati ovviamente non necessari. In particolare, se la query precedente viene riscritta in questo modo:

Contratto per l'esecuzione del lavoro con un individuo.Dipendente.Individuo

Documento. Accordo per l'esecuzione di lavori con una persona fisica COME un accordo per l'esecuzione di lavori con una persona fisica

Contratto di prestazione lavorativa con Individuo.Dipendente.Individuo B (

Tabella.Individuale AS Individuale

Directory.Individui AS Tabella