این مقاله برای خوانندگانی که با زبان SQL آشنا هستند در نظر گرفته شده است.

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

در زیر جدول مکاتبات بین عملگرهای اصلی زبان جستجو و SQL آورده شده است:

عملگرهای زبان پرس و جو 1C

دستور SQL

مختلف

ترکیب

بارگذاری توسط

ترکیب کنید

مرتب سازی بر اساس

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

اجرای درخواست 1C از کد برنامه با استفاده از شی زبان تعبیه شده "درخواست" انجام می شود. نمونه ای از نوشتن درخواست پایگاه داده با استفاده از زبان برنامه نویسی تعبیه شده:

درخواست \u003d درخواست جدید؛ Request.Text \u003d "SELECT | Synonym.Link AS Link | FROM | Directory.Reference1 AS مترادف"؛ Selection \u003d Query.Run (). Select ()؛ while Selection.Next () چرخه // درج انتخاب پردازش SelectionDetailedRecords پایان چرخه ؛

روش "Run" درخواست را اجرا می کند ، روش "Select" مقداری از نوع "FetchFromQueryResult" را برمی گرداند. همچنین می توانید از روش Unload استفاده کنید ، که جدول مقادیر را برمی گرداند.

پارامترهای پرس و جو در ویژگی "Parameters" ذخیره می شوند (در این حالت ، این یک ساختار است ، بنابراین تمام روش های ساختار در اینجا قابل اجرا هستند - درج ، حذف و غیره).

مثالی از تنظیم پارامتر "Request.Parameters.Insert" ("Reference"، ReferenceLink). می توانید از طریق ampersand "& Reference" به پارامترهای موجود در درخواست مراجعه کنید. در زیر نمونه ای از درخواست با استفاده از پارامترها آورده شده است:

درخواست \u003d درخواست جدید؛ Request.Text \u003d "SELECT | Users.Link AS Link، | Users.Parent AS Parent، | Users.Name AS Name | از FROM | Directory.Users AS Users | WHERE | Users.Link \u003d & Directory"؛ Request.Parameters.Insert ("Directory"، DirectoryLink)؛ Selection \u003d Query.Run (). Select ()؛ while Selection.Next () چرخه // درج انتخاب پردازش SelectionDetailedRecords پایان چرخه ؛

به یاد بیاورید که زبان پرس و جو فقط برای خواندن داده ها از یک پایگاه داده در نظر گرفته شده است و بنابراین فاقد آنالوگ برای عبارات SQL مانند INS ERT و UPDATE است. داده ها فقط از طریق مدل شی object زبان برنامه نویسی تعبیه شده 1C قابل اصلاح هستند. همچنین در زبان پرس و جو 1C عملگرهایی وجود دارند که هیچ مشابهی در SQL ندارند ، به عنوان مثال:

  • در سلسله مراتب
  • قرار دادن
  • INDEX توسط

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

Goods.Link، Goods.Artik را از فهرست انتخاب کنید. کالاها به عنوان کالاهایی که Goods.Link در HIERARCHY (و مرکبات) "

در این حالت ، نتیجه بدون در نظر گرفتن سطح سطح سلسله مراتب ، کلیه عناصر تابعه فهرست نامگذاری مرکبات را برمی گرداند.

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

دبیرخانه

| _ خودکارهای آبنما | _ خودکار قرمز | _ خودکار آبی | _ خودکارهای جوهر | _ حاکمان

اتصالات

| _ دستگیره درب | _ دستگیره درب ساده | _ دستگیره درب لوکس

ما درخواست زیر را می نویسیم:

SELECT Products.Link، Products.Articul از دایرکتوری. محصولات به عنوان محصولاتی که در آن محصولات وجود دارد. نام آنها "Pen٪" و Products.Link IN HIERARCHY (& Office) "

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

قرار دادن - این عبارت نتیجه را در یک جدول موقتی قرار می دهد. درخواست مثال:

کاربران را انتخاب کنید. پیوند به عنوان لینک ، کاربران. والدین به عنوان والدین ، \u200b\u200bکاربران. نام AS نام POST کاربران انتخاب شده از فهرست SELECT SelectedUsers. پیوند AS Link ، SelectedUsers.Parent AS Parent ، SelectedUsers. نام AS نام از کاربران انتخاب شده AS SelectedUsers

این پرس و جو SQL توسط چندین درخواست اجرا می شود:

  • ایجاد یک جدول موقت (سیستم عامل قادر به استفاده مجدد از جدولهای موقتی است که قبلاً ایجاد شده است ، بنابراین ایجاد همیشه اتفاق نمی افتد) ؛
  • قرار دادن داده ها در یک جدول موقت ؛
  • اجرای پرس و جو اصلی ، یعنی SEL ECT از این جدول موقت ؛
  • تخریب / پاکسازی جدول موقت.

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

شی "Query" از زبان برنامه نویسی تعبیه شده دارای ویژگی "Tem დრო: TableManager" است که برای کار با جداول موقت در نظر گرفته شده است. کد نمونه:

MVT \u003d مدیر جداول موقت جدید ()؛ درخواست \u003d درخواست جدید؛ درخواست. مدیر جدول های موقت \u003d MVT؛

پس از اجرای پرس و جو ، MBT می تواند برای بار دوم در کوئری دیگر مورد استفاده قرار گیرد که بدون شک مزیت دیگر استفاده از جداول موقتی است. در این حالت ، با فراخوانی روش "بستن" ، جدول موقت از پایگاه داده حذف خواهد شد ...

MVT. بستن ()؛

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

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

مشاوره تخصصی رایگان

از درخواست شما متشکریم!

یک متخصص 1C ظرف مدت 15 دقیقه با شما تماس می گیرد.

ویژگی های برخی از عملگرهای زبان پرس و جو

برای تغییر - این عملگر برای قفل کردن یک جدول درخواست خاص (یا تمام جداول شرکت کننده در پرس و جو) در نظر گرفته شده است. قفل گذاری با قرار دادن قفل U روی میز انجام می شود. در SQL ، این از طریق hint UPDLOCK پیاده سازی می شود. این طرح برای جلوگیری از بن بست ضروری است. نمونه ای از درخواست با ساخت و ساز برای تغییر:

کاربران را انتخاب کنید. پیوند به عنوان پیوند ، کاربران. والدین به عنوان والدین ، \u200b\u200bکاربران. نام AS نام از فهرست

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



ترکیب - این درخواست از اتصالات پشتیبانی می کند چپ / راست ، کامل ، داخلی ،که مربوط به پیوستن به SQL است - LEFT / RIGHT JOIN، OUTER JOIN، INNER JOIN.

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

از نظر نحوی ، اتصال به این شکل است:

انتخاب جدول 1

در زبان جستجوی 1C ، هیچ عملیاتی برای پیوستن به یک محصول دکارتی (CROSS JOIN) وجود ندارد. با این حال ، عدم وجود یک اپراتور به این معنی نیست که زبان جستجو از چنین ارتباطی پشتیبانی نمی کند. در صورت لزوم ، می توانید از این طریق به جداول بپیوندید:

جدول 1 را انتخاب کنید. لینک Ref به عنوان منبع از مرجع. Ref 1 به عنوان جدول 1 به مرجع چپ بپیوندید. Ref2 به عنوان جدول 2 واقعی

همانطور که از مثال مشاهده می کنید ، کلید اتصال تنظیم شده است درست است، واقعییعنی هر ردیف در یک جدول با ردیفی در جدول دیگر مطابقت دارد. اگر در هر دو جدول ردیف داشته باشید ، نوع پیوستن (LEFT ، RIGHT ، FULL ، INNER) مهم نیست ، اما اگر در هر دو جدول ردیفی نباشد (رها کردن جدول) ، نتیجه متفاوت خواهد بود. به عنوان مثال ، هنگام استفاده درونی؛ داخلی نتیجه اتصال خالی خواهد بود. استفاده كردن چپ راست نتیجه پیوستن یا عدم داده خواهد بود ، بسته به اینکه به کدام جدول می پیوندیم - با داده یا نه. استفاده كردن پر شده اتصال داده ها همیشه خواهد بود (البته فقط یک جدول ، از آنجا که در جدول دیگر خلا وجود دارد) ، انتخاب نوع اتصال به مشکل برنامه خاص بستگی دارد.

کمی سرنخ بصری از نحوه کار انواع مختلف اتصالات:



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

  • ٪ (درصد): توالی حاوی هر تعداد نویسه دلخواه.
  • _ (زیرخط): یک شخصیت دلخواه ؛
  • / - شخصیت بعدی باید به عنوان یک شخصیت منظم تفسیر شود.

نتایج روشنمعادل آن در SQL عملگر ROLLUP است. نمونه ای از استفاده از عملگر نتایج:

محصولات را انتخاب کنید. قیمت AS قیمت ، محصولات. محصول AS محصول از دایرکتوری. نام کالاها به طور متوسط \u200b\u200b(قیمت) بر اساس محصول

نتیجه این خواهد بود:

بستر

9833,333

اهن

یک خودکار

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

کار با درخواستهای دسته ای

1C به شما امکان می دهد با بسته های درخواست کار کنید. در یک درخواست دسته ای ، متون پرس و جو با یک علامت ویرگول (؛) از هم جدا می شوند. درخواست دسته ای 1C به ترتیب انجام می شود. نمونه متن درخواست دسته ای:

کاربران را انتخاب کنید. پیوند به عنوان پیوند ، کاربران. والدین به عنوان والدین ، \u200b\u200bکاربران. نام AS نام از دایرکتوری. کاربران به عنوان کاربران.
SELECT Work Schedule. User AS User، Schedule Work. Date AS Date، Schedule Work. ساعات کار AS ساعت کار از ثبت نام اطلاعات. برنامه کار AS جدول کار

برای به دست آوردن نتیجه تمام درخواستهای موجود در بسته ، باید به جای Execute از روش ExecuteBatch از شی درخواست استفاده کنید. این روش همه درخواست ها را به ترتیب اجرا می کند. نتیجه پرس و جو ، آرایه ای از نتایج برای هر پرس و جو از بسته است و توالی آرایه همان توالی درخواست ها در متن بسته است.

با توجه به زبان پرس و جو ، ذکر چنین قابلیتی به عنوان جداول مجازی قابل ذکر است. هیچ جدول مجازی در پایگاه داده وجود ندارد ، این نوعی بسته بندی است که در سمت DBMS به عنوان یک پرس و جو با استفاده از subquery اجرا می شود. نمونه ای از پرس و جو 1C با استفاده از جداول مجازی:

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

چنین پرسشی برای DBMS به صورت زیر خواهد بود:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef، CAST (SUM (T2._Fld25936) به صورت عددی (38، 8)) AS Fld25936Turnover_، CAST (SUM (T2._Fld25937) AS NUM9) D ._AccumRgTn25938 T2 WH ERE ((T2._Fld949 \u003d @ P1)) و ((T2._Fld25936 @ P2 یا T2._Fld25937 @ P3)) گروه T2_Fld25931Ref SUMF25 (CAST36) به تعداد (38 ، 8))) 0.0) یا (CAST (SUM (T2._Fld25937) به صورت عددی (38 ، 8))) 0.0) T1 \u003e\u003e\u003e\u003e

مشاهده می شود که به نظر نمی رسد SQL باشد ، زیرا یک زیر گروه ، گروه بندی وجود دارد. جداول مجازی ، به طور کلی ، "قند نحوی" هستند ، به طور کلی ، برای سهولت در توسعه س quالات ایجاد می شوند ، به طوری که سeriesالات فشرده تر و خواناتر هستند.

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



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



در متن درخواست ، به این شکل است:

ثبت تجمع. ثبت تعهدات. چرخش (، عملیات \u003d & عملیات) ثبت نام تعهدات

برای راحتی ، نوشتن نمایش داده شد ، یعنی ایجاد متون پرس و جو ، در 1C سازنده ای وجود دارد که می تواند از طریق منوی زمینه فراخوانی شود (کلیک راست):



در Query Designer می توانید لیست کاملی از عملکردها و عملگرهای پشتیبانی شده از زبان query را مشاهده کنید.


Query Builder ابزاری بصری بسیار انعطاف پذیر برای ایجاد نمایش داده های با هر پیچیدگی است. فقط در حالت پیکربندی در دسترس است. در حالت Enterprise به اصطلاح "Query Console" وجود دارد - این پردازش خارجی است که در دیسک ITS ارائه می شود. برای یک برنامه مدیریت شده ، کنسول پرس و جو را می توان از its.1c.ru بارگیری کرد.

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

دلایل عملکرد زیر بهینه پرس و جو

در زیر لیستی از دلایل اصلی (اما نه همه) که منجر به کندتر شدن اجرای درخواست می شوند ، آورده شده است.

  • استفاده از پیوندها با زیرمجموعه ها

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

  • استفاده از جداول مجازی در query join ها

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

  • استفاده از شرایط در پرس و جو که با نمایه های موجود مطابقت ندارد

اگر در شرایط پرس و جو باشد (در اپراتور جایی که یا در شرایط یک جدول مجازی) از فیلدهایی که همه در فهرست موجود نیستند استفاده می شود ، این پرس و جو با استفاده از اسکن جدول سازه SQL یا اسکن فهرست (به طور کامل یا جزئی) اجرا می شود. این نه تنها بر زمان اجرای پرس و جو تأثیر می گذارد ، بلکه قفل های بیش از حد S نیز به ردیف های اضافی تحمیل می شود که به نوبه خود می تواند منجر به تشدید قفل شود ، یعنی کل جدول قفل می شود.

  • استفاده از OR در شرایط پرس و جو

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

  • دریافت داده ها از طریق نقطه برای فیلدهای از نوع پیچیده

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

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

در واقع در یک پرسش دسته ای ، می توانید چندین پرس و جو را توصیف کنید ، هر دو مربوط به یکدیگر با استفاده از جداول موقتی هستند ، و غیر مرتبط (امکان پذیر است ، اما دلیل آن مشخص نیست؟). در نتیجه ، شما می توانید همه درخواست ها را به صورت پی در پی اجرا کنید و در نتیجه یا یک آرایه با نتایج هر درخواست یا نتیجه آخرین را بپذیرید. برای بدست آوردن آرایه ای با نتایج جستجو ، از روش استفاده کنید RunPackage () درخواست شی ، و برای گرفتن نتیجه از آخرین درخواست ExecuteRequest ().

در متن درخواست ، درخواست های بسته با ""؛ (نقطه ویرگول) یک پرس و جو دسته ای دارای یک فضای نام جدول مجازی است. استفاده از مدیر جدول موقت لازم نیست ، اما اگر بخواهید جداول موقتی را از یک پرسش دسته ای به پرسش دیگر انتقال دهید ، این امکان وجود دارد.
روش پردازش ارسال کد 1C v 8.x (امتناع ، حالت ارسال)

درخواست \u003d درخواست جدید؛
Request.Text \u003d "
| انتخاب کنید
| نام ، SUM (مقدار) به عنوان مقدار
| پزشک
| از
| در کجا
| پیوند \u003d & پیوند
| بارگذاری توسط نام
|;
| متنوع را انتخاب کنید
| نامگذاری
| لیست موارد POST
| از
| سند. درآمد. محصولات
| در کجا
| پیوند \u003d & پیوند
|;
| انتخاب کنید
| Doc. نامگذاری ،
| Doc.Quantity AS Doc_Quantity ،
| NULL است (Reg.Amount باقیمانده ، 0) به عنوان Reg_Number
| از
| DOCTCH AS Doc
| چپ مشترک
| ثبت انباشت تعادل کالاها باقی مانده (،
| نامگذاری B (انتخاب متنوع)
| نامگذاری
| از
| لیست موارد AS لیست موارد)) AS Reg
| توسط
| Doc.Nomenclature \u003d Reg.Nomenclature "؛

while Sampling. حلقه بعدی ()
// باقیمانده های منفی را بررسی کنید
// انگشت خود را از طریق ثبت کنید
پایان چرخه ؛
پایان رویه

در حقیقت ، من تعریف شی object پرس و جو و استفاده از یک مدیر جدول موقتی را حذف کردم ، متن های پرس و جو را ترکیب کردم (به جدا کننده "؛" بین متن توجه کنید). در نتیجه ، متن پرس و جو بیشتر خوانا شده است (و خوانایی پرس و جو در هنگام استفاده از طراح پرس و جو بسیار بهبود می یابد).

پس از اجرای درخواست از متغیر آرایه نتایج ما 3 عنصر خواهیم داشت. دو مورد اول حاوی یک عدد است که تعداد رکوردها را در جداول موقت DOC و لیست کالاها قرار می دهد ، و مورد سوم شامل انتخابی با نام های Nomenclature ، Doc_Number و Reg_Number است.

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

خوب ، این برای درخواستهای دسته ای است. مکانیسم بسیار مناسبی هم از نظر نوشتن نمایش داده ها و هم از نظر خواندن پرسش های پیچیده.

اطلاعات گرفته شده از سایت

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

  • درخواست های دسته ای چیست و برای چه مواردی است؟
  • چگونه می توانم یک بسته پرس و جو با استفاده از طراح Query ایجاد کنم؟
  • چگونه می توان آرایه ای از نتایج را برای هر پرسش از یک دسته بازگرداند؟

قابل اجرا بودن

مطالب مربوط به نسخه های فعلی پلت فرم 1C: Enterprise ، نسخه 8.3 است

هدف از دسته درخواست

این پلتفرم به شما امکان می دهد با درخواست های دسته ای کار کنید. ما این فرصت را داریم که چندین درخواست را "همزمان" اجرا کنیم. در یک درخواست دسته ای ، متن های درخواست با "؛" از هم جدا می شوند. (نقطه ویرگول)

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

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

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

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

یک جدول موقتی می تواند مفید باشد درصورتی که شما نیاز دارید چندین بار از داده های مشابه در یک پرسش بزرگ مانند پیوستن یا پیوستن به جداول دیگر استفاده کنید. هنگام استفاده از نمایشگرهای تو در تو ، چنین داده هایی باید چندین بار با استفاده از همان پرسش های تو در تو بدست آیند ، که مطمئناً هم بر خوانایی متن و هم بر عملکرد تأثیر خواهد گذاشت.

با استفاده از طراح یک بسته پرس و جو بسازید

درخواستهای جداگانه موجود در بسته توسط "؛" در متن جدا شده است. (نقطه ویرگول) برای جلوگیری از تقسیم دستی متن درخواست ، می توانید از Query Designer برای این کار استفاده کنید.
سازنده پرس و جو دارای یک برگه جداگانه برای بسته های درخواست است. درخواست ها را می توان با استفاده از دکمه مربوطه در نوار فرمان به بسته اضافه کرد و همچنین به بالا یا پایین برد.

نمایش تصویری س individualالات جداگانه - برگه های سمت راست طراح ، که می توانید با آنها به ویرایش متن یک س individualال شخصی بروید. در این برگه ها ، نام برای جداول موقت ، برای درخواست انتخاب داده - "درخواست دسته 2" و غیره ، برای تخریب نمایش داده می شود - "- NameBT".

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

درخواست بسته

اگر شی درخواستبا اجرای درخواست دسته ای ، مدیر جدول موقت نصب شده است ، جداول موقت که در درخواست دسته ای تخریب نشده اند ، در مدیر نصب شده ذخیره می شوند.

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

علاوه بر روش اجرا کردن ()که به طور متوالی تمام درخواستهای بسته را اجرا می کند و نتیجه آخرین درخواست بسته را برمی گرداند ، روش دیگری در سیستم عامل وجود دارد - RunPackage ().

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

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

وقتی پرس و جو من آنقدر پیچیده شد که فراتر از درک من بود ، تصمیم گرفتم از پرس و جوهای دسته ای استفاده کنم.

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

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

درخواستهای دسته ای فقط در نسخه 8.1.11.67.4 ظاهر شده است.

در اینجا متن درخواست وجود دارد:

VTLETTERS POSIT را از (SELECT "A" AS KN ترکیب همه انتخاب "B") را انتخاب کنید AS T1؛

SELECT T1.Zn PLACE WTDigits FROM (انتخاب "1" AS KN ترکیب همه انتخاب "2") AS T1؛

TB.Zn ، TC.Zn ، TB.Zn + TC.Zn را از نامه های VT به عنوان سل ، شماره های VT به عنوان TC انتخاب کنید

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

شکل یک نمونه جستجوی نمونه را نشان می دهد:

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

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

قبلاً ، وقتی جداول موقتی نبود ، باید متن پرس و جو را کپی کنید.

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

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

اگر درخواستها روشی داشتند درخواست. اجرای () حالا یک روش وجود دارد درخواست. RunPackage ()، که همه جداول را از بسته به عنوان یک آرایه برمی گرداند.

اعلامیه درخواست های دسته ای در وب سایت 1c در اینجا است: http://v8.1c.ru/overview/release_8_1_11/# عملکردی

داستان زندگی

بگذارید توضیح دهم چه چیزی من را وادار به درخواست دسته ای کرده است.

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

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

برای هر خط یک ، دو یا چند خطا دریافت می کنیم. زیرا ممکن است چندین خطا در یک خط وجود داشته باشد.

اما ممکن است خطا شناخته نشود ، پرچم " خطا"ایستاده است و متن خطا کد خطایی به ما نمی دهد.

ما اتصال چپ را انجام می دهیم ، جایی که کد خطا NULL است ، کد خطا را می دهیم " خطاهای دیگر» .

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

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

من فقط یک بار دیگر تمام خطوط را با خطاهای تمام خطوطی که برای آنها خطا پیدا شده است پیوند دادم ، و همچنان نوع خطای "خطاهای دیگر" را اضافه کردم.

اجازه دهید چگونگی تغییر نحو متون پرس و جو (و نه تکمیل شده) را با یک مثال ساده تحلیل کنیم: قابل مصرف حاوی در بخش جدول محصولات لیست محصولات فروخته شده و کمیت. هنگام انجام چنین سندی ، لازم است از کنترل مانده منفی ذخیره شده در ثبت انباشت مانده ها اطمینان حاصل شود تراز کالا.

ساختار پیکربندی در شکل نشان داده شده است.

(16.22 کیلوبایت) بارگیری: 64

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

درخواست \u003d درخواست جدید؛
Request.Text \u003d "
| انتخاب کنید
| Doc. نامگذاری ،
| AMOUNT (تعداد Doc) به تعداد Doc_Number ،
| MINIMUM (NULL است (تعداد. تعداد ، تعداد 0)) از نظر Reg_Number
| از
| سند. قابل مصرف. خوب AS Doc
| چپ مشترک
| ثبت انباشت. مانده های کالا. باقیمانده () با عنوان Reg
| توسط
| Doc.Nomenclature \u003d ثبت نام
| در کجا
| پیوند \u003d & پیوند
| بارگذاری توسط Doc.Nomenclature "؛

// انگشت خود را از طریق ثبت کنید

پایان چرخه ؛

پایان رویه

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

| انتخاب کنید
| Doc. نامگذاری ،

| از
| (انتخاب کنید

| از
| سند. درآمد. محصولات
| جایی که
| پیوند \u003d & پیوند
| بارگذاری توسط نامگذاری) AS Doc
| چپ مشترک
نامگذاری ب
| (متنوع را انتخاب کنید)
| نامگذاری
| از
| سند. درآمد. محصولات
| جایی که
| پیوند \u003d و پیوند)) همانطور که تنظیم شده است
| توسط

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

میزهای موقتی

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

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

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

روش پردازش ارسال (امتناع ، حالت ارسال)

MVT \u003d مدیر جداول موقت جدید ؛

درخواست \u003d درخواست جدید؛
Request.Text \u003d "
| انتخاب کنید
| نامگذاری ، مقدار SUM (مقدار) به عنوان مقدار
| پزشک
| از
| سند. درآمد. محصولات
| در کجا
| پیوند \u003d & پیوند
| بارگذاری توسط نامگذاری "؛

درخواست \u003d درخواست جدید؛
درخواست. مدیر جدول های موقت \u003d MVT؛
Request.Text \u003d "متنوع را انتخاب کنید
| نامگذاری
| لیست موارد POST
| از
| سند. درآمد. محصولات
| در کجا
| پیوند \u003d & پیوند "؛

درخواست \u003d درخواست جدید؛
درخواست. مدیر جدول های موقت \u003d MVT؛
Request.Text \u003d "
| انتخاب کنید
| Doc. نامگذاری ،
| Doc.Quantity AS Doc_Quantity ،
| NULL است (Reg.Amount باقیمانده ، 0) به عنوان Reg_Number
| از
| DOCTCH AS Doc
| چپ مشترک
| ثبت انباشت تعادل کالاها باقی مانده (،
| نامگذاری
| از
| توسط
| Doc.Nomenclature \u003d Reg.Nomenclature "؛

QueryResult \u003d Query.Run ()؛
Selection \u003d QueryResult.Select ()؛

while Sampling. حلقه بعدی ()

// باقیمانده های منفی را بررسی کنید

// انگشت خود را از طریق ثبت کنید

پایان چرخه ؛

پایان رویه

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

همچنین استفاده از دستورالعمل مجاز است از بین رفتن در این حالت جدول موقتی از بین می رود ، در غیر این صورت جداول موقتی همراه با اشیا manager مدیر جدول موقتی از بین می روند.

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

درخواست های دسته ای

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

در واقع ، در یک پرسش دسته ای ، می توانید چندین پرسش را توصیف کنید ، هر دو مربوط به یکدیگر با استفاده از جداول موقتی هستند ، و غیر مرتبط (امکان پذیر است ، اما دلیل آن مشخص نیست؟). در نتیجه ، شما می توانید همه درخواست ها را به صورت پی در پی اجرا کنید و در نتیجه یا یک آرایه با نتایج هر اجرای درخواست ، یا نتیجه مورد آخر دریافت کنید. برای بدست آوردن آرایه ای با نتایج جستجو ، از روش استفاده کنید RunPackage () درخواست شی ، و برای گرفتن نتیجه از آخرین درخواست ExecuteRequest ().

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

بیایید روش استفاده از درخواستهای دسته ای را دوباره بنویسیم:

روش پردازش ارسال (امتناع ، حالت ارسال)

درخواست \u003d درخواست جدید؛
Request.Text \u003d "
| انتخاب کنید
| نامگذاری ، مقدار SUM (مقدار) به عنوان مقدار
| پزشک
| از
| سند. درآمد. محصولات
| در کجا
| پیوند \u003d & پیوند
| بارگذاری توسط نام
|;
| متنوع را انتخاب کنید
| نامگذاری
| لیست موارد POST
| از
| سند. درآمد. محصولات
| در کجا
| پیوند \u003d & پیوند
|;
| انتخاب کنید
| Doc. نامگذاری ،
| Doc.Quantity AS Doc_Quantity ،
| NULL است (Reg.Amount باقیمانده ، 0) به عنوان Reg_Number
| از
| DOCTCH AS Doc
| چپ مشترک
| ثبت انباشت تعادل کالاها باقی مانده (،
| نامگذاری B (انتخاب متنوع)
| نامگذاری
| از
| لیست موارد AS لیست موارد)) AS Reg
| توسط
| Doc.Nomenclature \u003d Reg.Nomenclature "؛

while Sampling. حلقه بعدی ()

// باقیمانده های منفی را بررسی کنید

// انگشت خود را از طریق ثبت کنید

پایان چرخه ؛

پایان رویه

در حقیقت ، من تعریف شی object پرس و جو و استفاده از یک مدیر جدول موقتی را حذف کردم ، متن های پرس و جو را ترکیب کردم (به جدا کننده "؛" بین متن توجه کنید). در نتیجه ، متن پرس و جو بیشتر خوانا شده است (و خوانایی پرس و جو در هنگام استفاده از طراح پرس و جو بسیار بهبود می یابد).

پس از اجرای درخواست از متغیر آرایه نتایج ما 3 عنصر خواهیم داشت. دو مورد اول حاوی یک عدد است که تعداد رکوردهای قرار گرفته در جداول موقت را مشخص می کند DOCT و لیست اقلام، و سوم شامل انتخابی با فیلدها خواهد بود نامگذاری، Doc_ عدد و Reg_ عدد.

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

خوب ، این برای درخواستهای دسته ای است. مکانیسم بسیار مناسبی هم از نظر نوشتن نمایش داده ها و هم از نظر خواندن پرسش های پیچیده.