دفترچه یادداشت یک برنامه نویس. استفاده از دستورالعمل "مجاز" محدود کردن دسترسی در سطح رکورد


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

زبان پرس و جو 1s enterprise 8 - ساختار اپراتور SELECT

ساختار عملگر SELECT را در نظر بگیرید (قسمت های اختیاری اپراتور در پرانتز نشان داده شده است). زبان پرس و جو 1C طیف وسیعی از ابزارها را برای ایجاد نمونه های داده فراهم می کند.

[مجاز] [متفاوت] [FIRST A] [Field1] [AS Alias1], [Field2] [AS Alias2], ... [FieldM] [AS AliasB] [PUT TempTableName] [FROM Table1 AS TableAliasTable1 [[INTERJOIN] [LEFT JOIN][FULLJOIN] Table2 AS Table2 نام مستعار [[INNER JOIN][LEFT Join][FULL JOIN] TableC AS TableC نام مستعار TO Expression1 [AND Expression2]...[AND ExpressionD]] ... ... TO Expression1 [AND Expression2]...[و ExpressionE]] ... [TableF AS TableF مستعار] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Expression1 [AND Expression2 ] ... [AND ExpressionH]] [ترکیب همه...] [; ...] [INDEX BY Alias1 ... AliasB] [TOTALS [AggregateFunction(Field1)][,] [AggregateFunction(Field2)][,] ... [AggregateFunction(FieldI)] BY [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

کلمات کلیدی و بلوک برای کار با فیلدها

  • انتخاب کنید- یک کلمه کلیدی که شروع عملگر را نشان می دهد.
  • مجازنشان می دهد که انتخاب باید شامل رکوردهایی از جداول باشد که دسترسی خواندن آنها برای کاربر داده شده مجاز است.
  • مختلفنشان می دهد که فقط سینک های مختلف (برای همه زمینه ها) باید در انتخاب قرار گیرند. به عبارت دیگر، ردیف های تکراری از انتخاب حذف خواهند شد.
  • اول الفاگر این کلمه کلیدی را مشخص کنید، فقط اولین A از ردیف های انتخاب شده توسط پرس و جو در انتخاب گنجانده می شود، جایی که A یک عدد طبیعی است.
  • بلوک میدان- در این بلوک فیلدهایی که باید در انتخاب گنجانده شوند مشخص شده است. این فیلدها ستون های انتخابی خواهند بود. در ساده ترین حالت، یک فیلد به این صورت است: TableAlias.TableFieldName AS FieldAlias

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

کلمات کلیدی و بلوک برای کار با جداول

  • TempTableName را قرار دهید- کلمه کلیدی قرار دادنبرای ایجاد یک جدول موقت با یک نام خاص طراحی شده است که در این جلسه 1C 8 تا پایان یا تا زمانی که جدول موقت از بین برود در RAM ذخیره می شود. لازم به ذکر است که نام جداول موقت در یک جلسه 1C 8 نباید تکرار شود.
  • بلوک جداول و پیوندها- بلوک شامل تمام جداول استفاده شده در این پرس و جو و همچنین پیوندهای بین آنها می باشد. بلوک با یک کلمه کلیدی شروع می شود از جانب،به دنبال آن نام و نام مستعار جدول اول آمده است. اگر این جدول مربوط به جداول دیگر باشد، پیوندها نشان داده می شوند. زبان پرس و جو 1C شامل مجموعه ای از انواع روابط زیر است:
    • پیوستن داخلی- یک رکورد از جدول سمت چپ فقط در صورت رعایت شرط پیوند در انتخاب گنجانده می شود، رکوردی از جدول سمت راست فقط در صورت رعایت شرط پیوند در انتخاب گنجانده می شود.
    • چپ پیوستن- یک رکورد از جدول سمت چپ در هر صورت در انتخاب قرار می گیرد، یک رکورد از جدول سمت راست تنها در صورتی وارد انتخاب می شود که شرط پیوند برقرار باشد.
    • اتصال کامل- یک رکورد از جدول سمت چپ در هر صورت ابتدا در انتخاب گنجانده می شود، سپس فقط در صورت برقراری شرط پیوند، در هر صورت یک رکورد از جدول سمت راست در ابتدا در انتخاب گنجانده می شود، سپس فقط در صورت شرط پیوند. برآورده می شود. در عین حال، ردیف های تکراری ناشی از رابطه از انتخاب حذف می شوند.

    پس از نوع پیوند، نام و نام مستعار جدول دوم آمده است. بعد کلمه کلیدی می آید بر، و به دنبال آن شرایط اتصال، توسط عملگرهای منطقی به هم متصل می شوند و، یا.هر عبارت در شرط باید یک مقدار بولی (True, False) برگرداند. اگر جدول اول به جداول دیگری غیر از جدول دوم مرتبط باشد، نوع اتصال دوباره نشان داده می شود و غیره. هر یک از جداول درگیر در رابطه می تواند به نوبه خود با جداول دیگر مرتبط باشد، این در نمودار ساختار پرس و جو نشان داده شده است. اگر جدول مربوط به جدول اول نباشد، بدون نوع پیوستن مشخص شده است، سپس پیوندهای آن می توانند دنبال شوند و غیره.

کلیدواژه ها و بلوک های تبدیل داده ها

  • بلوک گروه بندی- این بلوک برای گروه بندی ردیف های جدول استفاده می شود. در صورتی که مقادیر فیلدهای مشخص شده بعد از کلمه کلیدی، سطرها در یک ترکیب شوند دسته بندی بر اساسمعلوم شود که همینطور است در این مورد، تمام فیلدهای دیگر با استفاده از توابع جمع خلاصه، میانگین، حداکثر یا کمینه می شوند. توابع جمع در یک بلوک از فیلدها استفاده می شود. مثال: Max(TableAlias.TableFieldName) AS FieldAlias
  • بلوک وضعیت- در این بلوک بعد از کلمه کلیدی جایی کهعبارات شرطی جدا شده توسط عملگرهای منطقی نشان داده شده است و، یا، برای اینکه هر یک از ردیف های انتخاب شده در انتخاب گنجانده شود، لازم است که تمام شرایط موجود در مجموع دارای مقدار باشند. درست است، واقعی.
  • همه را متحد کنید- این کلمه کلیدی برای ترکیب کوئری ها (اپراتورها) استفاده می شود انتخاب کنید). زبان پرس و جو 1C به شما امکان می دهد چندین پرس و جو را در یک پرس و جو ترکیب کنید. برای اینکه درخواست ها با هم ترکیب شوند، باید مجموعه ای از فیلدها را داشته باشند.
  • «;» - نقطه ویرگول برای جداسازی عباراتی که مستقل از یکدیگر هستند استفاده می شود انتخاب کنید؛
  • شاخص بر اساس- کلمه کلیدی برای نمایه سازی فیلدهای مشخص شده بعد از آن استفاده می شود.
  • بلوک کل- برای ساختن انتخاب های درخت مانند استفاده می شود. برای هر یک از فیلدهای گروه بندی مشخص شده بعد از کلمه کلیدی بر،یک ردیف جداگانه در انتخاب ایجاد می شود. در این خط با استفاده از توابع تجمیع، مجموع مقادیر فیلدهای مشخص شده پس از کلمه کلیدی محاسبه می شود. نتایج.

آیا می خواهید به یادگیری زبان پرس و جو 1s 8 ادامه دهید؟ سپس مقاله زیر را بخوانید.

   

17 قانون برای کامپایل یک درخواست بهینه به داده های پایگاه داده 1C

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

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

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

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

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

توصیه هایی برای نوشتن پرس و جوهای پایگاه داده در زبان پرس و جو پلتفرم 1C:

1) بدنه درخواست می تواند حاوی داده های پیکربندی از پیش تعریف شده باشد مانند:

  • مقادیر enum;
  • داده های از پیش تعریف شده:
  • دایرکتوری ها
  • طرح های انواع ویژگی ها؛
  • نمودارهای حسابداری؛
  • برنامه ریزی برای انواع محاسبات؛
  • لینک های خالی؛
  • ارزش نقاط راه فرآیندهای کسب و کار

همچنین، متن درخواست ممکن است حاوی مقادیر شمارش سیستم باشد که می تواند به فیلدهای جداول پایگاه داده اختصاص داده شود: AccumulationMotionType، AccountType و AccountingMovementType. درخواست ها به داده های پیکربندی از پیش تعریف شده و مقادیر شمارش سیستم با استفاده از نوع تابع VALUE اشاره دارند. این به معنای واقعی کلمه خوانایی پرس و جو را بهبود می بخشد و تعداد پارامترهای پرس و جو را کاهش می دهد.

نمونه ای از استفاده از لفظ معنی:

  • WHERE City = VALUE (Directory.Cities.Moscow)
  • WHERE City = VALUE(Reference.Cities.EmptyReference)
  • WHEREItemType = VALUE(Enumeration.ProductTypes.Service)
  • WHEREMovementType = VALUE(MovementTypeAccumulation.Income)
  • WHERE RoutePoint = VALUE(BusinessProcess.BusinessProcess1.RoutePoint.Action1

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

تنظیم خودکار بر اساس اصول زیر کار می کند:

  • اگر عبارت ORDER BY در پرس و جو مشخص شده باشد، هر ارجاع به جدول در این بند با فیلدهایی جایگزین می شود که جدول به طور پیش فرض مرتب شده است (برای فهرست ها، این کد یا نام، برای اسناد، تاریخ است. از سند). اگر قسمت ترتیب به یک فهرست سلسله مراتبی اشاره دارد، مرتب سازی سلسله مراتبی بر اساس این دایرکتوری اعمال خواهد شد.
  • اگر بند ORDER BY در پرس و جو وجود نداشته باشد، اما یک عبارت TOTALS وجود داشته باشد، نتیجه پرس و جو بر اساس فیلدهای موجود در عبارت RESULTS بعد از کلمه کلیدی BY، در همان ترتیب و اگر مجموع ها توسط فیلدها - پیوندها، سپس توسط فیلدهای مرتب‌سازی به‌طور پیش‌فرض جداولی که به آنها ارجاع داده شد.
  • اگر هیچ عبارت ORDER BY و TOTAL در پرس و جو وجود نداشته باشد، اما یک بند GROUP BY وجود داشته باشد، نتیجه پرس و جو بر اساس فیلدهای موجود در جمله در همان ترتیب مرتب می شود و اگر گروه بندی بر اساس فیلدها انجام شده باشد - پیوندها، سپس به صورت پیش‌فرض فیلدهایی را مرتب می‌کنند که به آنها ارجاع داده شده است.
  • اگر پرس و جو شامل بندها و ORDER BY، TOTAL و GROUP BY نباشد، نتیجه با فیلدهای مرتب‌سازی پیش‌فرض برای جداولی که داده‌ها از آن‌ها انتخاب شده‌اند، به ترتیبی که در جستار ظاهر می‌شوند، مرتب می‌شود.
  • اگر پرس و جو حاوی عبارت TOTAL باشد، هر سطح از مجموع به طور جداگانه مرتب می شود.

3) برای جلوگیری از پرس و جو مجدد پایگاه داده هنگام نمایش نتیجه پرس و جو برای کاربر (به عنوان مثال، ساختن یک پرس و جو یا نمایش نتیجه پرس و جو با استفاده از یک سند صفحه گسترده)، استفاده از دستورالعمل مفید است. پیوندهای ارائه A که به شما امکان می دهد نمایشی از یک مقدار مرجع دریافت کنید. مثال:

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

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

ثبتی برای انباشت Remains of Goods وجود دارد که فیلد Registrar دارای نوع ترکیبی است. در درخواست، تاریخ و شماره اسناد دریافت کالا انتخاب می شود، ضمن اینکه دسترسی به جزئیات سند از طریق فیلد Registrar منجر به اتصال چپ زیاد جدول ثبت تجمع با جداول اسناد ثبتی نمی شود.

کد 1C v 8.x SELECT
EXPRESS(باقیمانده کالا.سند ثبت به عنوان.دریافت کالا).شماره به عنوان شماره دریافت،
EXPRESS(باقیمانده کالا.سند ثبت به عنوان.دریافت کالا).تاریخ به عنوان تاریخ دریافت
از جانب
ثبت انباشت.باقی مانده کالا به عنوان باقیمانده کالا

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

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

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

کد 1C v 8.x // فیلدهای Number and Composition را انتخاب کنید
// از جدول مجازی Document.Invoice
Reference.Number، EMPTYTABLE. (Nom، Tov، Qty) را به عنوان ترکیب انتخاب کنید
FROM Document.Invoice
همه را متحد کنید
پیوند. شماره، ترکیب. (تعداد خط، محصول، کمیت) را انتخاب کنید
FROM Document.Invoice Document.Invoice.Composition.*

7) برای جلوگیری از تکرار خطوط در نتیجه پرس و جو، باید از دستورالعمل استفاده کنید مختلف، زیرا واضح تر و واضح تر است و دستورالعمل دسته بندی بر اساسبرای گروه بندی با استفاده از توابع جمع استفاده می شود. به هر حال، هنگام استفاده از توابع جمع، جمله دسته بندی بر اساسممکن است اصلاً مشخص نشود، در حالی که تمام نتایج پرس و جو در یک خط واحد گروه بندی می شوند. مثال:

کد 1C v 8.x // باید دریابید که کدام طرف مقابل
// کالا برای دوره ارسال شد.
Various را انتخاب کنید
سند.فاکتور.پیمانکار

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

کد 1C v 8.x SELECT
دریافت کالا و خدمات. کالاها.
دریافت کالا و خدمات لینک،
دریافت کالا و خدمات طرف مقابل
از جانب
سند دریافت کالا و خدمات به عنوان دریافت کالا و خدمات
دسته بندی بر اساس
دریافت کالا و خدمات.کالا.(نامگذاری)

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

10) هنگام مراجعه به جدول اصلی می توانید به داده های جدول فرعی در شرط مراجعه کنید. این ویژگی را عدم ارجاع به فیلدهای یک جدول فرعی می نامند.

مثال (جستجوی اسناد حاوی یک محصول خاص در بخش جدول):

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

11) یک نوع جالب از عملگر B بررسی وقوع یک مجموعه مرتب شده در مجموعه چنین مجموعه هایی است (Field1, Field2, ... , FieldN) B (Field1, Field2, ... , FieldN).

کد 1C v 8.x SELECT
پیمانکاران.لینک
جایی که
(پیمانکاران. پیوند، کالاها. پیوند)
(انتخاب فروش. مشتری، فروش. محصول
از ثبت نام تجمعی. فروش به عنوان فروش)
از جانب
دایرکتوری. طرف مقابل،
دایرکتوری.محصولات

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

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

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

همیشه امکان دسترسی یک توسعه دهنده به داده هایی که سیستم به آنها دسترسی دارد وجود ندارد.

13) در حالت عملکرد سرویس گیرنده-سرور، تابع SUBSTRING()با استفاده از تابع SUBSTRING() دستور SQL مربوطه ارسال شده به سرور پایگاه داده SQL Server، که نوع نتیجه تابع SUBSTRING() را بر اساس قوانین پیچیده بسته به نوع و مقادیر پارامترهای آن و همچنین محاسبه می کند. بسته به زمینه ای که در آن استفاده می شود. در بیشتر موارد، این قوانین بر اجرای یک پرس و جو تأثیر نمی گذارد، اما مواردی وجود دارد که حداکثر طول رشته نتیجه محاسبه شده توسط SQL Server برای اجرای پرس و جو ضروری است. مهم است که در نظر داشته باشید که در برخی زمینه ها هنگام استفاده از تابع SUBSTRING، حداکثر طول نتیجه آن می تواند برابر با حداکثر طول یک رشته با طول محدود باشد که 4000 کاراکتر در SQL Server است. این می تواند منجر به خرابی غیرمنتظره در اجرای پرس و جو شود:

ارائه دهنده Microsoft OLE DB برای SQL Server: هشدار: پردازشگر پرس و جو نمی تواند طرح پرس و جو را از بهینه ساز تولید کند زیرا طول کل ستون ها در بند GROUP BY یا ORDER BY بیش از 8000 بایت است.

HRESULT=80040E14، SQLSTATE=42000، native=8618

14) با احتیاط استفاده کنید یادر حال ساخت جایی که، از آنجایی که استفاده از یک شرط با OR می تواند به طور قابل توجهی پرس و جو را "وزن" کند. مشکل را می توان با طراحی حل کرد همه را متحد کنید. مثال:

کد 1C v 8.x SELECT

از جانب

جایی که
_DemoContractors.Link =Link1
همه را متحد کنید
انتخاب کنید
_Demo Counterparties.NameFull
از جانب
دایرکتوری._DemoContractors چگونه _DemoContractors
جایی که
_DemoContractors.Link =Link2

15) وضعیت موجود نیستدر حال ساخت جایی کهزمان اجرای درخواست را افزایش می دهد، زیرا یک نوع است نه (OR1 OR2 ... ORn)، بنابراین برای میزهای بزرگ سعی کنید از آن استفاده کنید LEFT JOIN با شرط IS NULL. مثال:

کد 1C v 8.x SELECT
_DemoContractors.لینک
از جانب
دایرکتوری._DemoContractors چگونه _DemoContractors
LEFT JOIN Document._DemoBuyerOrder AS _DemoBuyerOrder
نرم افزار _DemoContractors.Link = _BuyerDemoOrder.Contractor
جایی که
_سفارش دمو خریدار. طرف مقابل تهی است

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

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

17) اگر استفاده نمی کنید مدیر جدول Temp، پس نیازی به حذف صریح جدول موقت نیست، پس از اتمام اجرای کوئری دسته ای حذف می شود، در غیر این صورت جدول موقت باید به یکی از روش های زیر حذف شود: با دستور از بین رفتندر درخواست، روش را فراخوانی کنید TemporaryTable Manager.Close().

و علاوه بر ویدیو از Evgeny Gilev: اشتباهات معمولی هنگام نوشتن درخواست برای 1C:

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

مزایای اصلی زبان پرس و جو 1C 8.3 (8.2) نسبت به SQL:

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

معایب زبان پرس و جو در 1C:

  • برخلاف SQL، در پرس و جوهای 1C به شما اجازه تغییر داده ها را نمی دهند.
  • عدم وجود رویه های ذخیره شده؛
  • عدم امکان تبدیل رشته به عدد

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

با توجه به اینکه درخواست ها در 1C فقط به شما امکان دریافت داده ها را می دهند، هر درخواستی باید با کلمه "SELECT" شروع شود. پس از این دستور، فیلدهایی که می خواهید از آنها داده دریافت کنید نشان داده می شود. اگر "*" را مشخص کنید، تمام فیلدهای موجود انتخاب می شوند. محل انتخاب داده ها (اسناد، ثبت، دایرکتوری ها و غیره) بعد از کلمه "FROM" مشخص شده است.

در مثال زیر، نام کل نامگذاری از کتاب مرجع «نامگذاری» انتخاب شده است. بعد از کلمه "HOW"، نام مستعار (نام) برای جداول و فیلدها نشان داده شده است.

انتخاب کنید
Nomenclature.Name AS NameNomenclature
از جانب
فهرست نامگذاری AS نامگذاری

در کنار دستور "SELECT" می توانید کلمات کلیدی را مشخص کنید:

  • مختلف. پرس و جو فقط ردیف هایی را انتخاب می کند که حداقل در یک فیلد متفاوت باشند (بدون تکرار).
  • FIRST n، جایی که n– تعداد ردیف هایی که از ابتدای نتیجه انتخاب می شود. اغلب، این ساختار همراه با مرتب سازی (ORDER BY) استفاده می شود. به عنوان مثال، زمانی که باید تعداد مشخصی از آخرین اسناد را بر اساس تاریخ انتخاب کنید.
  • مجاز. این طرح به شما امکان می دهد از پایگاه داده تنها آن دسته از رکوردهایی را انتخاب کنید که در دسترس کاربر فعلی هستند. اگر از این کلمه کلیدی استفاده شود، اگر کاربر بخواهد رکوردهایی را که به آنها دسترسی ندارد پرس و جو کند، پیغام خطا دریافت می کند.

این کلمات کلیدی را می توان همه با هم یا جداگانه استفاده کرد.

برای تغییر

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

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

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

جایی که

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

در زیر نمونه ای از درخواست برای دریافت افراد تماس با یک موقعیت خاص است. پارامتر انتخاب فرمت زیر را دارد: &ParameterName (نام پارامتر دلخواه است).

انتخاب (مورد)

ساختار به شما امکان می دهد شرایط را مستقیماً در بدنه درخواست مشخص کنید.

در مثال زیر، "AdditionalField" بسته به اینکه سند پست شده باشد یا نه حاوی متن خواهد بود:

انتخاب کنید
AdmissionT&U.Link،
انتخاب
چه زمانی
سپس "سند ارسال شد!"
ELSE "سند پست نشد..."
END AS AdditionalField
از جانب
سند.دریافت کالاخدمات به عنوان رسیدT&C

پیوستن

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

چپ/راست بپیوندید

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

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

انتخاب کنید
دریافت نامگذاری T&U.
قیمت ها.قیمت
از جانب
سند.دریافت کالاخدمات.کالا به عنوان رسیدT&C
پیوستن داخلی
در مورد دریافت پرسش و پاسخ. نامگذاری = قیمتها. نامگذاری

در RIGHT، همه چیز دقیقا برعکس است.

اتصال کامل

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

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

پیوستن داخلی

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

دسته بندی بر اساس

گروه بندی در پرس و جوهای 1C به شما امکان می دهد ردیف های جدول (فیلدهای گروه بندی) را طبق یک ویژگی مشترک خاص (فیلدهای گروه بندی) جمع کنید. فیلدهای گروه بندی را فقط می توان با استفاده از توابع جمع نمایش داد.

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

انتخاب کنید
,
MAX (Price.Price) به عنوان قیمت
از جانب

دسته بندی بر اساس
قیمتها.نامگذاری.نوع نامگذاری

نتایج

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

نتایج را می توان برای کل جدول (با استفاده از کلمه کلیدی "GENERAL")، برای چندین فیلد، برای فیلدهایی با ساختار سلسله مراتبی (کلمات کلیدی "HIERARCHY"، "ONLY HIERARCHY") خلاصه کرد. هنگام جمع بندی، نیازی به استفاده از توابع تجمیع نیست.

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

انتخاب کنید
قیمتها.نامگذاری.نوع نامگذاری AS نوع نامگذاری،
Prices.Price AS Price
از جانب
RegisterInformation.PricesNomenclature.SliceLast AS Prices
نتایج
MAXIMUM (قیمت)
بر
نوع نامگذاری

داشتن

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

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

انتخاب کنید

MAX (Price.Price) به عنوان قیمت
از جانب
RegisterInformation.PricesNomenclature.SliceLast AS Prices
دسته بندی بر اساس
قیمتها.نامگذاری.نوع نامگذاری
داشتن
MAX (قیمت.قیمت) > 1000

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

عملگر "ORDER BY" نتیجه پرس و جو را مرتب می کند. برای اطمینان از خروجی رکوردها به ترتیب ثابت، از AUTO-ORDER استفاده می شود. انواع اولیه طبق قوانین معمول مرتب شده اند. انواع مرجع بر اساس GUID مرتب شده اند.

نمونه ای از مرتب کردن لیستی از کارمندان بر اساس نام:

انتخاب کنید
Employees.Name AS نام
از جانب
فهرست کارمندان AS Employees
مرتب سازی بر اساس
نام
سفارش خودکار

سایر ساختارهای زبان پرس و جو 1C

  • متحد کردن- نتایج دو پرس و جو در یک.
  • همه را متحد کنید- شبیه به JOIN، اما بدون گروه بندی ردیف های یکسان.
  • میز خالی- گاهی اوقات هنگام پیوستن به پرس و جوها برای تعیین یک جدول تودرتو خالی استفاده می شود.
  • قرار دادن- یک جدول موقت برای بهینه سازی پرس و جوهای پیچیده 1C ایجاد می کند. به این گونه درخواست ها، درخواست های دسته ای می گویند.

ویژگی های زبان پرس و جو

  • SUBSTRINGیک رشته را از یک موقعیت مشخص با تعداد مشخص کاراکتر کوتاه می کند.
  • سال…دومبه شما امکان می دهد مقدار انتخاب شده از نوع عددی را بدست آورید. پارامتر ورودی یک تاریخ است.
  • شروع دوره و پایان دورههنگام کار با خرما استفاده می شود. نوع دوره (DAY، MONTH، YEAR، و غیره) به عنوان یک پارامتر اضافی مشخص می شود.
  • افزودنبه شما امکان می دهد زمان مشخص شده از یک نوع خاص (SECOND، MINUTE، DAY، و غیره) را از تاریخ اضافه یا کم کنید.
  • تفاوت تاریختفاوت بین دو تاریخ را تعیین می کند و نوع مقدار خروجی را مشخص می کند (DAY، YEAR، MONTH و غیره).
  • ISNULLمقدار از دست رفته را با عبارت مشخص شده جایگزین می کند.
  • PRESENTATION و PRESENTATIONLINKSنمایش رشته فیلد مشخص شده را دریافت کنید. آنها به ترتیب برای هر مقدار و فقط مقادیر مرجع استفاده می شوند.
  • نوع، نوع ارزشبرای تعیین نوع پارامتر ورودی استفاده می شود.
  • ارتباط دادنیک عملگر مقایسه منطقی برای نوع مقدار ویژگی است.
  • بیانبرای تبدیل مقدار به نوع مورد نظر استفاده می شود.
  • وقت قرارمقداری از نوع "تاریخ" را از مقادیر عددی (سال، ماه، روز، ساعت، دقیقه، ثانیه) دریافت می کند.
  • معنیدر یک درخواست 1C، از آن برای تعیین مقادیر از پیش تعریف شده - دایرکتوری ها، شمارش ها، طرح هایی برای انواع ویژگی ها استفاده می شود. مثال استفاده: " Where LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

Query Builder

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

  • "جدول و فیلدها" - شامل فیلدهایی است که باید انتخاب شوند و منابع آنها.
  • "پیوندها" - شرایط ساختار CONNECTION را توصیف می کند.
  • "گروه بندی" - حاوی شرحی از ساخت گروه ها و فیلدهای خلاصه شده توسط آنها است.
  • "شرایط" - مسئول انتخاب داده ها در درخواست است.
  • "پیشرفته" - پارامترهای پرس و جو اضافی، مانند کلمات کلیدی دستور "SELECT" و غیره.
  • "پیوستن / نام مستعار" - امکان پیوستن به جداول نشان داده شده است و نام مستعار تنظیم شده است (ساخت "HOW").
  • "Order" - مسئول مرتب سازی نتیجه پرس و جوها است.
  • "Totals" - شبیه به برگه "گروه بندی" است، اما برای ساخت "TOTALS" استفاده می شود.

متن درخواست را می توان با کلیک بر روی دکمه "درخواست" در گوشه سمت چپ پایین مشاهده کرد. در این فرم می توان آن را به صورت دستی تصحیح یا کپی کرد.


کنسول پرس و جو

برای مشاهده سریع نتیجه یک پرس و جو در حالت "Enterprise" یا اشکال زدایی پرس و جوهای پیچیده، از استفاده کنید. متن پرس و جو در آن نوشته می شود، پارامترها تنظیم می شوند و نتیجه آن نشان داده می شود.

می توانید کنسول پرس و جو را روی دیسک ITS یا توسط دانلود کنید.

20.09.2014

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

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

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

"انتخاب کنید

سازمان،

شخصی

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

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

"انتخاب کنید

سازمان،

شخصی

(انتخاب کنید

سازمان

شخصی)

از ثبت انباشت. تسویه متقابل

(جایی که

سازمان

شخصی)

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

می توانید دوباره بپرسید - "چرا نباید از دستورالعمل مجاز استفاده کنید"، این بلافاصله یک انتخاب را تحمیل می کند، کاربر را از پیام هایی که نیاز ندارد نجات می دهد!

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

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

اما چگونه می توانید همچنان از خطای "سقوط" برنامه با کمبود حقوق جلوگیری کنید؟

بله، بسیار ساده است، شما باید از دستور "Try" استفاده کنید، این یک مثال است:

تلاش

Request.Execute();

استثنا

گزارش(ErrorDescription());

پایان تلاش؛

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

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

می توانید در مقاله ما با تفاوت های ظریف تنظیم RLS در بخش های جداگانه آشنا شوید.

شی پیکربندی "نقش" مجموعه ای از حقوق را برای عملیات (عملیات) روی اشیاء پیکربندی می دهد.

نقش "حقوق کامل".

این فقط یک نقش (از پیش تعریف نشده) است که دارای چک باکس هایی برای انواع حقوق در تمام اشیاء پیکربندی است.

وجه تمایز آن با سایر نقش‌ها، وجود حق «اداره» است.

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

دسترسی را در سطح رکورد محدود کنید

امنیت سطح ردیف (RLS) - محدودیت در سطح رکورد.

مکانیسم محدودیت های دسترسی به داده ها به شما امکان می دهد حقوق دسترسی را نه تنها در سطح اشیاء ابرداده، بلکه در سطح اشیاء پایگاه داده نیز مدیریت کنید. برای محدود کردن دسترسی به داده ها می توان از اشیاء زیر استفاده کرد:

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

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

اجرای فنی محدودیت های دسترسی در 1C

1C یک درخواست به DBMS ایجاد می کند. خوشه سرور یک بخش WHERE را به درخواست اضافه می کند که حاوی متن شرط برای محدود کردن دسترسی توسط RLS است، سپس این درخواست به DBMS ارسال می شود، داده های استخراج شده به مشتری 1C بازگردانده می شود.


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

  • در گزارش ها
  • در لیست های پویا و فرم های لیست منظم
  • در درخواست های تصادفی

چنین پیاده سازی مکانیزم به شدت بر عملکرد تأثیر می گذارد.

راه هایی برای دور زدن محدودیت های دسترسی

در عملیات‌های بزرگ با منابع فشرده (مثلاً پردازش اسناد ارسال مجدد)، بخشی از کد را می‌توان به ماژول‌های ممتاز منتقل کرد.

ولی) ماژول ممتاز یک ماژول مشترک با پرچم "ممتاز" در خواص است.

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


ب) همچنین ممتازحالت را می توان فعال کرد برای ماژول های شی سند. این در ویژگی های سند، پرچم انجام می شود

  • حالت ممتاز هنگام نگه داشتن
  • حالت ممتاز هنگام عدم برنامه ریزی


ج) روش SetPrivilegedMode()

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

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

تا خط غیرفعال کردن این حالت یا تا پایان رویه / عملکرد عمل می کند

(درست است، واقعی)؛

// هر کدی در اینجا بدون کنترل حقوق و RLS اجرا خواهد شد

SetPrivilegedMode(دروغ )؛ // یا پایان رویه / تابع

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

اگر در یک روش یا تابع متد فراخوانی شود SetPrivilegedMode(نادرست) بیشتر از فراخوانی های متد انجام شده است SetPrivilegedMode(درست است) سپس یک استثنا پرتاب می شود

عملکرد PrivilegedMode() اگر حالت ممتاز همچنان فعال باشد، True و اگر حالت ممتاز کاملاً غیرفعال باشد، نادرست را برمی‌گرداند. تعداد تنظیمات حالت ممتاز را در یک عملکرد خاص تجزیه و تحلیل نمی کند.

همه رویه ها و توابع فراخوانی شده نیز در حالت ممتاز اجرا خواهند شد.


همچنین امکان شروع یک جلسه ممتاز نیز وجود دارد. این جلسه ای است که در آن حالت ممتاز از همان ابتدای سیستم تنظیم می شود. در همان زمان، در طول عملیات، روش PrivilegedMode() همیشه True را برمی گرداند و قابلیت غیرفعال کردن حالت ممتاز پشتیبانی نمی شود. فقط یک کاربر با حقوق مدیریت (حق مدیریت) می تواند یک جلسه ممتاز را شروع کند. جلسه را می توان با استفاده از سوئیچ خط فرمان برای راه اندازی برنامه مشتری UsePrivilegedMode یا پارامتر رشته اتصال پایگاه اطلاعات prmod آغاز کرد.


این سوال به طور طبیعی مطرح می‌شود: پس چرا اصلاً محدودیت‌های دسترسی را تعیین می‌کنیم، اگر به این راحتی می‌توان از آن عبور کرد؟

حالت امن.

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

SafeMode را تنظیم کنید().

حالت ایمن، در میان چیزهای دیگر، حالت ممتاز را نادیده می گیرد.

باید قبل از فراخوانی برنامه‌نویسی کنترل‌کننده‌های خارجی یا صادرات رویه‌ها و توابع از ماژول‌های آنها تنظیم شود.

هنگام اجرای عملیات ممنوعه در زمان اجرا، یک استثنا ایجاد می کند.

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

تنظیم محدودیت دسترسی

RLS را فقط می توان برای حقوق پیکربندی کرد:

  • خواندن (انتخاب)
  • افزودن (درج)
  • تغییر (به روز رسانی)
  • حذف (حذف)

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

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

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

برای همه حقوق دیگر، این گزینه در دسترس نیست.

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

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

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


*ویژگی: برای حقوق اضافه کردن، تغییر، حذف:

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

برای سمت راست "Read"، می توانید چندین شرط را تنظیم کنید، آنها با عملگر منطقی "AND" ترکیب می شوند.

در محدودیت های مربوط به اشیاء پایگاه داده از انواع زیر، نمی توان از تمام فیلدهای شی داده اصلی محدودیت استفاده کرد:

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

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

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

هر عملیاتی بر روی داده های ذخیره شده در پایگاه داده در 1C:Enterprise در نهایت منجر به دسترسی به پایگاه داده با درخواست برای خواندن یا تغییر داده ها می شود. در هنگام اجرای پرس و جوها در پایگاه داده، مکانیسم های داخلی 1C:Enterprise محدودیت های دسترسی را اعمال می کند. که در آن:

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

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

محدودیت های ناشی از همان نقش با یک عملیات AND ترکیب می شوند.

محدودیت های دریافت شده از نقش های مختلف با عملیات OR ترکیب می شوند.

شرایط ساخته شده به پرس و جوهای SQL اضافه می شوند که با آن 1C: Enterprise به DBMS دسترسی دارد. هنگام دسترسی به داده ها از سمت شرایط محدودیت دسترسی، هیچ بررسی حقوقی انجام نمی شود (نه به اشیاء ابرداده و نه برای اشیاء پایگاه داده). علاوه بر این، مکانیسم اضافه کردن شرایط بستگی به نحوه عملکرد انتخابی محدودیت های "همه" یا "مجاز" دارد.


*ویژگی: اگر کاربر به چند نقش با محدودیت های پیکربندی شده در سطح رکوردها به یک شی دسترسی داشته باشد، در این حالت شرایط محدودیت ها با عملیات منطقی "OR" اضافه می شود. به عبارت دیگر، مجوزهای کاربر تجمعی هستند.

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

همه راهها.

وقتی محدودیت‌هایی با استفاده از روش «همه» اعمال می‌شود، شرایط و فیلدهایی به جستارهای SQL اضافه می‌شود تا 1C:Enterprise بتواند اطلاعاتی در مورد اینکه آیا داده‌های ممنوعه برای کاربر معین در فرآیند اجرای یک پرس و جو پایگاه داده استفاده شده است یا خیر، به دست آورد. . اگر از داده های ممنوعه استفاده شده باشد، به دلیل نقض دسترسی، درخواست لغو می شود.

اعمال محدودیت های دسترسی به روش "همه" به صورت شماتیک در شکل نشان داده شده است:


روش "مجاز".

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


هنگامی که 1C:Enterprise به پایگاه داده دسترسی پیدا می کند، محدودیت های دسترسی به داده ها بر روی اشیاء پایگاه داده اعمال می شود.

در نسخه سرویس گیرنده-سرور 1C:Enterprise، محدودیت هایی بر روی سرور 1C:Enterprise اعمال می شود.

با این حال، اگر به جدولی در پرس و جو مراجعه کنیم که محدودیت های دسترسی برای آن پیکربندی نشده است، اما در آن پیوندهایی به ردیف های جدول با محدودیت های پیکربندی شده وجود دارد، این گزینه (ALLOWED) کار نخواهد کرد. در این صورت، نتیجه پرس و جو خواهد بود "<Объект не найден>……” به جای مقدار فیلد مرجع.


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

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

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

تمرین 1. Query builder در تنظیمات RLS.

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


برگه "جدول"

جدول اصلی، جدول شی ای خواهد بود که محدودیت برای آن پیکربندی می شود.

همچنین می توانید جداول دیگری را انتخاب کنید و روابط مختلفی را بین آنها در برگه "روابط" تنظیم کنید.

برگه شرایط

در اینجا می توانید شرایط واقعی برای محدود کردن دسترسی را پیکربندی کنید.

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

"نامگذاری WHERE نامگذاری. قیمت > 500"

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


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


گروه ها نیز ناپدید شده اند. متن محدودیت را تغییر دهید

"نامگذاری WHERE نامگذاری. قیمت > 500

OR Nomenclature.This یک گروه است"

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


اگر نمایش فیلد "کد" را در تنظیمات لیست حذف کنید، تمام عناصر دایرکتوری نمایش داده می شوند، به عنوان مثال. محدودیت کار نکرد اگر نمایش فیلد "کد" را تنظیم کنید، محدودیت کار خواهد کرد.


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


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


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

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

پس از تنظیم محدودیت دسترسی، نمایش خط در لیست حقوق تغییر کرد - خاکستری شد و یک نماد ظاهر شد.

محدودیت های پیکربندی دسترسی (RLS).

  • بدون بخش خلاصه
  • شما نمی توانید به جداول ثبت مجازی دسترسی داشته باشید.
  • شما نمی توانید به صراحت از پارامترها استفاده کنید.
  • از سوالات فرعی می توان استفاده کرد any>/span> امکانات زبان پرس و جو، به جز:
    • عملگر در سلسله مراتب;
    • نتایج را ارائه می دهد.
    • نتایج پرس و جو تو در تو نباید شامل قطعات جدولی باشد>/span>;
    • جداول مجازی، به ویژه مانده ها و گردش مالی

تمرین 2. نامگذاری با قیمت فعلی.

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

راه حل:

یک قانون محدودیت دسترسی جدید برای کتاب مرجع «نام‌گذاری» برای حق «خواندن» اضافه می‌کنیم.
"فیلدهای دیگر" را انتخاب کنید.
در سازنده، یک کوئری تودرتو اضافه کنید. در آن، جدول ثبت اطلاعات "قیمت کالا" را انتخاب کنید.
برگه "سفارش" وجود ندارد - این یکی از ویژگی های سازنده پرس و جو برای ایجاد یک پرس و جو محدودیت دسترسی است.
در تب "پیشرفته"، "اول 999999999" را تنظیم کنید، تب "سفارش" ظاهر شده است.
ترتیب را بر اساس قسمت "پریود" به ترتیب نزولی تنظیم کنید.
سپس ارتباط جدول اصلی با زیرپرسوجو را با مرجع تنظیم می کنیم.


الگوهای محدودیت دسترسی.

تمرین 3. محدودیت در "پیمانکاران" بر اساس ارزش در یک ثابت.

محدودیت دسترسی را برای دایرکتوری Counterparties با مقدار ذخیره شده در Constant تنظیم کنید.

علاوه بر این، باید برای تمام اشیایی که از فهرست "پیمانکاران" در جزئیات استفاده می کنند، محدودیتی ایجاد کنید.

راه حل

برای کتاب مرجع «حساب‌ها»، برای سمت راست «خواندن»، با افزودن یک جستجوی تودرتو به ثابت در بخش «شرایط»، محدودیتی ایجاد می‌کنیم. ThisGroup را فراموش نکنید.

ما مشکل را می بینیم، دایرکتوری Counterparties به درستی فیلتر شده است، و تمام اسناد با ویژگی "Counterparty" نمایش داده می شوند، برخی از آنها دارای پیوندهای "شکسته" در ویژگی "Counterparty" هستند.

اکنون باید محدودیت دسترسی را برای همه اشیاء با استفاده از پیوند "Accounts" پیکربندی کنید. بیایید آنها را با سرویس "جستجوی پیوندهای یک شی" پیدا کنیم.

بیایید متن شرط RLS را از دایرکتوری "Counterparties" کپی کرده و کمی تغییر دهیم. این کار باید به تعداد دفعات یافتن اشیاء انجام شود.

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

الگوهای محدودیت دسترسی در سطح نقش پیکربندی می‌شوند و می‌توانند برای هر شیئی در نقش ویرایش شده استفاده شوند.

شما می توانید هر قطعه از متن محدودیت دسترسی را در قالب قرار دهید. این الگو از طریق نماد "#" فراخوانی می شود. برای مثال #TemplateContractor.

از طریق # در 1C، دستورالعمل ها برای پیش پردازنده نوشته می شود. در زمینه اجرای تنظیمات محدودیت دسترسی، پلتفرم متن تماس الگو را با متن الگو جایگزین می‌کند.

بیایید متن را بعد از کلمه WHERE به الگوی "TemplateContractor" منتقل کنیم، به جز متن مربوط به ThisGroup.

پارامترها در قالب های محدودیت دسترسی

بیایید به حل مشکل 2 ادامه دهیم.

مشکل اکنون این است که جدول اصلی در فهرست "طرف مقابل"، در سند "فاکتور" نامیده می شود. فیلد بررسی شده در دایرکتوری "پیوند" نامیده می شود، در سند - "Counterparty".

نام جدول اصلی در متن الگو را به "#CurrentTable" تغییر دهید.

"#CurrentTable" یک پارامتر از پیش تعریف شده است.

و از طریق نقطه، تعداد پارامتر ورودی را نشان می دهیم - “.#Parameter(1)

"#Parameter" نیز یک مقدار از پیش تعریف شده است. ممکن است شامل تعداد دلخواه پارامترهای ورودی باشد. با شماره سریال به آنها اشاره می شود.

در متن محدودیت دسترسی برای دایرکتوری موارد زیر را مشخص می کنیم:

برای سند زیر:

“فروش کالا WHERE #TemplateContractor(”پیمانکار”)”

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

جدول اصلی - نامگذاری

متن قالب این است:

#CurrentTable WHERE #CurrentTable.#Parameter(1) = #Parameter(2)

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

کاراکتر "#" ممکن است به دنبال آن باشد:

  • یکی از کلمات کلیدی:
    • پارامتری که به دنبال آن تعداد پارامتر در قالب داخل پرانتز قرار دارد.
    • CurrentTable - به معنای درج نام کامل جدولی است که محدودیت برای آن ایجاد شده است.
    • CurrentTableName- نشان دهنده درج در متن نام کامل جدول (به عنوان یک مقدار رشته، در علامت نقل قول) است که دستورالعمل به آن اعمال می شود، در نسخه فعلی زبان داخلی؛
    • NameCurrentPermission- حاوی نام حقی است که محدودیت فعلی برای آن انجام شده است: READ/READ، ADD/INSERT، ModIFY/UPDATE، DELETE/DELETE.
  • نام پارامتر الگو - به معنای درج محدودیت پارامتر الگوی مربوطه در متن است.
  • نماد "#" - نشان دهنده درج یک نماد واحد "#" در متن است.

یک عبارت محدودیت دسترسی می تواند شامل موارد زیر باشد:

  • الگوی محدودیت دسترسی که در قالب مشخص شده است #TemplateName("مقدار پارامتر الگو 1"، "مقدار پارامتر الگو 2"،...). هر پارامتر الگو در دو گیومه محصور شده است. اگر نیاز به تعیین یک کاراکتر نقل قول دوگانه در متن پارامتر دارید، از دو گیومه استفاده کنید.
  • Function StrContains (جایی که به دنبال آن هستیم، آنچه ما به دنبال آن هستیم). این تابع برای جستجوی رخداد WhatLooking for در رشته WhereLooking برای جستجو طراحی شده است. اگر مطابقت پیدا شود، درست است، در غیر این صورت نادرست است.
  • عملگر + برای الحاق رشته ها.

برای سهولت در ویرایش متن الگو، در تب Restriction templates در فرم نقش، دکمه Set template text را کلیک کنید. در گفتگوی باز شده، متن الگو را وارد کرده و روی OK کلیک کنید.

آنها را نمی توان با استفاده از نصب کرد setParameter()یا چیزی مشابه

در این حالت پارامترها عبارتند از:

  • گزینه های جلسه
  • گزینه های عملکردی

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

تمرین 4. دسترسی به طرف مقابل "شما".

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

دایرکتوری «کاربران»، دایرکتوری «طرفداران»، اسنادی با «طرف مقابل» وجود دارد.

کاربر فعلی باید داده ها را فقط برای طرف مقابلی ببیند که برای آنها ارتباط برقرار شده است.

ارتباطات نیز باید پیکربندی شود.

گزینه های ممکن:

ایجاد پیوندهای کاربر + طرف مقابل

  • جزئیات در دایرکتوری طرف مقابل
  • ثبت اطلاعات

راه حل های ممکن برای مشکل:

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

راه حل.

بیایید یک پارامتر جلسه جدید "CurrentUser" ایجاد کنیم و پر کردن آن را در ماژول جلسه بنویسیم.

بیایید یک ثبت اطلاعات "مکاتبات مدیران و طرفین" ایجاد کنیم

بیایید یک نقش جدید و در آن یک محدودیت دسترسی جدید برای سند "فاکتور رسید" ایجاد کنیم.

در متن پرس و جو، جدول اصلی را با ثبت اطلاعات توسط Contractor = Contractor و Manager = &CurrentUser متصل می کنیم. نوع اتصال داخلی

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

ما بررسی می کنیم - محدودیت ها کار می کنند

* ویژگی: اگر لیست طرف مقابل کاربر را در ثبت تغییر دهید، محدودیت های دسترسی بلافاصله بدون راه اندازی مجدد جلسه کاربر اعمال می شود.

تمرین 5. بدون تغییر تاریخ.

لازم است محدودیت ویرایش داده ها زودتر از تاریخ تعیین شده برای ممنوعیت تغییرات اعمال شود.
کاربران باید محدود باشند.

بیایید یک ثبت اطلاعات "ChangeBarDateDate" با بعد کاربر، منبع RestrictedDate ایجاد کنیم.

بیایید منطق راه حل را به این صورت بسازیم:

  • اگر کاربر مشخص نشده باشد، ممنوعیت برای همه کاربران اعمال می شود
  • اگر برای همه کاربران محدودیت و برای یک کاربر خاص محدودیت وجود داشته باشد، برای یک کاربر خاص محدودیت وجود دارد و برای بقیه طبق اصل کلی.

بدیهی است که چنین محدودیتی را می توان برای اشیاء پایگاه داده ای که موقعیت خاصی در محور زمان دارند، پیکربندی کرد. میتونه باشه

  • مدارک
  • ثبت اطلاعات دوره ای

بیایید یک نقش جدید "RestrictionsBy ChangeProhibitionDate" ایجاد کنیم.

در آن، برای سند "فاکتور رسید" برای "تغییر" مناسب، یک محدودیت دسترسی جدید اضافه می کنیم.

تنظیمات برای همه فیلدها مشخص شده است.

متن محدودیت این است:

رسید فاکتور از سند دریافت فاکتور به عنوان فاکتور فاکتور

ChangeProhibitionDates.ProhibitionDate AS ProhibitionDate
از جانب

پیوستن داخلی (انتخاب کنید
MAXIMUM(ChangeProhibitionDate.User) به عنوان کاربر
از جانب
ثبت اطلاعات تاریخ های ممنوعیت تغییرات به عنوان تاریخ ممنوعیت تغییرات
جایی که
(ChangeProhibitionDates.User = &CurrentUser
ORChangeProhibitionDate.User = VALUE(Reference.users.NullReference))) AS OT_User
BYChangeProhibitedDate.User = OT_User.User) AS Subquery
Invoice Invoice.Date > NestedRequest.BanDate

ما بررسی می کنیم - محدودیت کار می کند.

استفاده از دستورالعمل های پیش پردازنده

#اگر شرط 1 #پس

درخواست قطعه 1

#ElseIf Condition2 #سپس

درخواست قطعه 2

#در غیر این صورت

درخواست قطعه 3

#پایان اگر

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

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

نکته منفی این است که سازنده پرس و جو با چنین متنی کار نمی کند.

*خصوصیات عجیب و غریب :

برخلاف دستورالعمل‌های پیش‌پردازنده 1C: Enterprise در متون محدودیت دسترسی، قبل از عملگر Then با علامت هش قرار دهید - #Then

تمرین 6. «استفاده از RLS» را تغییر دهید

بیایید سیستم محدودیت خود را با یک سوئیچ تکمیل کنیم که استفاده از محدودیت را در سطح رکورد فعال/غیرفعال می کند.

برای انجام این کار، یک Constant و یک پارامتر جلسه به نام "UseRLS" اضافه کنید.

بیایید در Session Module مقدار پارامتر session را از مقدار ثابت بنویسیم.

کد زیر را به تمام متون محدودیت دسترسی اضافه کنید:

"#If &UseRLS #Then….. #EndIf"

ما بررسی می کنیم - همه چیز کار می کند.

با این حال، اکنون پس از روشن کردن پرچم "استفاده از رادار"، تغییرات بلافاصله اعمال نمی شوند. چرا؟

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

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


پایان قسمت اول.

انتخاب سردبیر
در سال 2012، یک برنامه بلند مدت "چگونه از صفر یک کشاورز شویم" در روسیه راه اندازی شد، با هدف توسعه بخش...

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

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

افتتاح پمپ بنزین به دو صورت انجام می شود. ساده ترین و محبوب ترین - این به شما امکان می دهد پمپ بنزینی را با نام ...
زمان مطالعه: 3 دقیقه افتتاح و ثبت شرکت در بلغارستان افتتاح شرکت در بلغارستان برای خرید خودرو نحوه افتتاح شرکت LLC ...
اگر می خواهید یک کسب و کار کارآفرینی را با سرمایه گذاری اندک سازماندهی کنید، این سوال که چگونه یک سالن ماساژ باز کنید کاملا منطقی است.
* محاسبات از داده های متوسط ​​برای روسیه استفاده می کند. تجارت با چین به معنای سود بالا و همکاری سودمند است. ما نکاتی را در مورد ...
در قلمرو منطقه مسکو، کشاورزی انجام می شود که هم تولید محصول و هم دامداری نشان می دهد. حدود 40 درصد ...
در اینجا می توانید بهترین تجهیزات فروش را از Unicum خریداری کنید. ما اولین تامین کننده رسمی این محصول هستیم...