Confronto con data vuota nella richiesta 1c

Tutti i documenti esistenti in configurazioni 1C, e quindi quasi tutti i registri, devono avere almeno una variabile di tipo Data, motivo per cui ogni sviluppatore deve conoscere e comprendere:

  • Come convertire parametri di altri tipi nel tipo in questione;
  • Come determinare una data vuota in una richiesta 1C;
  • Qual è la differenza tra data e limite di tempo.

È a queste domande che cercheremo di rispondere nel nostro articolo.

Che cos'è una data e come determinarla

Poiché la maggior parte delle decisioni di gestione e contabilità non richiede una precisione temporale superiore a 1 secondo, gli sviluppatori della piattaforma 1C hanno deciso che questo valore sarebbe stato il minimo massimo nel formato della data. Pertanto, ogni variabile che descrive l'ora di un evento nel programma deve contenere:

  • L'anno in cui si è verificato l'evento;
  • Il mese di questo evento;
  • Giorno.

Facoltativo: ora, minuto e secondo. Se questi tre parametri vengono omessi e non ci sono condizioni aggiuntive, il programma imposta automaticamente l'ora all'inizio della giornata.

I formati di data esistenti nel mondo hanno una differenza significativa:

  1. In Russia, siamo abituati a mettere prima il giorno, poi arriva il mese dell'evento e, alla fine, l'anno;
  2. I residenti negli Stati Uniti iniziano la data con un mese;
  3. Cechi, polacchi e sloveni scrivono il periodo nel formato "Anno - Mese - Giorno".

È l'ultimo formato utilizzato dalla piattaforma 1C.

Converti in data

Per ottenere un parametro di tipo Date da più valori o da una stringa è necessario utilizzare il codice mostrato in Fig. uno

Come puoi vedere dalla figura sopra, puoi determinare la data sia con l'aiuto di una riga, sia con la divisione di questa riga nelle sue parti componenti usando una virgola, il risultato non cambierà.

È importante capire che l'anno della data deve contenere quattro cifre, inclusi il millennio e il secolo dell'evento, mese, giorno, ore e secondi - deve essere lungo due caratteri, inclusi gli zeri iniziali.

Il conto alla rovescia nel programma parte dall'inizio della giornata del 1 gennaio 0001. Per il codice sopra, questo valore può essere determinato in due modi (Fig. 2).

Riso. 2

Nella seconda riga, abbiamo omesso le ore, i minuti ei secondi dell'evento, che non hanno influito in alcun modo sulle prestazioni del nostro codice.

Caratteristiche dell'utilizzo della data nelle richieste 1C

Per la maggior parte dei tipi di dati utilizzati dalla piattaforma 1C, sono presenti valori void predefiniti. Per i numeri, questo è 0, per i collegamenti, è possibile definire il valore EmptyReference (), per una data è consuetudine considerare la data di inizio come un valore vuoto, è con esso che è necessario confrontare i dettagli del corrispondente digitare durante l'impostazione dei parametri di query.

È importante capire che anche se non sono indicati numeri nel valore dell'attributo form del tipo in questione, ovvero la finestra si presenta come (Fig. 3), ciò non significa che non sia specificato nulla in essa, il il confronto di questo parametro con una stringa vuota non funzionerà.

Riso. 3

Avendo ricevuto una data vuota, possiamo specificarla come parametro alla nostra richiesta, ovvero utilizzare la costruzione (Fig. 4)

Tuttavia, ci sono momenti in cui è meglio controllare all'interno del corpo della richiesta senza passare una data vuota come parametro. Per fare ciò, è possibile inserire la condizione appropriata nel codice di richiesta (Fig. 5) e utilizzare la funzione di richiesta DateTime ().

Riso. 5

Nel testo della query fornito, abbiamo omesso gli zeri iniziali per l'anno, il mese e il giorno, e inoltre non abbiamo indicato le ore, i minuti ei secondi, e il programma, come si suol dire, ha mangiato questa ipotesi.

Data e ora limite

Un altro fatto interessante sulla relazione tra query e date è l'uso del concetto di "punto nel tempo" quando si fa riferimento a varie tabelle nel database.

L'accuratezza "fino al millisecondo" indicata nella documentazione tecnica quando si descrive il tipo Data primitivo si manifesta più chiaramente quando si selezionano i record dalle tabelle virtuali del registro di accumulo: se il registro di accumulo, oltre alla tabella Fatturati, ha tabelle Resti e Resti e Fatturati, quindi la loro selezione, effettuata per un certo tempo, può dare risultati diversi.

Per capire come e perché ciò accade, considera un semplice esempio:

  1. Prima che il documento di vendita fosse effettuato a 12 ore 31 minuti 36 secondi, i saldi secondo la nomenclatura Zucchero erano 30 kg;
  2. Il documento all'ora indicata è stato cancellato di 10 kg;
  3. Il report generato alla data del documento a 12 ore 31 minuti 36 secondi secondo la tabella Saldi riporterà il residuo di 30 kg;
  4. Lo stesso rapporto sulla tabella Residui e Fatturato contemporaneamente mostrerà un residuo di 20 kg.

Qual è la ragione di questo comportamento e come evitarlo?

Il problema è che nella tabella Resti il ​​periodo è impostato da un segmento aperto, cioè non vengono presi in considerazione i movimenti effettuati al momento della generazione del report, cioè il tempo viene preso all'inizio del secondo specificato nel parametro. Allo stesso tempo, per la tabella Turni e per la tabella Remaining AND Turnover, vengono presi in considerazione i limiti di tempo, ovvero il tempo viene preso alla fine del secondo specificato.

Ci sono diversi modi per uscire da questa situazione:

  1. Quando si utilizza la tabella Residui, indicare un punto temporale maggiore di 1 secondo rispetto a quello specificato;
  2. Utilizzare solo la tabella Resti e Fatturati (non l'opzione più ottimale in termini di prestazioni);
  3. Usa il concetto di confine.

L'ultima opzione può essere rappresentata dal codice mostrato in Fig. 6.

Nel primo parametro del nostro oggetto, indichiamo la data in cui è necessario generare il report, il secondo parametro determina il tipo di bordo. Poiché per noi è importante che i movimenti per una determinata data siano inclusi nel campione, dobbiamo impostare questo parametro sulla posizione "Compreso".

Molto spesso nelle richieste 1C devi lavorare con le date. Soprattutto quando la query viene creata per oggetti di metadati che contengono informazioni periodiche. Di norma, si tratta di registri (informazione, accumulazione, calcolo, contabilità). Consideriamo le funzioni più utilizzate del linguaggio di query 1C per lavorare con le date. Costruiremo esempi basati sul registro delle informazioni DipendentiOrganizzazioni Revisione configurazione ZUP 2.5.

  • APPUNTAMENTO

    Consente di ottenere la data nella richiesta (con o senza ora) specificando anno, mese, giorno, ora, minuto, secondo.
    Sintassi:
    DATA ORA (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 DATA ORA (2016, 1, 1)

    Come risultato dell'esecuzione della richiesta, otteniamo la data - 01/01/2016
    Difficile, infatti, immaginare una situazione in cui la data sarà 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, la data vuota sembra - 0001.01.01. Quindi, per ottenere una data vuota nella richiesta, è sufficiente specificare DATA ORA (1, 1, 1)... Ad esempio, selezioniamo dal registro delle informazioni DipendentiOrganizzazioni voci non riempite Periodo di completamento:

    SELEZIONA Dipendenti delle organizzazioni Periodo, Dipendenti delle organizzazioni Dipendente, Dipendenti delle organizzazioni Posizione, Dipendenti delle organizzazioni Suddivisione di un'organizzazione DAL Registro delle informazioni Dipendenti delle organizzazioni COME Dipendenti delle organizzazioni DOVE Dipendenti delle organizzazioni.

  • INIZIO PERIODO

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

    SELEZIONA INIZIO PERIODO (DATA ORA (2016, 1, 15), MESE)

    La richiesta tornerà - 01.01.2016
    Ora per un esempio. Come sai la frequenza alla cassa DipendentiOrganizzazioni un giorno. Componiamo una query in cui verrà visualizzata la data di inizio mese al posto del periodo valido dei record.

    SCEGLI L'INIZIO DEL PERIODO (Dipendenti delle organizzazioni. Periodo, MESE) COME Inizio del mese, Impiegati delle organizzazioni Impiegato, Impiegati delle organizzazioni Posizione, Impiegati delle organizzazioni Una suddivisione di un'organizzazione.

  • FINE PERIODO

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

    SELEZIONA FINE PERIODO (DATA ORA (2016, 1, 15), MESE)

    Resi 31/01/2016 23:59:59
    Come puoi vedere, il valore viene restituito preciso al secondo.

  • AGGIUNGI

    Aggiunge alla data il numero specificato di intervalli di tempo.
    Sintassi:
    AGGIUNGI A DATA (Data, PeriodType, Count)
    PeriodType accetta gli stessi valori della funzione INIZIO PERIODO
    Prendiamo come esempio una data di febbraio:

    SELEZIONA AGGIUNGI A DATA (DATA ORA (2016, 2, 15), MESE, 2)

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

  • DIFFERENZA

    Calcola la differenza tra due date nelle unità specificate.
    Sintassi:
    DIFFERENZA DI DATA (Data di inizio, Data di fine, PeriodType)
    Il tipo di periodo può assumere i seguenti valori: SECONDO, MINUTO, ORA, GIORNO, MESE, TRIMESTRE, ANNO
    Ad esempio:

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

    restituisce 15

Qui sono state considerate le funzioni più utilizzate del linguaggio di query 1C. Il resto è usato raramente. Se necessario, è possibile trovare esempi di lavoro con loro nell'aiuto integrato nella piattaforma 1C.

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

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

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

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

// Lavorare con le date 1C - specificando il valore della data senza casting, direttamente
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 la "data vuota". Se è presente un attributo del tipo di data nel libro/documento di riferimento, se l'utente non ha compilato questo campo, anche il suo valore sarà "data vuota".

"Data vuota" è 01.01.0001 00:00:00.

Ad esempio:
DataVuota = "00010101000000";
Se DataRichiesta = "00010101000000" Allora
Report ("Non hai inserito una data molto necessaria");
Finisci se;

Lavorare con le date 1C - Data nei dettagli (libri di riferimento, documenti, ecc.)

Quando si specifica il tipo di attributo, è possibile specificare l'uso di:

  • Solo data (l'ora è 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, utilizzare la funzione 1C CurrentDate().

Il posto molto importante è dove viene chiamata questa funzione - sul client o sul server. Per i dettagli, vedere l'argomento "Modalità prestazioni/Prestazioni". Accade spesso che l'ora sia leggermente diversa sulle macchine client, quindi cercano di utilizzare l'ora del server ovunque - anche se non è impostata correttamente sul server, almeno tutti i client avranno la stessa ora sbagliata.

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 la funzione
// la funzione si trova in un modulo comune, ad esempio denominato ServerFunctions
// nelle proprietà del modulo comune, la casella di controllo "Server" è selezionata e la casella di controllo "Client" non è impostata
Funzione GetServerDate() Export
Restituisce DataCorrente ();
EndFunction

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

Inoltre, nel thin client, direttamente accanto alle funzioni dei moduli, viene 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 è simile a questa "10/30/2012 23:59:59"

Viene utilizzato nei report e nelle query che richiedono dati per un periodo: giorno, mese, anno.

Quindi, ad esempio, il periodo dal 01/01/2012 00:00:00 al 31/01/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 delle date

Data contiene data e ora. Quando si confrontano le date (esclusa l'ora), di solito vengono portate all'inizio del giorno (mese, anno).

Ad esempio:
Data1 = Data ("30/10/2012 12:00:00");
Se StartDay (Date1) = StartDay (DocumentRef.Date) Allora
Report ("Il documento è stato inserito entro la data specificata");
Finisci se;

Per ogni evenienza, un esempio di confronto delle date in un periodo:
Se DocumentRef.Date> = StartMonth (CurrentDate ()) e
DataRif.Documento

Lavorare con le date 1C - Modifica della data

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

Ad esempio:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Report ("Dall'inizio della giornata è trascorso" + String (dall'inizio della giornata) + "secondi");
Report ("Dall'inizio della giornata è trascorso" + String (dall'inizio della giornata / 60) + "minuti");
Report ("Dall'inizio della giornata è passato" + Stringa (dall'inizio della giornata / 60/60) + "ore");

Possiamo anche cambiare la data, quando cambiamo, aggiungiamo o sottraiamo il numero di secondi:
StartThisDay = StartDay (CurrentDate ());

BeginningPreviousDay = BeginningDay (BeginningThisDay - 1); // rimuovi il secondo - facendo "ieri" e prendi l'inizio della giornata da "ieri"

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

Lavorare con le date 1C - Momento del tempo

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

È necessario confrontare l'ora dei documenti se la data e l'ora dei documenti coincidono. Di conseguenza, può essere utilizzato quando si filtrano le query.

Un momento nel tempo può essere ottenuto da un documento nei seguenti modi:
// metodo 1
DocumentMomentTime = DocumentRef.Timepoint ();

Puoi anche confrontare un punto nel tempo con una data/ora:
Moment of TimeStatus = New Moment of Time (Start of Day (CurrentDate ()));
If DocumentRef.MomentTime(). Compare (TimeTimeStandard) = -1 Then
Report ("Il documento è stato presentato prima di oggi");
Finisci se;
// Se il documento è stato inserito entro la data odierna alle 00:00:00, è stato inserito comunque - oggi

Lavorare con le date 1C - Formattazione della data

Questo articolo esaminerà i modi per verificare la presenza di un valore null in base al tipo di attributo archiviato, incluso un collegamento null.

Viene restituito un valore NULL quando semplicemente non ci sono oggetti di scena. Anche in questo caso il tipo sarà NULL. Ad esempio, stai unendo due tabelle tramite un join sinistro. Nel caso in cui non vengano trovati valori nella tabella di destra per la tabella di sinistra, verrà restituito NULL.

Il controllo di questo valore può essere effettuato utilizzando le costruzioni "IS NULL" e "". Nel primo caso restituisce True o False. Nel secondo caso è possibile impostare immediatamente un valore diverso nel caso in cui venga restituito NULL.

La richiesta 1C 8.3 di seguito restituirà un elenco di persone di contatto per quei partner che non hanno un segmento specificato.

SELEZIONARE
ContattoPartners.Link
A PARTIRE DAL
Directory.Persone di contatto dei partner COME PERSONE DI CONTATTO DEI PARTNER
INTERNAL JOINT Directory.SegmentsPartners AS SegmentsPartners
Contatti partner software.Proprietario = Segmenti partner.Parent
DOVE
Segmenti partner.Ref IS NULL

Data vuota

La convalida per una data vuota viene eseguita confrontandola con la costruzione DATE TIME (1, 1, 1, 0, 0, 0). Di seguito è riportato un esempio di utilizzo:

Collegamento vuoto nella richiesta 1C

Nel caso in cui l'attributo restituito abbia un tipo di riferimento, ad esempio, è un elemento di un dizionario, documento, ecc., viene utilizzata la seguente costruzione: VALUE (Directory.ReferenceName.EmptyRef).

Nell'esempio seguente, la query seleziona tutti i partner che non hanno un'area aziendale specificata.

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

Partners.BusinessRegion<>VALUE (Directory.BusinessRegions.EmptyLink)

Riga vuota

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

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

Ad un certo punto, è necessario lavorare con variabili del tipo "Data". In questo articolo, esamineremo le tecniche di base: 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 1C integrato ha la funzione CurrentDate(). Ti consente di determinare l'ora e la data correnti sul tuo computer. Per eseguire operazioni con la data corrente è necessario passare il valore di questa funzione come parametro alla richiesta.

Di seguito è riportata una query che seleziona tutti i file allegati alle note spese con una data di creazione fino ad ora:

EsempioRequest = Nuova richiesta;
EsempioRequest.Text = "
| SCEGLI
| Anticipo ReportAttached Files.Link
| DA
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| DOVE
| File allegati del rapporto anticipato.Data< &ТекДата»;
EsempioRequest.SetParameter ("CurrentDate", CurrentDate ());

Data personalizzata

La funzione di cui 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.

Nota che usando 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, vengono sostituiti con "0", cioè l'inizio della giornata.

Per questo esempio, riceverai tutti i file allegati alle note spese fino alla fine dello scorso 2016. A questo proposito, indicheremo l'ora, il minuto e il secondo per confrontare con il momento temporale "31 dicembre 2016 alle 23:59:59".

SELEZIONARE
Anticipo ReportAttached Files.Link
A PARTIRE DAL
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
DOVE
File allegati del rapporto anticipato.Data< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Data vuota

È più semplice controllare una variabile per vedere se contiene una data vuota con un semplice confronto. In questo esempio, utilizzando una query, selezioneremo tutte le ricevute di cassa su un conto bancario, per cui la data di entrata non è compilata.