اینترنت پنجره ها اندروید
بسط دادن

نحوه حذف ویندوز مودال در 1s. چرا خطای "استفاده از پنجره های مودال در این حالت ممنوع است" رخ می دهد؟ رفع سریع مشکل

14
برای وادار کردن شرکت به شروع در یک برنامه عادی یا مدیریت شده، از کلیدهای زیر استفاده می شود: / RunModeOrdinaryApplication با وجود تنظیمات پیکربندی و ... کلاینت ضخیم را در حالت عادی راه اندازی می کند. 3
لازم است که کاربران نتوانند رابط پیکربندی شده برای آنها را تغییر دهند! راه حل: برای غیرفعال کردن آن، باید «ذخیره داده‌های کاربر» را در حق دسترسی عنصر پیکربندی ریشه حذف کنید. ... 2
در کار فعلی، کاربر معمولا چندین شی را باز می کند. این می تواند یک سند، کتاب مرجع، گزارش و غیره باشد. در رابط قبلی مشکلی برای یافتن سریع یک شی باز و به روز رسانی آن برای ... 2
در آخرین مقاله: نصب یک طبقه‌بندی کننده آدرس (KLADR) در 1C، به شما گفتم Kladr چیست و چگونه آن را در فرم‌های معمولی 1C بارگذاری کنید (8.0-8.2). در این مقاله به شما نشان می دهم که چگونه طبقه بندی کننده آدرس (KLADR) را در ... 2
اغلب هنگام ایجاد یک پیکربندی خاص، کاربران می‌خواهند عکس‌ها را به یک آیتم فهرست پیوست کنند و در پایگاه داده ذخیره کنند. در این مقاله به شما خواهم گفت که چگونه آبجکت های ساختمانی را به کتاب مرجع متصل کنید ...

معرفی یک رابط جدید از پلت فرم 1C 8.3 - "تاکسی" - منجر به این واقعیت شد که کاربران و برنامه نویسان با خطای محتوای زیر مواجه شدند: پنجره های مدال v این حالتممنوع».
برنج. یکی

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

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

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

رفع سریع مشکل

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

برای این منظور، در حالت پیکربندی به سیستم بروید، پیکربندی را باز کنید:

پس از آن، روی ریشه تنظیمات کلیک راست کنید تا باز شود منوی زمینه، "Properties" را انتخاب کنید:


برنج. 3

در ویژگی های پیکربندی باز شده، در برگه ها، "Mode of use modality" را پیدا کنید، در آن "Use" را انتخاب کنید:


برنج. 4

با فشار دادن کلید "F7" تغییرات را ذخیره و اعمال کنید.

در نسخه 8.3.3.641 پیاده سازی شده است.

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

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

به عنوان یک قاعده، مرورگرهای "دسکتاپ" بهتر یا بدتر هستند، اما آنها از modals پشتیبانی می کنند و آنها را در یک پنجره مرورگر جدید به عنوان "پاپ آپ" باز می کنند:

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

مشکل دیگر این است که مرورگرهای موبایلبه هیچ وجه از مودال پشتیبانی نمی کند. و برای اینکه 1C: Enterprise بتواند در آنها کار کند، مکانیسم خاصی در کلاینت وب پیاده سازی شد. این یک مکانیسم نسبتاً پیچیده است و متأسفانه تمام شرایط لازم را پوشش نمی دهد. در نتیجه، برای مثال، پیکربندی‌های یک iPad، کار کردن با آنها دشوار است.

در چنین شرایطی، گزینه رابط 1C: Enterprise بدون استفاده از ویندوز مودال تمام مشکلات ذکر شده در بالا را برطرف می کند.

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

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

در نتیجه:

  • هیچ پنجره مرورگر جدیدی باز نمی شود، که باعث بهبود عملکرد و ثبات مشتری وب می شود.
  • در بسیاری از موارد سفارشی سازی اضافیمرورگر غیر ضروری می شود، زیرا 1C: Enterprise دیگر از پنجره های پاپ آپ استفاده نمی کند.
  • هر پیکربندی با استفاده از سرویس گیرنده وب می تواند روی iPad و سایر دستگاه های تلفن همراه کار کند.

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

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

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

ماهیت این تغییرات با یک مثال ساده تر قابل مشاهده است. یک رویه قدیمی که یک پنجره مودال را باز می‌کند و داده‌های دریافتی را پردازش می‌کند ممکن است به شکل زیر باشد:

در نسخه جدید برای فرم ورودی FormText (که در پنجره مسدود کردن باز می شود) باید ویژگی را تنظیم کنید حالت باز شدن پنجره در ارزش BlockAllInterface ... این حالت به کاربر ارائه می دهد:

و کد برنامه به جای یک رویه، مانند قبل، از قبل شامل دو رویه خواهد بود:

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

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

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

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

به عنوان مثال، در زیر استفاده از روش قدیمی را نشان می دهد مقدار را وارد کنید () و روش جدید پشتیبان گیری او ShowEnterValues ​​() :

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

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

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

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

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

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

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

اگر PM تعداد()< >0 سپس پاسخ = سوال (" // این خط یک پنجره مودال با یک سوال نمایش می دهد و اجرای کد متوقف می شود تا کاربر پاسخ دهداگر Answer = DialogReturnCode. خیر سپس بازپرداخت EndIf // کاربر با ادامه موافقت کرد PM پاک کردن (); EndIf // اقدامات بعدی را انجام دهید // اگر PM خالی باشد یا کاربر به سوال در مورد پر کردن بیش از حد پاسخ مثبت دهد، برنامه به اینجا می رسدانجام اقدامات بعدی ();

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

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

نحوه تغییر کد نوشته شده قبلی:

// پر کردن PM با داده ضروری است // PM را برای پر بودن بررسی کنیداگر PM تعداد()< >0 سپس // PM خالی نیست، باید از کاربر در مورد سرریز بپرسید ShowQuestion (توضیحات هشدار جدید (" OverflowPTCompletion"، ThisObject، AdditionalParameters)،" PM بیش از حد پر خواهد شد. ادامه هید ؟"، DialogueModeQuestion. بله خیر); // این خط پنجره ای با یک سوال نمایش می دهد، اما اجرای کد متوقف نمی شوددر غیر این صورت // اگر PM خالی بود برنامه به اینجا می رسد PerformFurtherActions (); EndIf // برنامه در هر صورت به اینجا می رسد، چه PM خالی باشد چه نباشد // (البته اگر در کد قبلی خطایی وجود نداشته باشد) . . . // رویه صادرات در همان ماژول // پس از پاسخ کاربر به سوال تماس گرفته می شود& OnClient Procedure OverflowPTCompletion (ResponseResult، AdditionalParameters) Export If ResponseResult = DialogReturnCode. پس نه // کاربر از ادامه دادن خودداری کردبرگشت ؛ EndIf // اقدامات بعدی را انجام دهید // اگر PM خالی نبود و کاربر به سوال پر کردن بیش از حد پاسخ مثبت داد، برنامه به اینجا می رسد. PM پاک کردن (); PerformFurtherActions (); پایان رویه

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

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

مکانیزم مشابهی برای توابع تعامل کاربر مشابه (SelectValue، SelectFrom List و غیره) استفاده می شود.

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

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

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

به خصوص اغلب ما یک خطای مدالیته را در آن می بینیم روش های زیر 1C:

  • سوال؛
  • هشدار؛
  • OpenValue.

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

رفع سریع مشکل

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

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

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

267 آموزش تصویری 1C را به صورت رایگان دریافت کنید:

ویژگی های پیکربندی باز می شود، جایی که در زیرزمین یک ویژگی مورد علاقه ما وجود دارد - "Modality use mode"، حالت "Use" را انتخاب کنید:

پس از آن، با فشار دادن کلید "F7" تغییرات را ذخیره و اعمال کنید.

راه حل صحیح مشکل

راه صحیح برای حل این مشکل تغییر تنظیمات یا پردازش خارجیبرای نیازهای جدید

هشدار، سوال، جعبه های محاوره ایو سایر مدال ها - همه اینها باید به روشی جدید بازنویسی شود.

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

برای مثال:

  • هشدار - نمایش هشدار;
  • سوال - نمایش سوال (به تفصیل -);
  • - نمایش اعداد ورودی

در همان زمان، یک شی تخصصی ظاهر شد - توضیحات اعلان.

مثال جایگزینی:

رشته = ""; IntroduceString (رشته، "مقدار رشته را وارد کنید") گزارش ("شما وارد کردید" + رشته)؛

باید با:

رشته = ""; توضیحات هشدار = توضیحات هشدار جدید ( "TestInputString"، ThisForm)؛ ShowInputString (توضیحات هشدار، رشته، "مقدار رشته را وارد کنید") ;

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

& OnClient Procedure TestInputString (ReceivedValue، PassedParameters) گزارش صادرات ("شما وارد کردید" + رشته); پایان رویه

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

برای بستن دسترسی به فرم فراخوانی شده توسط فرم باز، کافی است در ویژگی "WindowOpening Mode" مقدار "Lock مالک پنجره" را در ویژگی form مشخص کنید: