Valeur de date vide dans la requête 1s 8.3. avec vérification de la valeur vide. Exemples de

Tous les documents existant dans les configurations 1C, et, par conséquent, presque tous les registres doivent avoir au moins une variable avec le type Date, c'est pourquoi chaque développeur doit savoir et comprendre :

  • Comment convertir des paramètres d'autres types vers le type en question ;
  • Comment déterminer une date vide dans une requête 1C ;
  • Quelle est la différence entre la date et la limite d'heure.

C'est à ces questions que nous tenterons de répondre dans notre article.

Qu'est-ce qu'une date et comment la déterminer

Étant donné que la plupart des décisions de gestion et de comptabilité ne nécessitent pas une précision temporelle supérieure à 1 seconde, les développeurs de la plate-forme 1C ont décidé que cette valeur serait le minimum maximum dans le format de date. Ainsi, chaque variable décrivant l'heure d'un événement dans le programme doit contenir :

  • L'année où l'événement s'est produit ;
  • Le mois de cet événement ;
  • Jour.

En option : heure, minute et seconde. Si ces trois paramètres sont omis et non conditions additionnelles, le programme règle automatiquement l'heure au début de la journée.

Les formats de date existant dans le monde présentent une différence significative :

  1. En Russie, nous avons l'habitude de mettre le jour en premier, puis le mois de l'événement, et à la fin - l'année ;
  2. Les résidents américains commencent la date par un mois ;
  3. Les Tchèques, les Polonais et les Slovènes écrivent la période au format Année - Mois - Jour.

C'est le dernier format utilisé par la plate-forme 1C.

Convertir en date

Afin d'obtenir un paramètre de type Date à partir de plusieurs valeurs ou d'une chaîne, vous devez utiliser le code illustré à la Fig. 1

Comme vous pouvez le voir sur la figure ci-dessus, vous pouvez déterminer la date à la fois à l'aide d'une ligne et avec la division de cette ligne en ses composants à l'aide d'une virgule, le résultat ne changera pas.

Il est important de comprendre que l'année de la date doit contenir quatre chiffres, y compris le millénaire et le siècle de l'événement, le mois, le jour, les heures et les secondes - doit comporter deux caractères, y compris les zéros non significatifs.

Compte à rebours dans le programme vaà partir du début de la journée du 1er janvier 0001. Pour le code ci-dessus, cette valeur peut être déterminée de deux manières (Fig. 2).

Riz. 2

Dans la deuxième ligne, nous avons omis les heures, minutes et secondes de l'événement, ce qui n'affectait en rien les performances de notre code.

Caractéristiques de l'utilisation de la date dans les requêtes 1C

Pour la plupart des types de données utilisés par la plate-forme 1C, il existe des valeurs vides prédéfinies. Pour les nombres, c'est 0, pour les liens, vous pouvez définir la valeur EmptyReference(), pour une date, il est d'usage de considérer la date de début comme une valeur vide, c'est avec elle qu'il faut comparer les attributs du correspondant type lors de la définition des paramètres de requête.

Il est important de comprendre que même si aucun nombre n'est indiqué dans la valeur de l'attribut form du type en question, c'est-à-dire que la fenêtre ressemble à (Fig. 3), cela ne signifie pas que rien n'y est spécifié, le la comparaison de ce paramètre avec une chaîne vide ne fonctionnera pas.

Riz. 3

Ayant reçu une date vide, nous pouvons la spécifier en paramètre de notre requête, c'est-à-dire utiliser la construction (Fig. 4)

Cependant, il est parfois préférable de vérifier à l'intérieur du corps de la requête sans passer une date vide en paramètre. Pour ce faire, vous pouvez saisir la condition appropriée dans le code de requête (Fig. 5) et utiliser la fonction de requête DateHeure ().

Riz. 5

Dans le texte de requête donné, nous avons omis les zéros de tête pour l'année, le mois et le jour, et n'avons pas non plus indiqué les heures, les minutes et les secondes, et le programme, comme on dit, a mangé cette hypothèse.

Limite de date et d'heure

Un autre fait intéressant concernant la relation entre les requêtes et les dates est l'utilisation du concept de « point dans le temps » en se référant à diverses tables de base de données.

La précision "jusqu'à la milliseconde" spécifiée dans la documentation technique lors de la description du type de date primitif se manifeste le plus clairement lors de la sélection d'enregistrements à partir des tables virtuelles du registre d'accumulation : si le registre d'accumulation, en plus de la table des chiffres d'affaires, comporte des tables Remains et Remains et Chiffres d'affaires, puis leur sélection, effectuée pendant un certain temps, peut donner des résultats différents.

Pour comprendre comment et pourquoi cela se produit, considérons un exemple simple :

  1. Avant que l'acte de vente ne soit réalisé à 12 heures 31 minutes 36 secondes, les balances selon la nomenclature Sucre étaient de 30 kg ;
  2. Le document à l'heure indiquée a été radié 10 kg;
  3. Le rapport généré à la date du document à 12 heures 31 minutes 36 secondes selon le tableau Balances indiquera le reste de 30 kg ;
  4. Le même rapport sur le tableau Résidus et Chiffre d'affaires en même temps montrera un résiduel de 20 kg.

Quelle est la raison de ce comportement et comment l'éviter ?

Le problème est que dans la table Remains, la période est définie par un segment ouvert, c'est-à-dire que les mouvements effectués au moment de la génération du rapport ne sont pas pris en compte, c'est-à-dire que le temps est pris au début de la seconde spécifiée dans le paramètre. Parallèlement, pour la table Turns et pour la table Remaining AND Turnover, les limites de temps sont prises en compte, c'est-à-dire que le temps est pris à la fin de la seconde spécifiée.

Il y a plusieurs façons de sortir de cette situation :

  1. Lorsque vous utilisez le tableau des résidus, indiquez un point dans le temps supérieur d'une seconde à celui spécifié ;
  2. Utilisez uniquement le tableau Restes et Chiffres d'affaires (pas l'option la plus optimale en termes de performances) ;
  3. Utilisez le concept de frontière.

La dernière option peut être représentée par le code montré dans la Fig. 6.

Dans le premier paramètre de notre objet, nous indiquons la date à laquelle le rapport doit être généré, le deuxième paramètre détermine le type de bordure. Puisqu'il est important pour nous que les mouvements pour une date donnée soient inclus dans l'échantillon, nous devons mettre ce paramètre sur la position "Incluant".

Lorsqu'il travaille avec des requêtes, tout programmeur doit interagir avec des valeurs vides d'une manière ou d'une autre. Qu'entendons-nous par valeur vide?

Une valeur vide est soit aucune valeur, soit une valeur par défaut pour le type de données. Avec les types primitifs, tout est assez simple : la valeur par défaut est une valeur initiale qui sert de point de départ.

Types de valeurs nulles

Considérez les types de valeurs nulles qui peuvent être rencontrées ou requises dans une requête.

  • Pour Nombre - la valeur nulle est zéro - 0.
  • Pour le type String - une chaîne vide - "".
  • Pour le type Date - 1er janvier de la première année - 01.01.001 00:00:00. C'est à partir de cette date que le temps est compté en 1C.*
  • Pour un type booléen, la valeur par défaut est techniquement False, mais logiquement les deux valeurs du type sont renseignées. Par conséquent, la décision de savoir si la valeur vide est fausse ou non est basée sur la logique de l'algorithme particulier.

* Attention, en dehors de 1C il y a divers systèmes compter des dates avec des points de référence différents.

La valeur manquante au sens plein correspond uniquement au type Nul. Ce type ne contient qu'une seule valeur, ce qui n'indique aucune valeur.

Un genre similaire Indéfini contient également une seule valeur, mais Undefined ne signifie pas l'absence de données, mais seulement l'impossibilité de définir une valeur par défaut pour le type. Undefined est la valeur par défaut pour les types composites, y compris ceux qui ne sont pas explicitement définis. Par exemple, la valeur dans nouvelle ligne un tableau de valeurs dans une colonne dont le type n'est pas explicitement défini.

Avec référence les types sont beaucoup moins ambigus. Tous les types de référence sont nuls. Une valeur vide est la même référence avec une indication du type de données, mais sans l'identifiant unique d'une valeur spécifique. Grâce à cela, nous pouvons traiter un lien vide comme un lien normal et lui appliquer toutes les méthodes fournies par la plate-forme, en travaillant avec lui comme une valeur complète.

Travailler avec des valeurs nulles dans une requête

Que vous ayez besoin d'entrer explicitement une valeur nulle dans le résultat de la requête ou de comparer des valeurs existantes avec celle-ci, vous devez savoir comment décrire les valeurs nulles dans une requête.

Les types Nombre, Chaîne, Booléen sont décrits dans la requête comme dans le langage intégré :

SÉLECTIONNEZ 0 COMME NUMÉRO DE TYPE D'EXEMPLE, "Hello world" COMME TYPE D'EXEMPLE Chaîne, VRAI COMME TYPE D'EXEMPLE Booléen

Undefined, étant essentiellement un type primitif, est décrit de la même manière :

Sélectionnez Lots.Period From Accumulation Register.Lots As Lots Where Balances.DocumentBatches = Undefined

Les valeurs de référence vides sont un peu plus délicates à définir. Tous les objets référencés ont une valeur de service prédéfinie EmptyRef. Grâce à cela, il est possible de sélectionner un lien vide de manière unifiée - via la fonction Valeur :

Sélectionnez la valeur(Reference.Nomenclature.EmptyRef) En tant que nomenclature vide

Les possibilités de travailler avec des valeurs Null sont un peu plus riches. Comme les autres types primitifs, Null est décrit de la même manière que dans le langage intégré. De plus, il existe un opérateur spécial Yes Null et la fonction YesNull.

  • L'opérateur Yes Null vous permet de créer Expression booléenne comparer la valeur sélectionnée à une valeur Null.
  • La fonction YesNull renvoie le premier argument s'il n'est pas Null, et le deuxième argument sinon.

Les expressions qui spécifient des valeurs nulles peuvent être utilisées dans n'importe quelle clause de requête qui prend en charge les expressions. Par exemple, vous pouvez ajouter un lien vide à la section Sélectionner ou vérifier Null dans la condition.

Exemples pratiques

Utilisation de la fonction Valeur

Sélectionnez Products.Ref As Nomenclature, Products.Ref = Value (Directory.Nomenclature.EmptyLink) Like ThisLink Empty From WTProducts as WTProducts

Utilisation de l'opérateur Oui Nul

Sélectionnez Products.Ref As Nomenclature, Products.Link Have Null Like ThisLink Empty From WTGoods Like TueProducts

Null à gauche ou jointure complète

Vérification de la valeur nulle

L'exemple montre une situation pratique courante où, avec une jointure à gauche, pour la première table il n'y a pas de correspondance dans la seconde. Dans ce cas, tous les champs de la deuxième table seront égaux à Null.

Sélectionnez TuProducts.Ref As Nomenclature, Balance.Quantity Balance As Quantity, Balance.Quantity Balance is null car aucun solde de TuProducts as TuProducts Connexion gauche Registre d'accumulation.Produits dans les entrepôts.Soldes en tant que soldes par TuGoods.Ref = Soldes.Nomenclature

Gestion des valeurs nulles

Modification de la requête précédente pour démontrer une technique courante pour obtenir des valeurs par défaut au lieu de celles manquantes. Dans cet exemple en utilisant Fonctions OuiNull, la valeur manquante du reste est remplacée par un 0 logiquement correct.

Sélectionnez TuProducts.Ref en tant que nomenclature, avoir Null (Balance.QuantityLeft, 0) en tant que quantité de TuProducts en tant que TuProducts Connexion gauche Registre d'accumulation.Produits dans les entrepôts.Soldes en tant que soldes par TuGoods.Ref = Soldes.Nomenclature

Dans le cadre de cet article, nous avons examiné différents types de valeurs vides et leurs propriétés, étudié des moyens de déterminer différents types valeurs vides dans les requêtes, et dans la partie pratique nous étions convaincus de la facilité d'application du matériel considéré.

Lorsque vous travaillez avec des dates 1C, l'ordre typique des parties de la date est l'année, le mois, le jour, l'heure, les minutes, les secondes. Dans ce cas, les heures, minutes, secondes peuvent être sautées.

Lors de la création d'une date à partir d'une chaîne ("cast to date"), vous pouvez spécifier dans le format localisé (jour.mois.année heures : minutes : secondes), mais seulement complètement.

Par exemple:
// Travailler avec des dates 1C - convertir une date en 1C à partir de pièces - année, mois, jour (plus heure facultative)
Date = Date (2012,10,30); // pas le temps
Date = Date (2012,10,30,12,00,00); //avec le temps

// Travailler avec des dates 1C - convertir une date en 1C à partir d'une chaîne, de différentes manières
Date = Date ("20121030"); // année mois jour
Date = Date ("30/10/2012 12:00:00"); // format localisé, uniquement en entier

// Travailler avec des dates 1C - en spécifiant la valeur de la date sans transtypage, directement
Date = "20121030" ; // pas le temps
Date = "20121030120000" ; //avec le temps

Travailler avec des dates 1C - Date vide 1C

Pour vérifier la plénitude de la date 1C - elle est comparée à la "date vide". S'il existe un attribut de type date dans le livre/document de référence, si l'utilisateur n'a pas renseigné ce champ, alors sa valeur sera également « date vide ».

La "date vide" est 01.01.001 00:00:00.

Par exemple:
DateVide = "00010101000000" ;
Si DateRequise = "00010101000000" Alors
Rapport ("Vous n'avez pas renseigné une date très nécessaire");
Fin si;

Travailler avec des dates 1C - Date en détails (ouvrages de référence, documents, etc.)

Lors de la spécification du type d'attribut, vous pouvez spécifier l'utilisation de :

  • Date uniquement (l'heure est alors toujours 00:00:00)
  • Heure uniquement (la date est alors toujours 01.01.0001)
  • Date et l'heure

Obtenir la date

Pour obtenir la date et l'heure, utilisez la fonction 1C CurrentDate ().

L'endroit très important est l'endroit où cette fonction est appelée - sur le client ou sur le serveur. Pour plus de détails, consultez la rubrique « Mode de performance / Performance ». Il arrive souvent que l'heure soit légèrement différente sur les machines clientes, alors ils essaient d'utiliser l'heure du serveur partout - même si elle n'est pas définie correctement sur le serveur, alors au moins tous les clients auront la même heure erronée.

Afin d'obtenir la date du serveur (la date définie dans système opérateur ordinateur serveur), généralement dans la configuration, ils créent un module commun avec la case "Serveur" cochée dans les propriétés, et y créent la fonction
// la fonction est située dans un module commun, par exemple nommé ServerFunctions
// dans les propriétés module commun la case "Serveur" est cochée et la case "Client" n'est pas cochée
Fonction GetServerDate() Exporter
Renvoie DateCourante ();
FinFonction

// appeler cette fonction pour une utilisation depuis un autre module ressemble à ceci
DocumentObject.Date = ServerFunctions.GetServerDate (); //NomModule.NomFonction ()

aussi dans client léger directement à partir des fonctions des modules, il est indiqué où il sera exécuté :

Début et fin de journée

Pour la date "30/10/2012":

  • la date de début de la journée ressemble à ceci "30/10/2012 00:00:00"
  • la date de fin ressemble à ceci "30/10/2012 23:59:59"

Il est utilisé dans les rapports et les requêtes qui nécessitent des données pour une période - jour, mois, année.

Par exemple, la période du 01/01/2012 00:00:00 au 31/01/2012 00:00:00 est incorrecte, car elle n'inclut pas un jour du mois (mais elle inclut une seconde du dernier jour du mois).

Travailler avec des dates 1C - Comparer des dates

La date contient la date et l'heure. Lors de la comparaison des dates (hors heure), elles sont généralement ramenées au début de la journée (mois, année).

Par exemple:
Date1 = Date ("30/10/2012 12:00:00");
Si StartDay (Date1) = StartDay (DocumentRef.Date) Alors
Rapport ("Le document a été saisi à la date spécifiée");
Fin si;

Juste au cas où, un exemple de comparaison de dates dans une période :
Si DocumentRef.Date> = StartMonth (CurrentDate ()) et
DocumentRef.Date

Travailler avec des dates 1C - Changement de date

La date est le nombre de secondes. Si nous voulons non seulement savoir si une date est supérieure à une autre, mais aussi de combien plus, alors nous obtenons la différence en secondes.

Par exemple:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Rapport ("Depuis le début de la journée est passé" + Chaîne (Depuis le début de la journée) + "secondes");
Rapport ("Depuis le début de la journée est passé" + Chaîne (Depuis le début de la journée / 60) + "minutes");
Rapport ("Depuis le début de la journée est passé" + Chaîne (Depuis le début de la journée / 60/60) + "heures");

Nous pouvons également changer la date, lors du changement, nous ajoutons ou soustrayons le nombre de secondes:
StartThisDay = StartDay (CurrentDate ());

BeginningPreviousDay = BeginningDay (BeginningThisDay - 1); // supprimer le second - faire "hier" et prendre le début de la journée à partir de "hier"

StartPreviousDay = StartThisDay - 24 * 60 * 60 ; // une autre façon - nous soustrayons 24 heures - 24 (heures) * 60 (minutes avérées) * 60 (secondes)

Travailler avec des dates 1C - Moment de temps

Un point dans le temps est une représentation de date étendue applicable aux documents (et par conséquent aux registres).

Il est nécessaire de comparer l'heure des documents si la date et l'heure des documents sont les mêmes. Par conséquent, il peut être utilisé lors du filtrage dans les requêtes.

Un moment dans le temps peut être obtenu à partir d'un document des manières suivantes :
// méthode 1
DocumentMomentTime = DocumentRef.Timepoint ();

Vous pouvez également comparer un point dans le temps avec une date/heure :
Moment of TimeStatus = New Moment of Time (Début de la journée (CurrentDate ()));
Si DocumentRef.MomentTime(). Compare (TimeTimeStandard) = -1 Then
Rapport ("Le document a été présenté plus tôt qu'aujourd'hui");
Fin si;
// Si le document a été saisi à la date d'aujourd'hui à 00:00:00, il a quand même été saisi - aujourd'hui

Travailler avec des dates 1C - Formatage de date

A un moment donné, il est nécessaire de travailler avec des variables de type "Date". Dans cet article, nous examinerons les techniques de base - passer la date actuelle, rechercher une valeur vide, une date arbitraire.

Lors de l'écriture de requêtes, il est souvent nécessaire de comparer les données avec la date actuelle. Le langage 1C intégré a la fonction CurrentDate (). Il vous permet de déterminer l'heure et la date actuelles sur votre ordinateur. Pour effectuer des opérations avec la date courante, il est nécessaire de passer la valeur de cette fonction en paramètre à la requête.

Vous trouverez ci-dessous une requête qui sélectionne tous les fichiers joints aux notes de frais avec une date de création à ce jour :

ExempleRequête = Nouvelle requête ;
ExampleRequest.Text = "
| CHOISIR
| Rapport avancéFichiers attachés.Lien
| DE
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| O
| Fichiers joints au rapport préalable.Date< &ТекДата»;
ExampleRequest.SetParameter ("CurrentDate", CurrentDate ());

Date personnalisée

La fonction ci-dessus vous permet de comparer et donc de faire une sélection pour n'importe quelle période. Cette méthode vous permet de spécifier une sélection stricte dans la requête sans utiliser de paramètres supplémentaires.

Notez qu'en utilisant cette fonction dans l'exemple ci-dessus, nous n'avons passé que trois nombres (année, mois, jour) comme paramètres d'entrée. Les trois dernières (heure, minute, seconde) sont facultatives et, si elles sont absentes, sont remplacées par "0", c'est-à-dire le début de la journée.

Dans le cadre de cet exemple tous les fichiers joints aux notes de frais jusqu'à la fin de l'année 2016 seront reçus. À cet égard, nous indiquerons l'heure, la minute et la seconde afin de comparer avec le moment "31 décembre 2016 23:59:59".

SÉLECTIONNER
Rapport avancéFichiers attachés.Lien
DE
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles

Fichiers joints au rapport préalable.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Date vide

Il est plus facile de vérifier une variable pour voir si elle contient une date vide avec une simple comparaison. Dans cet exemple, à l'aide d'une requête, nous sélectionnerons tous les encaissements de fonds sur un compte bancaire, pour lesquels la date d'entrée n'est pas renseignée.