1cリクエストの空の日付との比較

1C構成で存在するすべてのドキュメント、したがってほとんどすべてのレジスタには、日付型の変数が少なくとも1つ必要です。そのため、すべての開発者は次のことを知って理解する必要があります。

  • 他のタイプのパラメータを問題のタイプに変換する方法。
  • 1Cリクエストで空の日付を決定する方法。
  • 日付と時刻の境界の違いは何ですか。

私たちの記事で答えようとするのは、これらの質問です。

日付とは何ですか、それを決定する方法

ほとんどの管理上の決定とアカウンティングは1秒を超える時間精度を必要としないため、1Cプラットフォームの開発者は、この値が日付形式の最大最小値になると決定しました。 したがって、プログラム内のイベントの時刻を表す各変数には、次のものが含まれている必要があります。

  • イベントが発生した年。
  • このイベントの月。
  • 日。

オプション:時、分、秒。 これらの3つのパラメーターが省略され、追加の条件がない場合、プログラムは自動的に時刻を1日の始まりに設定します。

世界に存在する日付形式には大きな違いがあります。

  1. ロシアでは、私たちは日を最初に置き、次にイベントの月、そして最後に年を置くことに慣れています。
  2. 米国の居住者は月から日付を開始します。
  3. チェコ人、ポーランド人、スロベニア人は、期間を「年-月-日」の形式で記述します。

これは、1Cプラットフォームが使用する最後の形式です。

日付に変換

いくつかの値または文字列から日付型のパラメーターを取得するには、図に示すコードを使用する必要があります。 1

上の図からわかるように、1行を使用して日付を判別できます。また、この行をコンマを使用して構成要素に分割すると、結果は変わりません。

日付の年には、イベントのミレニアムと世紀を含む4桁の数字、月、日、時間、秒が含まれている必要があり、先行ゼロを含めて2文字の長さである必要があることを理解することが重要です。

プログラムのカウントダウンは、0001年1月1日の始まりから始まります。 上記のコードの場合、この値は2つの方法のいずれかで決定できます(図2)。

米。 2

2行目では、イベントの時間、分、秒を省略しましたが、コードのパフォーマンスにはまったく影響しませんでした。

1Cリクエストで日付を使用する機能

1Cプラットフォームで使用されるほとんどのデータ型には、事前定義されたvoid値があります。 数値の場合、これは0です。リンクの場合、EmptyReference()値を定義できます。日付の場合、開始日を空の値と見なすのが通例です。対応する詳細を比較する必要があります。クエリパラメータを設定するときに入力します。

問題のタイプのフォーム属性の値に数字が示されていない場合、つまりウィンドウが次のようになっている場合でも(図3)、これは何も指定されていないことを意味するわけではないことを理解することが重要です。このパラメータと空の文字列との比較は機能しません。

米。 3

空の日付を受け取ったら、それをリクエストのパラメータとして指定できます。つまり、構造を使用できます(図4)。

ただし、空の日付をパラメータとして渡さずにリクエスト本文の内部を確認する方がよい場合があります。 これを行うには、リクエストコード(図5)に適切な条件を入力し、DateTimeリクエスト関数()を使用します。

米。 5

与えられたクエリテキストでは、年、月、日の先行ゼロを省略し、時間、分、秒も示していませんでした。プログラムは、彼らが言うように、この仮定を食べました。

日付と時刻の境界

クエリと日付の関係に関するもう1つの興味深い事実は、さまざまなデータベーステーブルを参照するときに「ポイントインタイム」の概念を使用することです。

プリミティブ日付タイプを説明するときに技術文書に示されている「最大1ミリ秒」の精度は、累積レジスタの仮想テーブルからレコードを選択するときに最も明確に示されます。累積レジスタに、ターンオーバーテーブルに加えて、テーブルRemainsおよびRemainsがある場合ターンオーバー、次にそれらの選択を特定の時間実行すると、異なる結果が得られる場合があります。

これが発生する方法と理由を理解するために、簡単な例を考えてみましょう。

  1. 販売文書が12時間31分36秒に実行される前は、砂糖の命名法による残高は30kgでした。
  2. 示された時間の文書は10kgで書き留められました。
  3. 残高テーブルに従って12時間31分36秒のドキュメントの日付の時点で生成されたレポートには、残りの30kgが表示されます。
  4. 残余と売上高を同時に表した同じレポートには、20kgの残余が表示されます。

この動作の理由とそれを回避する方法は何ですか?

問題は、Remainsテーブルで、期間がオープンセグメントとして設定されていることです。つまり、レポートの生成時に行われた移動が考慮されていません。つまり、指定された2番目の開始時に時間がかかります。パラメータ内。 同時に、TurnsテーブルとRemaining AND Turnoverテーブルでは、時間境界が考慮されます。つまり、指定された秒の終わりに時間がかかります。

この状況から抜け出す方法はいくつかあります。

  1. 残差テーブルを使用する場合は、指定した時点より1秒大きい時点を示します。
  2. 表Remainsand Turnoversのみを使用してください(パフォーマンスの観点から最適なオプションではありません)。
  3. ボーダーの概念を使用します。

最後のオプションは、図に示すコードで表すことができます。 6.6。

オブジェクトの最初のパラメーターでは、レポートを生成する必要がある日付を示し、2番目のパラメーターは境界線のタイプを決定します。 特定の日付の動きがサンプルに含まれていることが重要であるため、このパラメーターを「含む」位置に設定する必要があります。

1Cリクエストでは、日付を処理する必要があることがよくあります。 特に、定期的な情報を含むメタデータオブジェクトに対してクエリが作成されている場合。 原則として、これらはレジスター(情報、蓄積、計算、アカウンティング)です。 日付を操作するために1Cクエリ言語で最も頻繁に使用される関数について考えてみましょう。 情報台帳に基づいて例を作成します 従業員組織 ZUP構成リビジョン2.5。

  • 日付時刻

    年、月、日、時、分、秒を指定することにより、リクエストの日付(時間の有無にかかわらず)を取得できます。
    構文:
    日時(年、月、日、時、分、秒)
    通常、時、分、秒は指定されていません。 小さな例を挙げましょう。 クエリコンソールに次のテキストを入力します。

    日時の選択(2016、1、1)

    リクエストを実行した結果、日付が取得されます-2016年1月1日
    実際、このようにリクエストに日付が表示される状況を想像することは困難です。 結局のところ、期間を指定する必要がある場合は、パラメーターが使用されます。 ただし、この関数が特に価値のある場合があります。 これは、フィールドまたはクエリ条件で空の日付を指定する必要がある場合です。 1C言語の場合、空の日付は-0001.01.01のようになります。 したがって、リクエストで空の日付を取得するには、指定するだけで十分です 日時(1、1、1)..。 例として、情報レジスタから選択してみましょう 従業員組織記入されていないエントリ 完了期間:

    組織の従業員を選択します。期間、組織の従業員。従業員、組織の従業員。役職、組織の従業員。情報の登録から組織の細分化。組織の従業員として組織の従業員WHERE組織の従業員。

  • 期間の始まり

    指定された日付の期間の始まりを返します。
    構文:
    PERIOD START(Date、PeriodType)
    PeriodTypeは、次の値を取ることができます。 分、時間、日、週、月、四半期、年、10年、半年ごと
    クエリコンソールで、次のように入力します。

    期間の開始を選択(日時(2016、1、15)、月)

    リクエストは返されます-2016年1月1日
    次に例を示します。 ご存知のようにレジスターの周波数 従業員組織ある日。 レコードの有効期間の代わりに月の初めの日付が表示されるクエリを作成してみましょう。

    期間の始まり(組織の従業員。期間、月)を月の初めとして選択します。組織の従業員。従業員、組織の従業員。役職、組織の従業員。組織の下位区分。

  • 期間の終わり

    構文は、期間の開始時と同じです。 そして、その名前が示すように、日付と期間のタイプによって期間の終わりを返します。 詳細は検討しません。 小さな例に限定しましょう。
    問い合わせ:

    期間の終了を選択します(日時(2016、1、15)、月)

    2016年1月31日23:59:59を返します
    ご覧のとおり、値は正確に秒単位で返されます。

  • ADDDATE

    指定された数のタイムスロットを日付に追加します。
    構文:
    日付に追加(日付、PeriodType、カウント)
    PeriodTypeは関数と同じ値を受け入れます 期間の始まり
    例として2月の日付を取り上げましょう。

    日付に追加を選択(DATETIME(2016、2、15)、MONTH、2)

    2016年4月15日0:00:00の日付を取得します。2月は短い月ですが、受信した日付の日は元の日付と同じです。 月の日数を考える必要がないのでとても便利です。
    数値は負の値にすることができます。 次に、間隔は反対方向にカウントされます。

  • 違い

    指定された単位で2つの日付の差を計算します。
    構文:
    日付の違い(開始日、終了日、PeriodType)
    期間タイプは、次の値を取ることができます。 秒、分、時間、日、月、四半期、年
    例えば:

    日付の違いを選択(日付時刻(2016、2、15)、日付時刻(2016、3、1)、日)

    15を返します

ここでは、1Cクエリ言語で最も頻繁に使用される機能について検討しました。 残りはめったに使用されません。 必要に応じて、それらを使用する例は、1Cプラットフォームに組み込まれているヘルプにあります。

1C日付を使用する場合、日付部分の一般的な順序は、年、月、日、時、分、秒です。 この場合、時間、分、秒はスキップできます。

文字列から日付を作成する場合(「キャストから日付」)、ローカライズされた形式(day.month.year時間:分:秒)で指定できますが、完全に指定することはできません。

例えば:
// 1C日付の操作-日付をパーツか​​ら1Cに変換します-年、月、日(およびオプションの時間)
日付=日付(2012,10,30); // 時間がない
日付=日付(2012,10,30,12,00,00); //時間とともに

// 1C日付の操作-さまざまな方法で日付を文字列から1Cに変換します
日付=日付( "20121030"); // 年月日
日付=日付( "10/30/2012 12:00:00"); //ローカライズされた形式、完全な場合のみ

// 1C日付の操作-キャストせずに日付値を直接指定する
日付= "20121030"; // 時間がない
日付= "20121030120000"; //時間とともに

日付1Cの操作-空の日付1C

1Cの日付がいっぱいかどうかを確認するには、「空の日付」と比較します。 参考書/ドキュメントに日付タイプの属性がある場合、ユーザーがこのフィールドに入力していなければ、その値も「空の日付」になります。

「空の日付」は01.01.000100:00:00です。

例えば:
EmptyDate = "00010101000000";
RequiredDate = "00010101000000"の場合
レポート(「非常に必要な日付を入力しなかった」);
EndIf;

日付の操作1C-詳細の日付(参考書、ドキュメントなど)

属性のタイプを指定するときは、次の用途を指定できます。

  • 日付のみ(時刻は常に00:00:00)
  • 時間のみ(日付は常に01.01.0001)
  • 日時

日付を取得する

日付と時刻を取得するには、1C CurrentDate()関数を使用します。

非常に重要な場所は、この関数が呼び出される場所、つまりクライアントまたはサーバーです。 詳細については、トピック「パフォーマンスモード/パフォーマンス」を参照してください。 クライアントマシンでは時間がわずかに異なることがよくあるため、サーバーでサーバー時間を使用しようとします。サーバーで正しく設定されていなくても、少なくともすべてのクライアントで同じ間違った時間が発生します。

サーバーの日付(サーバーコンピューターのオペレーティングシステムで設定された日付)を取得するために、通常、プロパティで[サーバー]チェックボックスがオンになっている構成で共通モジュールが作成され、その中に関数が作成されます
//関数は、ServerFunctionsという名前の共通モジュールにあります
//共通モジュールのプロパティで、[サーバー]チェックボックスがオンになっていて、[クライアント]チェックボックスが設定されていない
関数GetServerDate()エクスポート
CurrentDate();を返します。
EndFunction

//別のモジュールから使用するためにこの関数を呼び出すと、次のようになります
DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

また、シンクライアントでは、モジュールの機能のすぐ隣に、実行される場所が示されます。

一日の始まりと終わり

日付「2012年10月30日」の場合:

  • その日の開始日は「2012/10/3000:00:00」のようになります
  • 終了日は「2012/10/3023:59:59」のようになります

これは、日、月、年などの期間のデータを必要とするレポートおよびクエリで使用されます。

たとえば、2012年1月1日00:00:00から2012年1月31日00:00:00までの期間は、月の1日が含まれていないため(ただし、最後の1秒が含まれているため)正しくありません。月の日)。

1C日付の操作-日付の比較

日付には日付と時刻が含まれます。 日付(時刻を除く)を比較する場合、通常は1日の始まり(月、年)になります。

例えば:
Date1 = Date( "10/30/2012 12:00:00");
StartDay(Date1)= StartDay(DocumentRef.Date)の場合
レポート(「ドキュメントは指定された日付までに入力されました」);
EndIf;

念のため、期間内の日付を比較する例:
DocumentRef.Date> = StartMonth(CurrentDate())および
DocumentRef.Date

日付の操作1C-日付の変更

日付は秒数です。 ある日付が別の日付よりも大きいかどうかだけでなく、どれだけ大きいかを知りたい場合は、秒単位で差を取得します。

例えば:
DayStart = CurrentDate()-DayStart(CurrentDate());
レポート(「1日の始まりが過ぎたので」+文字列(1日の始まりから)+「秒」);
レポート(「一日の始まりが過ぎたので」+文字列(一日の始まりから/ 60)+「分」);
レポート(「1日の始まりが過ぎたので」+文字列(1日の始まりから/ 60/60)+「時間」);

日付を変更することもできます。変更する場合は、秒数を加算または減算します。
StartThisDay = StartDay(CurrentDate());

BeginningPreviousDay = BeginningDay(BeginningThisDay-1); // 2番目を削除します-「昨日」を実行し、「昨日」から1日の始まりを取得します

StartPreviousDay = StartThisDay-24 * 60 * 60; //別の方法-24時間を引く-24(時間)* 60(分)* 60(秒)

日付1Cでの作業-時間の瞬間

ある時点は、ドキュメント(およびそれに応じて登録)に適用可能な拡張日付表現です。

書類の日時が同じ場合は、書類の時刻を比較する必要があります。 したがって、クエリでフィルタリングするときに使用できます。

ある瞬間は、次の方法でドキュメントから取得できます。
//メソッド1
DocumentMomentTime = DocumentRef.Timepoint();

ある時点を日付/時刻と比較することもできます。
Moment of TimeStatus = New Moment of Time(Start of Day(CurrentDate()));
If DocumentRef.MomentTime()。Compare(TimeTimeStandard)= -1 Then
レポート(「ドキュメントは本日より早く紹介されました」);
EndIf;
//ドキュメントが今日の日付の00:00:00までに入力された場合、とにかく入力されました-今日

日付の操作1C-日付の書式設定

この記事では、nullリンクを含め、チェックインする属性のタイプに応じてnull値をチェックする方法について説明します。

単に小道具がない場合は、NULL値が返されます。 この場合のタイプもNULLになります。 たとえば、左結合を介して2つのテーブルを結合しているとします。 左側のテーブルの右側のテーブルに値が見つからない場合、NULLが返されます。

この値のチェックは、構文「ISNULL」および「」を使用して実行できます。 最初のケースでは、TrueまたはFalseを返します。 2番目のケースでは、NULLが返された場合に、すぐに別の値を設定できます。

以下の1C8.3リクエストは、指定されたセグメントを持たないパートナーの連絡担当者のリストを返します。

選択する
ContactPartners.Link
から
Directory.Partnersの連絡担当者としてのPartnersの連絡担当者
INTERNAL JOINT Directory.SegmentsPartners AS SegmentsPartners
ソフトウェアパートナーの連絡先。所有者=パートナーセグメント。親
どこ
パートナーSegments.RefはNULLです

空の日付

空の日付の検証は、それをDATE TIME(1、1、1、0、0、0)構文と比較することによって実行されます。 使用例を以下に示します。

1Cリクエストの空のリンク

返された属性が参照型を持っている場合、たとえば、それが辞書やドキュメントなどの要素である場合、次の構造が使用されます:VALUE(Directory.ReferenceName.EmptyRef)。

以下の例では、クエリにより、ビジネスリージョンが指定されていないすべてのパートナーが選択されます。

「ValueFilled」を確認するには、反対の条件を実行する必要があります。

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

空の行

文字列タイプをチェックするために、別のパターンとの比較が行われます。 この場合 - ""。

以下のクエリでは、名前が空白のすべてのパートナーが選択されます。

ある時点で、「日付」タイプの変数を操作する必要があります。 この記事では、現在の日付を渡す、空の値、任意の日付をチェックするなどの基本的な手法について説明します。

クエリを作成するとき、データを現在の日付と比較する必要があることがよくあります。 組み込みの1C言語には、CurrentDate()関数があります。 それはあなたがあなたのコンピュータの現在の時間と日付を決定することを可能にします。 現在の日付で操作を実行するには、この関数の値をパラメーターとして要求に渡す必要があります。

以下は、作成日が現在までの経費報告書に添付されているすべてのファイルを選択するクエリです。

ExampleRequest =新しいリクエスト;
ExampleRequest.Text = "
|選択する
| Advance ReportAttached Files.Link
| FROM
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
|どこで
| 事前レポート添付ファイル。日付< &ТекДата»;
ExampleRequest.SetParameter( "CurrentDate"、CurrentDate());

カスタム日付

上記の機能を使用すると、任意の期間を比較して選択することができます。 このメソッドを使用すると、追加のパラメーターを使用せずに、クエリで厳密な選択を指定できます。

上記の例でこの関数を使用すると、入力パラメーターとして3つの数値(年、月、日)のみを渡したことに注意してください。 最後の3つ(時、分、秒)はオプションであり、存在しない場合は「0」、つまり1日の始まりに置き換えられます。

この例では、2016年末までに経費報告書に添付されたすべてのファイルを受け取ります。 この点について、「2016年12月31日23時59分59秒」の瞬間と比較するために、時、分、秒を表示します。

選択する
Advance ReportAttached Files.Link
から
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
どこ
事前レポート添付ファイル。日付< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

空の日付

簡単な比較で、変数に空の日付が含まれているかどうかを確認するのが最も簡単です。 この例では、クエリを使用して、銀行口座へのすべての入金を選択しますが、入金日は入力されていません。