1s controllando la data per un valore vuoto. Da dove vengono

Molto spesso nelle query 1C devi lavorare con le date. Soprattutto quando la richiesta è costruita su oggetti di metadati che contengono informazioni periodiche. Di norma si tratta di registri (informazioni, accumulazione, calcolo, contabilità). Considera le funzioni più comunemente utilizzate del linguaggio di query 1C per lavorare con le date. Costruiremo esempi basati sul registro delle informazioni DipendentiOrganizzazioni Configurazioni ZUP versione 2.5.

  • APPUNTAMENTO

    Consente di ottenere la data nella query (con o senza orario) specificando anno, mese, giorno, ora, minuto, secondo.
    Sintassi:
    DATETIME(anno, mese, giorno, ora, minuto, secondo)
    Di solito l'ora, i minuti ei secondi non sono specificati. Facciamo un mini esempio. Immettere il seguente testo nella console delle query:

    SELEZIONA DATAORA(2016, 1, 1)

    Come risultato della query, otteniamo la data - 01/01/2016
    Difficile infatti immaginare una situazione in cui la data verrà indicata nella richiesta in questo modo. Dopotutto, quando è necessario specificare il periodo, vengono utilizzati i parametri. Ma c'è un caso in cui questa funzione ha un valore particolare. Questo è quando dobbiamo specificare una data vuota nei campi o nelle condizioni della query. Lascia che ti ricordi che per la lingua 1C, una data vuota sembra - 0001.01.01. Pertanto, per ottenere una data vuota nella richiesta, è sufficiente specificare DATAORA(1, 1, 1). Ad esempio, scegliamo dal registro delle informazioni DipendentiOrganizzazioni record che non sono compilati Periodo di completamento:

    SELECT Dipendenti delle organizzazioni.Periodo, Dipendenti delle organizzazioni.Dipendente, Dipendenti delle organizzazioni.Posizione, Dipendenti delle organizzazioni.Dipartimento delle organizzazioni FROM Registro delle informazioni.Dipendenti delle organizzazioni AS Dipendenti delle organizzazioni WHERE Dipendenti delle organizzazioni.Periodo di completamento = DATETIME(1, 1, 1)

  • INIZIO PERIODO

    Per la data specificata, restituisce l'inizio del periodo a cui appartiene.
    Sintassi:
    INIZIO PERIODO(Data, Tipo Periodo)
    PeriodType può assumere i seguenti valori: MINUTO, ORA, GIORNO, SETTIMANA, MESE, TRIMESTRE, ANNO, DECENNIO, SEMESTRE
    Nella console delle query, inserisci:

    SELEZIONA INIZIO PERIODO(DATAORA(2016, 1, 15), MESE)

    La richiesta tornerà - 01/01/2016
    E ora un esempio. Come sapete, la frequenza del registro DipendentiOrganizzazioni un giorno. Creiamo una query in cui al posto del periodo effettivo dei record verrà visualizzata la data di inizio del mese.

    SCEGLI L'INIZIO DEL PERIODO (Dipendenti delle Organizzazioni.Periodo, MESE) AS Inizio del Mese, Dipendenti delle Organizzazioni.Dipendente, Dipendenti delle Organizzazioni.Posizione, Dipendenti delle Organizzazioni.Dipartimento dell'Organizzazione DAL Registro delle Informazioni.Dipendenti delle Organizzazioni AS Dipendenti delle organizzazioni

  • FINE PERIODO

    La sintassi è la stessa dell'inizio di un punto. E come suggerisce il nome, restituisce la fine del periodo per data e tipo di periodo. Non considereremo in dettaglio. Ci limitiamo a un mini esempio.
    Richiesta:

    SELEZIONA FINE PERIODO(DATAORA(2016, 1, 15), MESE)

    Ritorni 31.01.2016 23:59:59
    Come puoi vedere, il valore viene restituito accurato al secondo.

  • AGGIUNTA

    Aggiunge alla data il numero specificato di fasce orarie.
    Sintassi:
    ADDDATE(Data, Tipo Periodo, Conteggio)
    PeriodType assume gli stessi valori della funzione INIZIO PERIODO
    Prendiamo febbraio come esempio:

    SELEZIONA AGGIUNGI(DATAORA(2016, 2, 15), MESE, 2)

    Otteniamo la data 15/04/2016 0:00:00 AM Nonostante febbraio sia un mese breve, il giorno della data ricevuta è lo stesso di quello originale. È molto conveniente non dover pensare al numero di giorni in mesi.
    Il numero può anche essere negativo. Quindi l'intervallo viene contato nella direzione opposta.

  • DIFFERENZA DI DATA

    Calcola la differenza tra due date nelle unità specificate.
    Sintassi:
    DATEDIFF(DataInizio, DataFine, Tipo Periodo)
    Il tipo di periodo può assumere i seguenti valori: SECONDO, MINUTO, ORA, GIORNO, MESE, TRIMESTRE, ANNO
    Per esempio:

    SELEZIONA DIFFERENZA DATA(DATAORA(2016, 2, 15), DATAORA(2016, 3, 1), GIORNO)

    restituisce 15

Qui sono state considerate le funzioni più comunemente utilizzate del linguaggio di query 1C. Il resto è usato raramente. Se necessario, esempi di come lavorare con loro possono essere trovati nella guida integrata nella piattaforma 1C.

Mezzi per definire riferimenti nulli, date o stringhe. Considera come verificare la presenza di un collegamento, una data o una stringa vuoti in una richiesta 1C.

È possibile definire dati null utilizzando operatori speciali.

Le informazioni dal database 1C vengono richieste (e quindi ricevute) utilizzando uno strumento come un linguaggio di query (Query). Sono scritti in latino e cirillico. E una delle parole chiave-comandi (operatori) quando si ottengono informazioni è la parola-comando SELECT (SELECT, inglese) in combinazione con alcune costruzioni. Ecco alcuni esempi di costruzione delle attività richieste che ci interessano sull'argomento:

Controllo del contenuto NULL

Tale attività viene eseguita dall'operatore SELECT in combinazione con il costrutto "IS NULL":

SELEZIONARE
OrdiniResti.Cliente,
OrdersRemains.QuantityRemains
DA
Accumulazione Register.Orders.Balances AS OrdersBalances
DOVE
OrdersRemains.QuantityRemains IS NULL

Controllo della data

Una data vuota nella query 1C viene inserita costruendo "DATETIME (1, 1, 1, 0, 0, 0)":

SELEZIONARE
AccountIncomingSupplier.Link,
AccountIncomingSupplier.IncomingDate
DA
Documento. Conto fornitore in entrata AS Conto fornitore in entrata
DOVE
Conto fornitore in entrata Data in entrata = DATETIME(1, 1, 1, 0, 0, 0)

Controllo di riferimento

Il controllo dei valori intra-riferimento inesistenti (per piani dei conti, elenchi, ecc.) viene eseguito utilizzando la costruzione “VALUE(Reference.Name…EmptyReference)”:

Convalida della stringa

Il vuoto nelle stringhe viene rilevato applicando uno spazio tra virgolette "":

SELEZIONARE
Acquirenti.Link
DA
Directory Acquirenti COME Acquirenti
DOVE
Buyers.Code = ""

Ulteriori informazioni sui collegamenti interrotti e regolari

Un "pipistrello" è un collegamento (Link, inglese), che conduce (punta) a un elemento inesistente. Inesistente è inteso come uno che non è nel database. È utile conoscere tali collegamenti almeno per ricevere notifiche dal sistema in una forma più comprensibile. E registrare, cancellare e aprire oggetti irreali non ha senso.

Le piattaforme 1C non dispongono di mezzi interni per interromperle. Devi anche capire che al di fuori di quelli "interrotti", nel sistema vivono speciali "collegamenti vuoti", che dovrebbero essere distinti l'uno dall'altro.
Questo può essere scoperto senza interrogare il database:

Nel sistema 1C-7.7

Per il "bat", il metodo Link.Selected() e la funzione EmptyValue() restituiscono zero. Per "vuoto" - nel primo caso, zero, e nel secondo - uno. Per "normale" - uno e zero. Si scopre che in 1C-7.7 "rotto" non è un valore inesistente che non è considerato selezionato.

Nel sistema 1C-8.x

Tutto è diverso: in entrambi i casi (per "rotto" e "normale") il metodo restituisce False e la funzione restituisce True. La soluzione è questa: per un metodo "rotto", il metodo Link.GetObject() restituisce la funzione "Undefined". Per "vuoto" viene generato "Context Method Error". Per "normale" - il valore viene restituito in base alla documentazione; Si scopre che in 1C-8.x "rotto" - non sarà una funzione inesistente di un tipo di riferimento che restituisce un valore Undefined di un oggetto.

Da dove vengono

Quando si accede a un indirizzo inesistente di un collegamento interrotto, all'utente viene mostrata nella migliore delle ipotesi una notifica che l'oggetto non è stato trovato, nel peggiore dei casi - un'immagine della pagina del server. La loro caratteristica peggiore è la furtività. Di qui la difficoltà nel verificarne la correttezza. Mentre si lavora con la configurazione, viene costantemente finalizzata e aggiornata. Alcuni oggetti sono soggetti a rimozione, la struttura cambia. E il riferimento all'elemento cancellato rimane nelle costruzioni e negli algoritmi. Pertanto, gli indirizzi inesistenti rimangono nel sistema dopo che l'elemento stesso (insieme all'indirizzo) è stato eliminato.

Nel post di oggi, abbiamo trattato la creazione di query ad hoc. Vengono forniti esempi di strutture. Questo ti tornerà utile nel tuo lavoro durante la ricerca di valori vuoti.

Quando abbastanza spesso è necessario lavorare con variabili del tipo "Data". In questo articolo esamineremo le tecniche principali: passare la data corrente, verificare la presenza di un valore vuoto, una data arbitraria.

Quando si scrivono query, è spesso necessario confrontare i dati con la data corrente. Il linguaggio integrato 1C ha la funzione CurrentDate(). Ti permette di determinare ora attuale e la data sul computer. Per eseguire operazioni con la data corrente, il valore di questa funzione deve essere passato alla richiesta come parametro.

Di seguito è riportata una query che seleziona tutti i file allegati ai rapporti avanzati con una data di creazione fino ad ora:

RequestExample = Nuova richiesta;
EsempioRichiesta.Testo ="
|SCEGLI
| Advance ReportAttachedFiles.Link
| DA
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
|DOVE
| Advance ReportAttachedFiles.Date< &ТекДата»;
Query Esempio.SetParameter("CurrentDate", CurrentDate());

Data arbitraria

La funzione discussa sopra consente di confrontare e, quindi, effettuare una selezione per qualsiasi periodo. Questo metodo consente di specificare una selezione rigorosa nella query senza utilizzare parametri aggiuntivi.

Si noti che utilizzando questa funzione nell'esempio sopra, abbiamo passato solo tre numeri (anno, mese, giorno) come parametri di input. Gli ultimi tre (ora, minuto, secondo) sono facoltativi e, se assenti, sono sostituiti da "0", cioè dall'inizio della giornata.

Nell'ambito di questo esempio tutti i file allegati alle relazioni anticipate entro la fine dello scorso anno 2016 saranno ricevuti. A questo proposito, specificheremo l'ora, il minuto e il secondo da confrontare con il punto temporale "31 dicembre 2016 23:59:59".

SCEGLIERE
Advance ReportAttachedFiles.Link
DA
Directory.Advance Report File allegati AS Advance Report File allegati
DOVE
Advance ReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

data vuota

Il modo più semplice per verificare se una variabile contiene una data vuota è mediante un semplice confronto. In questo esempio, utilizzeremo una query per selezionare tutte le ricevute Soldi all'account con data di entrata vuota.

Quando si lavora con le date 1C, l'ordine tipico delle parti della data è anno, mese, giorno, ora, minuto, secondo. In questo caso si possono saltare ore, minuti, secondi.

Quando si crea una data da una stringa ("cast to date"), è possibile specificare in un formato localizzato (giorno.mese.anno ore:minuti:secondi), ma solo per intero.

Per esempio:
// Lavorare con le date 1C - convertire la data in 1C da parti - anno, mese, giorno (più ora facoltativa)
Data = Data(2012,10,30); //non c'è tempo
Data = Data(2012,10,30,12,00,00); //col tempo

// Lavorare con le date 1C: convertire una data in 1C da una stringa, in modi diversi
Data = Data("20121030"); //anno mese giorno
Data = Data("30/10/2012 12:00:00 PM"); //formato localizzato, solo completo

//Lavorare con le date 1C: specificare direttamente il valore della data senza eseguire il casting
Data = "20121030"; //non c'è tempo
Data = "20121030120000"; //col tempo

Lavorare con le date 1C - Data vuota 1C

Per verificare la pienezza della data 1C, viene confrontata con una "data vuota". Se nella directory/documento è presente un attributo con il tipo di data, se l'utente non ha compilato questo campo, anche il suo valore sarà “data vuota”.

La "data vuota" è 01.01.0001 00:00:00.

Per esempio:
DataVuota = "00010101000000";
Se DesiredDate = "00010101000000" Allora
alert("Non hai inserito la data richiesta");
Finisci se;

Lavorare con le date 1C - Data in dettaglio (directory, documenti, ecc.)

Quando si specifica il tipo di attributo, è possibile specificare di utilizzare:

  • Solo data (l'ora è quindi sempre 00:00:00)
  • Solo ora (la data è quindi sempre 01.01.0001)
  • data e ora

Ottenere la data

Per ottenere la data e l'ora, viene utilizzata la funzione 1C CurrentDate().

Il luogo in cui viene chiamata questa funzione è molto importante: sul client o sul server. Vedere l'argomento "Modalità Runtime/Runtime" per i dettagli. Accade spesso che l'ora sia leggermente diversa sui computer client, quindi cercano di utilizzare l'ora del server ovunque, anche se non è impostata correttamente sul server, almeno tutti i client avranno lo stesso orario sbagliato.

Per ottenere la data del server (la data impostata nel sistema operativo del computer server), di solito viene creato un modulo comune nella configurazione con la casella di controllo "Server" selezionata nelle proprietà e in esso viene creata una funzione
//la funzione si trova in un modulo comune, ad esempio denominato ServerFunctions
// nelle proprietà del modulo generale, la casella di controllo "Server" è impostata e la casella di controllo "Client" non è impostata
Funzione GetServerDate() Esporta
Restituisce DataCorrente();
Funzioni finali

//chiamare questa funzione per l'uso da un altro modulo ha questo aspetto
DocumentObject.Date = ServerFunctions.GetServerDate(); //NomeModulo.NomeFunzione()

Inoltre, nel thin client, direttamente accanto alle funzioni del modulo, è indicato dove verrà eseguito:

Inizio e fine giornata

Per la data "30.10.2012":

  • la data di inizio della giornata è simile a questa "10/30/2012 00:00:00"
  • la data di fine giornata è simile a questa "10/30/2012 23:59:59"

Utilizzato in report e query che richiedono dati per un periodo: giorno, mese, anno.

Ad esempio, il periodo da "01/01/2012 00:00:00" a "01/31/2012 00:00:00" non è corretto perché non include un giorno del mese (ma include un secondo di l'ultimo giorno del mese).

Lavorare con le date 1C - Confronto di date

Data contiene data e ora. Quando si confrontano le date (senza tener conto del tempo), di solito vengono portate all'inizio della giornata (mese, anno).

Per esempio:
Data1 = Data("30/10/2012 12:00:00");
If StartDay(Date1) = StartDay(DocumentRef.Date) Then
alert("Documento inserito nella data specificata");
Finisci se;

Per ogni evenienza, un esempio di confronto delle date in un periodo:
Se DocumentReference.Date >= MonthStart(CurrentDate()) e
DocumentReference.Date

Lavorare con le date 1C - Modificare la data

La data è il numero di secondi. Se vogliamo non solo scoprire se una data è maggiore dell'altra, ma anche quanto di più, otteniamo la differenza in secondi.

Per esempio:
StartDay = CurrentDate() – StartDay(CurrentDate());
Report("Dall'inizio della giornata è passato" + String(FROMDayStart) + "seconds");
Report("Dall'inizio della giornata è trascorsa " + String (DALL'inizio della giornata / 60) + "minuti");
Report("Dall'inizio della giornata è trascorsa " + String (DALL'inizio della giornata / 60/60) + "ore");

Possiamo anche cambiare la data, quando cambiamo aggiungiamo o sottraiamo il numero di secondi:
InizioQuestoGiorno = GiornoInizio(DataCorrente());

StartPreviousDay = StartDay(StartThisDay - 1); // rimuovi il secondo - facendo "ieri" e prendi l'inizio della giornata da "ieri"

StartPreviousDay = StartThisDay - 24*60*60; //un altro modo - sottrai 24 ore - 24 (ore) * 60 (minuti risultanti) * 60 (secondi)

Lavorare con le date 1C - Momento del tempo

Un punto nel tempo è una rappresentazione estesa di una data applicabile ai documenti (e quindi ai registri).

È necessario confrontare l'ora dei documenti se la data e l'ora dei documenti coincidono. Di conseguenza, può essere utilizzato per le selezioni nelle query.

È possibile ottenere un punto nel tempo da un documento nei seguenti modi:
//metodo 1
DocumentTimeMoment = DocumentReference.MomentTime();

Puoi anche confrontare un punto nel tempo con una data/ora:
MomentInTimeReference = New MomentInTime(StartDay(CurrentDate()));
Se DocumentReference.TimeIn().Compare(InTimeReference) = -1 Then
Show("Documento inserito prima di oggi");
Finisci se;
//Se il documento viene inserito con la data odierna alle 00:00:00, viene inserito comunque - oggi

Lavorare con le date 1C - Formattazione delle date

Questo articolo discuterà i modi per verificare la presenza di un valore vuoto, a seconda del tipo di attributo che viene archiviato, incluso un riferimento null.

Il valore NULL viene restituito quando l'attributo semplicemente non esiste. Anche in questo caso il tipo sarà NULL. Ad esempio, stai unendo due tabelle tramite un join sinistro. Nel caso in cui non venga trovato alcun valore per la tabella di sinistra in quella di destra, verrà restituito NULL.

Controlla dato valore può essere fatto usando la costruzione "IS NULL" e "". Nel primo caso viene restituito True o False. Nel secondo caso, puoi impostare immediatamente un altro valore nel caso in cui venga restituito NULL.

La query 1C 8.3 riportata di seguito restituirà un elenco di persone di contatto per i partner che non dispongono di un set di segmenti.

SCEGLIERE
ContattoPartners.Link
DA
Elenco.Persone di contatto dei partner AS Persone di contatto dei partner
UNIONE INTERNA
PO ContactPartners.Owner = SegmentsPartners.Parent
DOVE
SegmentsPartners.Reference IS NULL

data vuota

Il valore viene verificato per una data vuota confrontandolo con il costrutto DATETIME(1, 1, 1, 0, 0, 0). Di seguito è riportato un esempio di utilizzo:

Link vuoto nella richiesta 1C

Nel caso in cui l'attributo restituito abbia un tipo di riferimento, ad esempio, è un elemento di qualche directory, documento, ecc., viene utilizzata la seguente costruzione: VALUE(Catalog.CatalogName.EmptyReference).

Nell'esempio seguente, la query seleziona tutti i partner per i quali non è stata specificata un'area aziendale.

Per verificare la presenza di "ValueFilled" è necessario eseguire la condizione opposta:

Partner.BusinessRegion<>VALUE(Catalog.BusinessRegions.EmptyReference)

Linea vuota

Per verificare i tipi di stringa, viene eseguito un confronto con un altro modello. In questo caso - "".

La query seguente selezionerà tutti i partner con un nome vuoto.