• درخواست تاریخ خالی 1 ها را بررسی کنید. کار با مقادیر null در یک پرس و جو

    تمام اسنادی که در تنظیمات 1C وجود دارند و در نتیجه تقریباً همه رجیسترها باید حداقل یک ویژگی با نوع Date داشته باشند، به همین دلیل است که هر توسعه دهنده باید بداند و درک کند:

    • نحوه تبدیل پارامترهای انواع دیگر به نوع مورد نظر.
    • نحوه تعریف تاریخ خالی در پرس و جو 1C؛
    • تفاوت بین تاریخ و محدودیت زمانی چیست؟

    اینها سوالاتی است که سعی خواهیم کرد در مقاله خود به آنها پاسخ دهیم.

    تاریخ چیست و چگونه آن را تعیین کنیم

    از آنجایی که اکثر تصمیمات مدیریتی و حسابداری به دقت زمانی بیش از 1 ثانیه نیاز ندارند، توسعه دهندگان پلت فرم 1C تصمیم گرفتند که این مقدار حداقل در قالب تاریخ باشد. بنابراین، هر مشخصه ای که زمان یک رویداد را در برنامه توصیف می کند باید شامل موارد زیر باشد:

    • سالی که این رویداد رخ داد؛
    • ماه این رویداد؛
    • روز

    اختیاری: ساعت، دقیقه و ثانیه. اگر این سه پارامتر حذف شوند و شرایط اضافی وجود نداشته باشد، برنامه به طور خودکار زمان را روی ابتدای روز تنظیم می کند.

    فرمت‌های تاریخ موجود در دنیا با هم تفاوت چشمگیری دارند:

    1. در روسیه، ما عادت داریم که اول روز، سپس ماه رویداد و در پایان سال را قرار دهیم.
    2. ساکنان ایالات متحده تاریخ را با ماه شروع می کنند.
    3. چک ها، لهستانی ها و اسلوونیایی ها این دوره را در قالب "سال - ماه - روز" ثبت می کنند.

    این فرمت دومی است که پلتفرم 1C از آن استفاده می کند.

    تبدیل به تاریخ

    برای به دست آوردن پارامتری با نوع Date از چندین مقدار یا از یک رشته، باید از کد نشان داده شده در شکل استفاده کنید. 1

    همانطور که از شکل بالا مشخص است، هم به کمک یک خط می توانید تاریخ را تعیین کنید و هم با تقسیم این خط به اجزای آن با استفاده از کاما، نتیجه تغییر نمی کند.

    درک این نکته مهم است که سال تاریخ باید شامل چهار رقم باشد، از جمله هزاره و قرن رویداد، ماه، روز، ساعت و ثانیه باید دو نویسه شامل صفرهای ابتدایی باشد.

    شمارش معکوس در برنامه از ابتدای روز 1 ژانویه 0001 شروع می شود. برای کد بالا، این مقدار را می توان به یکی از دو روش تعیین کرد (شکل 2).

    برنج. 2

    در خط دوم، ساعت ها، دقیقه ها و ثانیه های رویداد را حذف کردیم که کمترین تأثیری روی عملکرد کد ما نداشت.

    ویژگی های استفاده از تاریخ در جستارهای 1C

    برای اکثر انواع داده های مورد استفاده توسط پلت فرم 1C، مقادیر خالی از پیش تعریف شده وجود دارد. برای اعداد، این 0 است، برای پیوندها، می توانید مقدار EmptyReference را تعریف کنید، برای یک تاریخ، تاریخ شروع شمارش معکوس یک مقدار خالی در نظر گرفته می شود، با آن است که جزئیات نوع مربوطه هنگام تنظیم پارامترهای پرس و جو باید مقایسه شود.

    درک این نکته مهم است که حتی اگر هیچ عددی در مقدار ویژگی فرم نوع مورد نظر مشخص نشده باشد، یعنی پنجره شبیه (شکل 3) باشد، این بدان معنا نیست که چیزی در آن مشخص نشده است، مقایسه این پارامتر با یک رشته خالی کار نخواهد کرد.

    برنج. 3

    با دریافت تاریخ خالی، می‌توانیم آن را به عنوان پارامتر درخواست خود تعیین کنیم، یعنی از ساختار استفاده کنیم (شکل 4)

    با این حال، مواقعی وجود دارد که بهتر است داخل بدنه درخواست را بدون عبور از تاریخ خالی به عنوان پارامتر بررسی کنید. برای این کار می توانید شرایط مناسب را در کد query وارد کنید (شکل 5) و از تابع query()DateTime استفاده کنید.

    برنج. 5

    در متن داده شده درخواست صفرهای ابتدایی سال و ماه و روز را حذف کردیم و همچنین ساعت و دقیقه و ثانیه را مشخص نکردیم و برنامه به قول خودشان این فرض را خورد.

    محدودیت تاریخ و زمان

    یکی دیگر از واقعیت های جالب در مورد رابطه بین پرس و جو و تاریخ، استفاده از مفهوم "نقطه در زمان" هنگام مراجعه به جداول مختلف پایگاه داده است.

    دقت "تا یک میلی ثانیه" که در مستندات فنی هنگام توصیف نوع اولیه Date مشخص شده است، هنگام انتخاب رکوردها از جداول مجازی ثبت تجمع به وضوح آشکار می شود: اگر ثبت تجمع، علاوه بر جدول گردش مالی، دارای جداول Remains و RemainsAnd Turnovers، سپس انتخاب روی آنها، که برای مدت معینی انجام می شود، ممکن است نتایج متفاوتی به همراه داشته باشد.

    برای درک اینکه چگونه و چرا این اتفاق می افتد، یک مثال ساده را در نظر بگیرید:

    1. قبل از اجرای سند فروش در ساعت 12 ساعت و 31 دقیقه و 36 ثانیه، موجودی بر اساس نامگذاری شکر 30 کیلوگرم بود.
    2. سند در زمان مشخص شده 10 کیلوگرم را حذف کرد.
    3. گزارش تولید شده در تاریخ سند در ساعت 12 ساعت 31 دقیقه و 36 ثانیه مطابق جدول باقیمانده، تعادل 30 کیلوگرم را نشان می دهد.
    4. همین گزارش روی جدول ترازها و گردش مالی به طور همزمان تعادل 20 کیلوگرمی را نشان خواهد داد.

    دلیل این رفتار چیست و چگونه از آن اجتناب کنیم؟

    مشکل این است که در جدول Remains، دوره به عنوان یک بخش باز تنظیم می شود، یعنی حرکات انجام شده در زمان ایجاد گزارش در نظر گرفته نمی شود، یعنی زمان در ابتدای آن گرفته می شود. دوم در پارامتر مشخص شده است. در عین حال، برای جدول گردش و برای جدول باقیمانده و گردش، محدودیت های زمانی در نظر گرفته می شود، یعنی زمان در پایان ثانیه مشخص شده گرفته می شود.

    چندین راه برای خروج از این وضعیت وجود دارد:

    1. هنگام استفاده از جدول Residuals، یک نقطه زمانی را 1 ثانیه بزرگتر از زمان مشخص شده مشخص کنید.
    2. فقط از جدول ترازها و گردش مالی استفاده کنید (بهینه ترین گزینه از نظر عملکرد نیست).
    3. از عبارت حاشیه استفاده کنید.

    گزینه دوم را می توان با کد نشان داده شده در شکل نشان داد. 6.

    در پارامتر اول شیء ما، تاریخ تولید گزارش را نشان می دهیم، پارامتر دوم نوع حاشیه را تعیین می کند. از آنجایی که برای ما مهم است که حرکات در یک تاریخ معین در انتخاب گنجانده شود، باید این پارامتر را در موقعیت "شامل" قرار دهیم.

    در حین کار با کوئری ها، هر برنامه نویسی باید با مقادیر خالی به روشی تعامل داشته باشد. منظور ما از مقدار خالی چیست؟

    یک مقدار خالی یا عدم وجود یک مقدار یا مقدار پیش فرض یک نوع داده است. در مورد انواع اولیه، همه چیز بسیار ساده است: مقدار پیش فرض مقداری اولیه است که به عنوان نقطه مرجع عمل می کند.

    انواع Nulls

    انواع مقادیر خالی را که ممکن است در یک پرس و جو با آنها مواجه شده یا مورد نیاز باشد، در نظر بگیرید.

    • برای نوع Number - مقدار خالی صفر - 0 است.
    • برای نوع String - یک رشته خالی - "".
    • برای نوع Date، اول ژانویه سال اول 01.01.0001 00:00:00 است. از این تاریخ است که زمان بر حسب 1 درجه سانتی گراد شمارش می شود.
    • برای نوع Boolean، مقدار پیش‌فرض از نظر فنی False است، اما به طور منطقی هر دو مقدار نوع پر می‌شوند. بنابراین، تصمیم گیری در مورد False بودن یا نبودن مقدار خالی بر اساس منطق یک الگوریتم خاص است.

    *مراقب باشید، خارج از 1C سیستم های تاریخ متفاوتی با نقاط مرجع متفاوت وجود دارد.

    مقدار گمشده کاملاً فقط با نوع آن مطابقت دارد خالی.این نوع فقط شامل یک مقدار است که نشان دهنده عدم وجود یک مقدار است.

    نوع مشابه تعریف نشدههمچنین حاوی تنها یک مقدار است، اما Undefined به معنای عدم وجود داده نیست، بلکه تنها به معنای عدم توانایی در تعیین مقدار پیش فرض برای نوع است. Undefined مقدار پیش فرض برای انواع ترکیبی است، از جمله آنهایی که به صراحت تعریف نشده اند. به عنوان مثال، یک مقدار در یک ردیف جدید در یک جدول مقدار در یک ستون که نوع آن به صراحت تعریف نشده است.

    بنابراین ارجاعانواع بسیار کمتر مبهم است. همه انواع مرجع یک مقدار خالی ارائه می کنند. یک مقدار خالی همان مرجع با یک نوع داده است، اما بدون یک شناسه منحصر به فرد برای یک مقدار خاص. به لطف این، ما می توانیم یک مرجع خالی را به عنوان یک مرجع عادی در نظر بگیریم و تمام روش های ارائه شده توسط پلتفرم را برای آن اعمال کنیم و با آن به عنوان یک مقدار کامل کار کنیم.

    کار با مقادیر null در یک پرس و جو

    چه بخواهید صریحاً یک مقدار null را در نتیجه پرس و جو وارد کنید یا مقادیر موجود را با آن مقایسه کنید، باید بدانید که چگونه مقادیر null را در یک پرس و جو توصیف کنید.

    انواع عدد، رشته، بولیدر درخواست به صورت زبان داخلی توضیح داده شده است:

    0 AS ExampleTypeNumber، "Hello world" AS ExampleTypeString، True AS ExampleTypeBoolean

    تعریف نشده، که اساساً یک نوع اولیه است، به طور مشابه توصیف می شود:

    Lots.Period را از Accumulation Register انتخاب کنید.Lots As Lots Where Remains.BatchDocument = Undefined

    تعریف مقادیر مرجع خالی کمی دشوارتر است. همه اشیاء مرجع دارای یک مقدار سرویس از پیش تعریف شده EmptyReference هستند. به لطف این، می توان یک پیوند خالی را به یک روش انتخاب کرد - از طریق تابع Value:

    مقدار را انتخاب کنید(Reference.Nomenclature.EmptyReference) As Empty Nomenclature

    امکانات کار با مقادیر Null تا حدودی غنی تر است. مانند سایر انواع ابتدایی، Null به همان روشی که در زبان داخلی توضیح داده شده است. علاوه بر این، عملگر ویژه Is Null و تابع Is Null ارائه شده است.

    • عملگر Is Null به شما امکان می دهد یک عبارت Boolean ایجاد کنید که مقدار انتخاب شده را با مقدار Null مقایسه می کند.
    • اگر تابع IsNull آرگومان اول Null نباشد و آرگومان دوم را در غیر این صورت برمی گرداند.

    عباراتی که null ها را تعریف می کنند را می توان در هر بخش پرس و جو که عبارات را پشتیبانی می کند استفاده کرد. به عنوان مثال، می توانید یک لینک null به بخش Select یا یک تست Null به Condition اضافه کنید.

    نمونه های عملی

    با استفاده از تابع Value

    Goods.Reference را به عنوان نامگذاری انتخاب کنید، Goods.Reference = Value(Catalog.Nomenclature.EmptyReference) مانند اینReferenceEmpty From wGoods As wGoods

    استفاده از عملگر Is Null

    Goods.Link را به عنوان نامگذاری انتخاب کنید، Goods.Link مانند ThisLinkEmpty خالی است

    نال در سمت چپ یا پیوستن کامل

    بررسی پوچ

    مثال یک موقعیت عملی مکرر را نشان می‌دهد که با پیوستن چپ، برای جدول اول هیچ تطابقی در جدول دوم وجود ندارد. در این صورت تمام فیلدهای جدول دوم برابر با Null خواهند بود.

    WProducts.Reference را به‌عنوان نام‌گذاری، Remains.QuantityRemainder را به‌عنوان Quantity، Remains.QuantityRemainder را به‌عنوان NoRemainder از WProducts به‌عنوان WProducts، تهی انتخاب کنید. چپ پیوستن Accumulation Register.GoodsIn Warehouses.Remainders As Balance By TueGoods.Reference = Remains.Nomenclature

    مدیریت مقادیر پوچ

    اصلاح پرس و جو قبلی برای نشان دادن یک تکنیک رایج برای بدست آوردن برخی مقادیر پیش فرض به جای مقادیر گمشده. در این مثال، با استفاده از تابع IsNull، مقدار باقیمانده از دست رفته با 0 از نظر منطقی صحیح جایگزین می شود.

    TueProducts.Reference را به عنوان نامگذاری، IsNull(Remains.QuantityRemainder، 0) را به عنوان مقدار از TueProducts به عنوان WProducts انتخاب کنید چپ پیوستن Accumulation Register.GoodsIn Warehouses.Remainders As Balance By TueGoods.Reference = Remains.Nomenclature

    در این مقاله انواع مقادیر خالی و خواص آنها را بررسی کردیم، نحوه تعریف انواع مقادیر خالی در پرس و جوها را بررسی کردیم و در بخش عملی، به سهولت استفاده از مطالب در نظر گرفته شده متقاعد شدیم. .

    این مقاله روش‌هایی را برای بررسی مقدار خالی، بسته به نوع مشخصه مورد بررسی، از جمله مرجع تهی، مورد بحث قرار می‌دهد.

    مقدار NULL زمانی برمی گردد که ویژگی به سادگی وجود نداشته باشد. نوع در این حالت نیز NULL خواهد بود. به عنوان مثال، شما در حال پیوستن به دو جدول از طریق یک اتصال چپ هستید. در صورتی که هیچ مقداری برای جدول سمت چپ در سمت راست یافت نشد، NULL برگردانده می شود.

    بررسی این مقدار را می توان با استفاده از ساختار "IS NULL" و "" انجام داد. در حالت اول True یا False برگردانده می شود. در حالت دوم، شما می توانید بلافاصله مقدار دیگری را در حالتی که NULL برگردانده می شود تنظیم کنید.

    پرس و جو 1C 8.3 زیر لیستی از افراد تماس را برای آن دسته از شرکا که مجموعه ای از بخش ندارند، برمی گرداند.

    انتخاب کنید
    ContactPartners.Link
    از جانب
    Directory.Contact Persons of Partners AS Contact Persons of Partners
    پیوستن داخلی
    PO ContactPartners.Owner = SegmentsPartners.Parent
    جایی که
    SegmentsPartners.Reference NULL است

    تاریخ خالی

    مقدار با مقایسه آن با ساختار DATETIME(1، 1، 1، 0، 0، 0) برای یک تاریخ خالی بررسی می شود. یک مثال استفاده در زیر آورده شده است:

    لینک خالی در درخواست 1C

    در مواردی که مشخصه برگردانده شده دارای یک نوع مرجع باشد، به عنوان مثال، عنصری از دایرکتوری، سند و غیره باشد، ساختار زیر استفاده می شود: VALUE(Catalog.CatalogName.EmptyReference).

    در مثال زیر، پرس و جو همه شرکای را انتخاب می کند که منطقه تجاری مشخصی ندارند.

    برای بررسی "ValueFilled" باید شرایط مخالف را انجام دهید:

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

    خط خالی

    برای بررسی انواع رشته ها، مقایسه ای با الگوی دیگری انجام می شود. در این مورد - "".

    پرس و جو زیر همه شرکا را با نام خالی انتخاب می کند.

    هنگام کار با تاریخ های 1C، ترتیب معمول قطعات تاریخ سال، ماه، روز، ساعت، دقیقه، ثانیه است. در این حالت می توان ساعت ها، دقیقه ها، ثانیه ها را نادیده گرفت.

    هنگام ایجاد یک تاریخ از یک رشته ("cast to date")، می توانید در قالب محلی (day.month.year ساعت: دقیقه: ثانیه)، اما فقط به طور کامل مشخص کنید.

    مثلا:
    // کار با تاریخ های 1C - تبدیل تاریخ به 1C از قسمت ها - سال، ماه، روز (به علاوه زمان اختیاری)
    تاریخ = تاریخ (2012,10,30); //زمان نیست
    تاریخ = تاریخ (2012,10,30,12,00,00); //با زمان

    //کار با تاریخ های 1C - تبدیل تاریخ به 1C از رشته ای به روش های مختلف
    تاریخ = تاریخ ("20121030"); //سال ماه روز
    Date = Date("10/30/2012 12:00:00 PM"); //قالب محلی، فقط کامل

    //کار با تاریخ های 1C - تعیین مقدار تاریخ بدون ریخته گری، به طور مستقیم
    تاریخ = "20121030"; //زمان نیست
    تاریخ = "20121030120000"; //با زمان

    کار با تاریخ 1C - تاریخ خالی 1C

    برای بررسی تاریخ 1C برای پر بودن، آن را با "تاریخ خالی" مقایسه می کنیم. اگر مشخصه ای با نوع تاریخ در فهرست/سند وجود داشته باشد، اگر کاربر این فیلد را پر نکرده باشد، مقدار آن نیز "تاریخ خالی" خواهد بود.

    "تاریخ خالی" 01.01.0001 00:00:00 است.

    مثلا:
    EmptyDate = "00010101000000";
    اگر DesiredDate = "00010101000000" سپس
    alert ("شما تاریخ لازم را پر نکردید");
    EndIf

    کار با تاریخ 1C - تاریخ با جزئیات (دایرکتوری ها، اسناد و غیره)

    هنگام تعیین نوع مشخصه، می توانید استفاده کنید:

    • فقط تاریخ (ساعت همیشه 00:00:00 است)
    • فقط زمان (تاریخ همیشه 01.01.0001 است)
    • تاریخ و زمان

    گرفتن تاریخ

    برای دریافت تاریخ و زمان، از تابع 1C CurrentDate () استفاده می شود.

    مکانی که این تابع فراخوانی می شود بسیار مهم است - روی مشتری یا سرور. برای جزئیات به مبحث "حالت زمان اجرا/زمان اجرا" مراجعه کنید. اغلب اتفاق می افتد که زمان در ماشین های کلاینت کمی متفاوت است، بنابراین آنها سعی می کنند از زمان سرور در همه جا استفاده کنند - حتی اگر به درستی روی سرور تنظیم نشده باشد، حداقل همه کلاینت ها زمان اشتباه یکسانی خواهند داشت.

    برای به دست آوردن تاریخ سرور (تاریخ تنظیم شده در سیستم عامل رایانه سرور)، معمولاً یک ماژول مشترک در پیکربندی ایجاد می شود که چک باکس "Server" در ویژگی ها علامت زده می شود و یک تابع در آن ایجاد می شود.
    //function در یک ماژول معمولی قرار دارد، به عنوان مثال به نام ServerFunctions
    // در ویژگی های ماژول عمومی، چک باکس "Server" تنظیم شده است و چک باکس "Client" تنظیم نشده است.
    تابع GetServerDate() Export
    بازگشت CurrentDate();
    EndFunctions

    // فراخوانی این تابع برای استفاده از یک ماژول دیگر به این صورت است
    DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

    همچنین، در تین کلاینت، مستقیماً در کنار توابع ماژول، محل اجرای آن مشخص شده است:

    شروع و پایان روز

    برای تاریخ "30.10.2012":

    • تاریخ شروع روز مانند این است "10/30/2012 00:00:00"
    • تاریخ پایان روز مانند این است "10/30/2012 23:59:59"

    در گزارش ها و پرس و جوهایی که به داده هایی برای یک دوره - روز، ماه، سال نیاز دارند، استفاده می شود.

    به عنوان مثال، دوره از "01/01/2012 00:00:00" تا "01/31/2012 00:00:00" نادرست است زیرا شامل یک روز از ماه نمی شود (اما شامل یک ثانیه از ماه می شود. آخرین روز ماه).

    کار با تاریخ 1C - مقایسه تاریخ

    تاریخ حاوی تاریخ و زمان است. هنگام مقایسه تاریخ ها (بدون در نظر گرفتن زمان)، آنها معمولاً به ابتدای روز (ماه، سال) آورده می شوند.

    مثلا:
    Date1 = Date("10/30/2012 12:00:00 PM");
    اگر StartDay(Date1) = StartDay(DocumentRef.Date) سپس
    نمایش ("سند وارد شده در تاریخ معین")؛
    EndIf

    فقط در مورد، نمونه ای از مقایسه تاریخ ها در یک دوره:
    اگر DocumentReference.Date >= MonthStart(CurrentDate()) و
    DocumentReference.Date

    کار با تاریخ 1C - تغییر تاریخ

    تاریخ تعداد ثانیه است. اگر بخواهیم نه تنها بفهمیم که آیا یک تاریخ از دیگری بزرگتر است، بلکه چقدر بیشتر است، آنگاه تفاوت را در ثانیه دریافت می کنیم.

    مثلا:
    StartDay = CurrentDate() – StartDay(CurrentDate());
    گزارش ("از ابتدای روز گذشته است" + رشته (FROMDayStart) + "ثانیه");
    گزارش ("از ابتدای روز گذشته است" + رشته (از ابتدای روز / 60) + "دقیقه");
    گزارش ("از ابتدای روز گذشته است" + رشته (از ابتدای روز / 60/60) + "ساعت");

    ما همچنین می توانیم تاریخ را تغییر دهیم، هنگام تغییر تعداد ثانیه ها را اضافه یا کم می کنیم:
    StartThisDay = StartDay(CurrentDate());

    StartPreviousDay = StartDay(StartThisDay - 1); // دوم را حذف کنید - انجام "دیروز" و شروع روز را از "دیروز" بگیرید

    StartPreviousDay = StartThisDay - 24*60*60; //روی دیگری - تفریق 24 ساعت - 24 (ساعت) * 60 (دقیقه مشخص شد) * 60 (ثانیه)

    کار با تاریخ 1C - لحظه از زمان

    یک نقطه در زمان یک نمایش گسترده از یک تاریخ قابل اعمال برای اسناد (و بنابراین ثبت نام) است.

    در صورت یکی بودن تاریخ و ساعت مدارک، مقایسه زمان اسناد الزامی است. بر این اساس، می توان از آن برای انتخاب در پرس و جو استفاده کرد.

    شما می توانید یک نقطه در زمان را از یک سند به روش های زیر دریافت کنید:
    //روش 1
    DocumentTimeMoment = DocumentReference.MomentTime();

    همچنین می‌توانید یک نقطه زمانی را با تاریخ/زمان مقایسه کنید:
    MomentInTimeReference = New MomentInTime(StartDay(CurrentDate()));
    اگر DocumentReference.TimeIn().Compare(InTimeReference) = -1 سپس
    نمایش ("سند زودتر از امروز وارد شده است");
    EndIf
    //اگر سند با تاریخ امروز ساعت 00:00:00 وارد شده باشد، به هر حال وارد می شود - امروز

    کار با تاریخ 1C - قالب بندی تاریخ ها