Creare e lavorare con le richieste (per principianti). Creare e lavorare con le richieste (per principianti) 1s 8.3 se in una richiesta

La programmazione 1C consiste in qualcosa di più della semplice scrittura di un programma. 1C è un lingotto di azioni e dati dell'utente con cui lavora.

I dati vengono archiviati in un database. Le query 1C sono un modo per recuperare dati da un database per mostrarli all'utente in un modulo o per elaborarli.

La parte fondamentale del report è la richiesta 1C. Nel caso di un report, l'ACS costituisce la parte più grande del report.

Sedere. Prendi un respiro. Calmati. Adesso vi dirò la notizia.

Per programmare in 1C non è sufficiente conoscere il linguaggio di programmazione 1C. È inoltre necessario conoscere il linguaggio di query 1C.

Il linguaggio di query 1C è un linguaggio completamente separato che ci consente di specificare quali dati dobbiamo ottenere dal database.

È anche bilingue, ovvero puoi scrivere in russo o inglese. È estremamente simile al linguaggio di query SQL e chi lo conosce può rilassarsi.

Come vengono utilizzate le richieste 1C

Quando un utente avvia 1C in modalità Enterprise, non c'è un singolo grammo di dati nel client in esecuzione. Pertanto, quando è necessario aprire una directory, 1C richiede i dati dal database, ovvero effettua una richiesta 1C.

Le query 1C sono:

  • Interrogazioni automatiche 1C
    Generato automaticamente dal sistema. Hai creato un modulo di elenco documenti. Aggiunta una colonna. Ciò significa che quando apri questo modulo in modalità Enterprise, verrà eseguita una query e verranno richiesti i dati per questa colonna.
  • Interrogazioni semiautomatiche 1C
    Esistono molti metodi (funzioni) nel linguaggio 1C, quando si accede viene eseguita una query sul database. Ad esempio.GetObject()
  • Query 1C manuali (scritte dal programmatore appositamente come query)
    Puoi scrivere tu stesso una richiesta 1C nel codice ed eseguirla.

Creazione ed esecuzione di query 1C

Una richiesta 1C è il testo effettivo della richiesta nella lingua della richiesta 1C.
Il testo può essere scritto con penne. Cioè prendilo e scrivilo (se conosci questa lingua).

Poiché 1C promuove il concetto di programmazione visiva, dove molto o quasi tutto può essere fatto senza scrivere il codice a mano, esiste uno speciale oggetto Query Constructor che consente di disegnare il testo di una query senza conoscere il linguaggio di query. Tuttavia, i miracoli non accadono: per questo è necessario sapere come lavorare con il costruttore.

Una volta che il testo della richiesta 1C è pronto, deve essere eseguito. A questo scopo esiste un oggetto nel codice 1C Request(). Ecco un esempio:

Richiesta = Nuova Richiesta();
Query.Text = "SELEZIONA
| Nomenclatura.Link
|DA
| Directory.Nomenclature AS Nomenclatura
|DOVE
| Nomenclatura.Servizio";
Seleziona = Query.Esegui().Select();

Rapporto(Selection.Link);
FineCiclo;

Come puoi vedere nell'esempio, dopo aver eseguito la richiesta 1C, il risultato ci arriva e dobbiamo elaborarlo. Il risultato è una o più righe della tabella (in una forma speciale).

Il risultato può essere caricato in una tabella normale:
Recupera = Query.Esegui().Scarica(); //Risultato – tabella dei valori

Oppure semplicemente andare in giro riga per riga.
Seleziona = Query.Esegui().Select();
Mentre Select.Next() Ciclo
//Fai qualcosa con i risultati della query
FineCiclo;

Lavorare con le richieste 1C

Principi di base delle query 1C

Principi di base per costruire una richiesta 1C –
SELEZIONA Elenco di campi DA Titolo tabella DOVE Condizioni

Un esempio di costruzione di una richiesta 1C di questo tipo:

SCEGLIERE
//elenco dei campi da selezionare
Collegamento,
Nome,
Codice
DA
//nome della tabella da cui selezioniamo i dati
//elenco delle tabelle è un elenco di oggetti nella finestra del configuratore
Directory.Nomenclatura
DOVE
//indica la selezione
Tipo prodotto = &Servizio //selezione per valore esterno
Oppure Servizio // Attributo “Servizio” di tipo Booleano, selezione per valore Vero
ORDINA PER
//Ordinamento
Nome

Elenco delle tabelle 1C

Puoi vedere i nomi delle tabelle nella finestra del configuratore. Basta scrivere “Directory” invece di “Directory”, ad esempio “Directory.Nomenclatura” o “Documento.Vendite di beni e servizi” o “Registro di accumulo.Vendite”.

Sono presenti tabelle aggiuntive (virtuali) per i registri che permettono di ottenere i numeri definitivi.

Information Register.RegisterName.Last Slice(&Date) – Richiesta 1C dal registro delle informazioni, se periodico, per una data specifica

Registro di accumulo.Nome registro.Saldi(&Data) – Richiesta 1C dal registro dei saldi per una data specifica

Registro di accumulo.Nome registro.Fatturato (&Data inizio, &Data fine) – Richiesta 1C dal registro del fatturato per il periodo dalla data di inizio alla data di fine.

Principi aggiuntivi

Quando richiediamo un elenco di alcuni dati, i principi di base funzionano. Ma possiamo anche richiedere dei numeri e la richiesta può contarli per noi (aggiungerli, ad esempio).

SCEGLIERE
//Quantity(FieldName) – conta la quantità
//Field AS OtherName – rinomina il campo
Quantità (Link) AS Quantità di documenti pubblicati
DA

DOVE
Condotto

Questa richiesta 1C ci restituirà il numero totale di documenti. Tuttavia, ogni documento ha un campo Organizzazione. Diciamo che vogliamo contare il numero di documenti per ciascuna organizzazione utilizzando una query 1C.

SCEGLIERE
//solo un campo del documento
Organizzazione,
//conta la quantità
Quantità(Link) Quantità ASPer organizzazioni
DA
Documento Vendita di beni e servizi
DOVE
Condotto
RAGGRUPPA PER

Organizzazione

Questa richiesta 1C ci restituirà il numero di documenti per ciascuna organizzazione (chiamata anche "per organizzazione").

Calcoliamo inoltre l'importo di questi documenti utilizzando una richiesta 1C:

SCEGLIERE
//solo un campo del documento
Organizzazione,
//conta la quantità

//conta l'importo

DA
Documento Vendita di beni e servizi
DOVE
Condotto
RAGGRUPPA PER
//deve essere utilizzato se l'elenco dei campi ha una funzione count() e uno o più campi contemporaneamente, quindi è necessario raggruppare in base a questi campi
Organizzazione

Questa richiesta 1C ci restituirà anche la quantità di documenti.

SCEGLIERE
//solo un campo del documento
Organizzazione,
//conta la quantità
Quantità(Link) Quantità ASPer organizzazioni,
//conta l'importo
Importo(ImportoDocumento) Importo AS
DA
Documento Vendita di beni e servizi
DOVE
Condotto
RAGGRUPPA PER
//deve essere utilizzato se l'elenco dei campi ha una funzione count() e uno o più campi contemporaneamente, quindi è necessario raggruppare in base a questi campi
Organizzazione
RISULTATI PO Generale

Il linguaggio di query 1C è ampio e complesso e non considereremo tutte le sue capacità in una lezione: leggi le nostre prossime lezioni.

Brevemente sulle funzionalità aggiuntive del linguaggio di query 1C:

  • Unione di dati da più tabelle
  • Query nidificate
  • Richiesta batch
  • Creazione dei tuoi tavoli virtuali
  • Interrogazione dalla tabella dei valori
  • Utilizzo di funzioni integrate per ottenere e manipolare valori.

Generatore di query 1C

Per non scrivere a mano il testo della richiesta, esiste un designer di richieste 1C. Basta fare clic con il pulsante destro del mouse in un punto qualsiasi del modulo e selezionare 1C Query Designer.

Seleziona la tabella desiderata a sinistra nel Designer query 1C e trascinala verso destra.

Seleziona i campi richiesti dalla tabella nel Designer query 1C e trascina verso destra. Se desideri non solo selezionare un campo, ma applicare ad esso una sorta di funzione di somma, dopo aver trascinato, fai clic due volte sul campo con il mouse. Nella scheda Raggruppamento, dovrai quindi selezionare (trascinare) i campi richiesti per il raggruppamento.

Nella scheda Condizioni nel Designer query 1C, puoi selezionare le selezioni necessarie allo stesso modo (trascinando i campi in base ai quali effettuerai la selezione). Assicurati di selezionare la condizione corretta.

Nella scheda Ordine è indicato l'ordinamento. Nella scheda Risultati: riepilogo dei risultati.

Utilizzando il designer di query 1C, puoi studiare qualsiasi query esistente. Per fare ciò, fai clic con il pulsante destro del mouse sul testo di una richiesta esistente e seleziona anche 1C query designer - e la richiesta verrà aperta nel query designer 1C.

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 GroupingField1[,] ... [GroupingFieldG]] [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 record di tabella che hanno 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, che verrà archiviata nella RAM in una determinata 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 query, nonché le relazioni tra di loro. Il blocco inizia con una parola chiave DA, seguito dal nome e dall'alias della prima tabella. Se questa tabella è correlata ad altre tabelle, vengono indicate le relazioni. 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.

Richiesta . Testo = "SCEGLIERE | StorageUnits.Link |DA | Directory.usStorageUnits COME utilizzareStorageUnits // Esempio 1: confronto con un valore booleano vuoto: |DOVE | StorageUnits.AllowSelectionFromReserveZone = False // Esempio 2. ma se questo booleano è definito, allora è meglio così: // condizione per un booleano negativo: |DOVE | NON unità di stoccaggio Consenti la selezione dalla zona di riserva // Esempio 3. selezione in base alla condizione di un campo vuoto che ha il tipo “directory di un tipo specifico” |DOVE | StorageUnits.ActiveSelectionArea = VALUE(Directory.usSelectionArea.EmptyRef) // Esempio 3a. selezione in base alla condizione di un campo vuoto avente la tipologia “documento di tipo specifico” |DOVE | OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyLink) // Esempio 3b. selezione basata sulla condizione di un campo vuoto avente la tipologia “documenti di diversa tipologia” ( campo composito) |DOVE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | OR OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyLink) | OR... (ecc. - elenchiamo in sequenza le condizioni per tutti i possibili tipi di questo campo composito) ) // Esempio 4. o viceversa, se è necessario selezionare un valore riempito del tipo "stringa", la condizione aiuterà: |DOVE | Nome unità di archiviazione > """" // Esempio 5. se è necessario selezionare documenti di un tipo specifico, con un tipo di dati composito, ad esempio, nel registro "RunningTasks", la risorsa "Task" ha un tipo composito, tra i valori di cui il documento "Selezione" è possibile |DOVE | EXPRESS(Informazioni RegisterExecutedTasks.Task AS Document.Selection) LINK Document.Selection // Esempio 5a. Un altro esempio simile quando è necessario selezionare documenti di un tipo specifico | SCELTA | QUANDO ESPRESSARE (ag Corrispondenza di documenti. Documento BU AS Documento. Ricevuta di beni e servizi) LINK Documento. Ricevuta di beni e servizi | POI ""Ricezione di beni e servizi"" | QUANDO ESPRIMERE (ag Corrispondenza di documenti. Documento BU AS Documento. Vendite di beni e servizi) LINK Documento. Vendite di beni e servizi | POI ""Vendite di beni e servizi"" | ALTRO """" | FINE COME Vista documento // Esempio 6. selezione per condizione di un valore indefinito: |DOVE | SavedSettings.User = NON DEFINITO // Esempio 7. selezione per tipo di movimento "In entrata" del registro di accumulo, "Spese" - allo stesso modo): |DOVE | RegProductsInRetail.MovementType = VALUE(MovementTypeAccumulation.Incoming) // Esempio 8. Come indicare in una richiesta che non è necessario eseguire la richiesta (ad esempio, è necessario a livello di codice, a seconda di alcune condizioni, restituire un risultato della richiesta vuoto - Request.Text = StrReplace(Request.Text, "DOVE Doc.Link = &DocumentLink" , "DOVE È LA BUGIA");). Per fare ciò basta aggiungere la condizione “Dov’è Falso”. A proposito, indipendentemente dal volume di dati richiesti nel campione, tale richiesta verrà eseguita immediatamente. |DOV'È LA BUGIA // Esempio 9. Verifica che il risultato della query contenga dati: AltrimentiRichiesta.Eseguire().Vuoto() Poi // Esempio 10. selezione basata su una data vuota: |DOVE | tbStrings.CancellationDate = DATETIME(1, 1, 1)

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 richiesta e alcuni si applicano anche alle condizioni.

Funzioni del linguaggio di query 1C

Perché una descrizione chiara Funzioni del linguaggio di query 1Cè 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), GIORNO) | AS Qtà.Giorni";

3. Funzione VALORE- imposta un campo costante con un record predefinito dal database; puoi anche 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. Autoportante. 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 Sum - 300 //altrimenti la richiesta restituirà semplicemente Sum "SELECT | SELECT | WHEN TCReceipts.Amount > 7500 | THEN TCReceipts.Amount - 300 | ELSE TCReceipts.Amount | END AS AmountWithDiscount |FROM | Document.Receipt of GoodsServices.Goods AS TCReceipts";

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(Sales.Registrar AS Document.Implementation) | END | ... | END AS Numero | FROM | RegisterAccumulations.Purchases AS Purchases";

Esiste un'altra opzione per utilizzare la funzione EXPRESS nei campi di tipo misto, dove si trovano? 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, dovremmo 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:

Tieni inoltre presente 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 Resto | DA | Directory.Nomenclatura AS N. | COLLEGAMENTO SINISTRA Registro accumuli. BeniInMagazzini. Rimanenze AS BeniInMagazziniRemains | ON (BeniInMagazziniRemains. Nomenclatura = N. 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 del registratore è ricevuta del documento, //allora la query restituirà "Ricevuta di merci", altrimenti "Vendite di merci" "SELECT | SELECT | WHEN Remainings.Registrar LINK Document.Receipt of Goods e Servizi | THEN ""Ricevuta"" | ELSE ""Consumi"" | END AS Tipologia Movimento | FROM | Registro di Accumulo. Rimanenze Prodotti 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. Autosufficienza. Beni)";

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 maiuscola t "SELECT | Nomenclatura. Link | FROM | Directory. Nomenclature AS Nomenclature | WHERE | 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.Residui";

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 | RECUPERO AUTOMATICO DELL'ORDINE";

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, | ProductsIn Warehouses.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.Nomenclature, | ProductsInWarehouses.Warehouse | |DISPONIBILE | IMPORTO(ProductsInWarehouses.InStock) > 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 .CodeOS";

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 CompensationRPOstat ki |WHERE |CompensationRPORemain ing.CompensazioneRemaining<>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 facoltativo; 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 | TOTALE | IMPORTO (Saldo) | Software | GENERALE, | Tipo di contratto";

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.

In questo articolo esamineremo l'argomento delle tabelle annidate nel linguaggio di query 1C.

È possibile utilizzare una tabella di origine della query nidificata nei campi di selezione della query. Ad esempio, il documento “Prestazione di servizi” ha una parte tabellare Servizi e quindi questa parte tabellare può essere visualizzata anche nel campo di selezione. Ora vedrai come questo può essere implementato.

Nel mio database di formazione, avvierò la console delle query, aprirò il designer delle query e selezionerò la tabella "Fornitura di servizi".

Espandiamo questa tabella

E in esso vediamo la parte tabellare “Servizi”.

Selezioniamo l'intera parte della tabella.

Come puoi vedere, l'intera parte tabellare del servizio è andata completamente nei campi.

Tieni presente che la parte tabellare, infatti, si presenta come un campo separato denominato “Servizi” e la cui tipologia sarà “Risultato richiesta”. Impariamo come utilizzare una tabella nidificata in una query.

Lasciamo tre campi della tabella nidificata e aggiungiamo alcuni campi dall'intestazione del documento.

Facciamo clic su OK nel designer e vediamo come apparirà la nostra richiesta.

Come puoi vedere, nella richiesta c'è un punto dopo il campo "Servizi" e dopo di esso i campi selezionati sono elencati tra parentesi.

Soddisfiamo la richiesta.

Nella figura vediamo che tutti i campi selezionati nella parte tabellare del documento sono elencati separati da virgole nel campo “Servizi”. Non tutte le console di query hanno un display come quello nella figura sopra; a volte potrebbe semplicemente dire " ".

Altro punto interessante: in una tabella nidificata puoi mettere un asterisco al posto dei campi, poi appariranno tutti i campi della parte tabellare. Questo non può essere fatto nel costruttore, solo manualmente nella richiesta. La richiesta assumerà la seguente forma:

Vediamo come verrà eseguita tale richiesta.

L'unica cosa è che questo asterisco non verrà salvato se apriamo il costruttore della query.

Abbiamo imparato come effettuare una query con una tabella nidificata nella console, ora impareremo come utilizzare una tabella nidificata in una selezione

In realtà, non è così difficile accedere a una tabella nidificata durante l'elaborazione di una query. Accedi semplicemente alla selezione tramite il nome della tua tabella e ottieni una variabile con il tipo "Risultato query". E poi lo elabori come un normale risultato di una richiesta: se vuoi, ottieni un campione, se vuoi, esegui un caricamento.

Di seguito è riportato un piccolo esempio di codice che funziona con una tabella nidificata:


&Sul server
Procedura FillOnServer()
Richiesta = Nuova richiesta;
Richiesta. Testo = "SCEGLIERE
| Vendita del prodotto Link,
| Vendita di prodotti.Prodotti.(
| Prodotto,
| Quantità
|DA
| Documento. Vendita di prodotti COME VENDERE PRODOTTI"
;
Recupera = interroga. Correre(). Scegliere();
Ciao selezione. Successivo() Ciclo
Linea Superiore dell'Albero = Vendita di Prodotti. OttieniArticoli();
NuovaRiga = TopRowTree. Aggiungere();
Nuova linea. Collegamento = Selezione. Collegamento;
TabellaProdotti = Selezione. Merce;
ProdottiSelezione = ProdottiTabella. Scegliere();
Durante la selezione dei prodotti. Successivo() Ciclo
TreeChildRow = NuovaRiga. OttieniArticoli();
RigaProdotto = RigaAlberoFiglio. Aggiungere();
ProdottoStringa. Collegamento = Selezione prodotti. Prodotto;
ProdottoStringa. Quantità = Articoli campione. Quantità ;
FineCiclo;
FineCiclo;
Fine della procedura

Lasciami spiegare il codice sopra.

Prima di tutto, abbiamo una selezione lineare e procediamo attraverso questa selezione in un ciclo, in cui creiamo la riga superiore dell'albero dei valori (è sul modulo) e in essa scriviamo un collegamento al nostro documento.

E poi la cosa più interessante, puoi anche guardarla tu stesso più tardi nel debugger, passiamo al campo di selezione Prodotti e, per comodità, scriviamo questo campo in una variabile separata in TableProducts. Questa variabile è del tipo “Risultato query”. E puoi facilmente ottenere un campione di questo risultato. Questo è ciò che facciamo. Resta da bypassare questa selezione utilizzando la funzione successiva e il ciclo while.

E all'interno di questo ciclo faremo riferimento ai campi di selezione come campi di una tabella nidificata e li scriveremo nelle righe figlie dell'albero dal modulo.

Questo è il risultato che restituirà questo codice

Hai ancora domande?

Risponderai tu stesso quando studierai il mio corso "Query in 1C per principianti". Dove queste e molte altre questioni vengono discusse in modo più dettagliato. Tutte le informazioni sono fornite in forma semplice e accessibile e sono comprensibili anche a chi non ha particolare dimestichezza con la programmazione in 1C.

Codice promozionale per uno sconto del 20%: hrW0rl9Nnx

Sostieni il mio progetto donando qualsiasi importo

Unisciti ai miei gruppi.