Как да разрешите отварянето на модални прозорци в 1C. Защо се появява грешката „Използването на модални прозорци в този режим е забранено“? Правилно решение на проблема

В свойствата на конфигурацията на платформата 1C:Enterprise 8.3 има режим за използване на модалност. Ако стойността на това поле е „Не използвай“, тогава когато се опитате да отворите модален прозорец, платформата ще покаже съобщение „Използването на модални прозорци в този режим е забранено“. В този случай изпълнението на програмния код спира.

Тази статия показва механизма за промяна на програмния код, като използва пример за въпрос към потребителя, когато модалният режим е деактивиран.

От време на време, когато разработвате софтуерен продукт, има нужда да попитате потребителя за действията, които се извършват. Например при автоматично попълване на таблични части. Когато, преди да презаредите PM, е необходимо да попитате потребителя за необходимостта от това. И в зависимост от неговия отговор, PM ще бъде изчистен и напълнен или не.

Въпросната част от кода може да изглежда така:

Ако PM. Количество()< >0 Тогава Отговор = Въпрос(" // Този ред ще покаже модален прозорец с въпрос и изпълнението на кода ще спре, докато потребителят отговориАко отговор = DialogReturnCode. Не Тогава Върнете се ; EndIf ;// Потребителят се съгласява да продължи PM. Clear() ; EndIf ;// Извършване на допълнителни действия

// Програмата ще отиде тук, ако PM е празен или потребителят е отговорил положително на въпроса за презареждане

Извършване на допълнителни действия () ;

Когато модалният режим е деактивиран, ще възникне грешка във въпросителния ред на този код и по-нататъшното изпълнение ще бъде прекъснато. Това ще се случи, защото функцията Question използва модален прозорец.

В тази ситуация трябва да използвате процедурата ShowQuestion. Тази процедура не чака отговорът на потребителя да завърши. Но първият параметър на тази процедура е описанието на предупреждението, което се използва за проследяване на отговора на потребителя. Как ще се промени написаният преди това код:// Необходимо е да се попълнят данните за PM< >// Проверка на PM за пълнота Ако PM. Количество() 0 Тогава // PM не е празен, трябва да попитате потребителя за презареждане ShowQuestion(New DescriptionAlerts(" Презаредете TCCompletion" , Този обект, допълнителни параметри) , " // Този ред ще покаже прозорец с въпроси, но кодът няма да спре да се изпълняваВ противен случай // Програмата ще отиде тук, ако PM е празенИзвършване на допълнителни действия() ; EndIf ; // Програмата ще стигне тук във всеки случай, независимо дали PM е празен или не . . . // (освен ако, разбира се, не е имало грешка в предишния код) // Процедура за експортиране в същия модул// Извиква се, след като потребителят отговори на въпроса & В процедурата на клиента Повторно попълване на TCCompletion (Резултат от отговора, допълнителни параметри) Експортиране на резултат от отговор = Диалог за връщане на код. Не тогава// Потребителят отказа да продължи Връщане ; EndIf ; // Извършване на допълнителни действия// Програмата ще отиде тук, ако PM не е празен и потребителят е отговорил положително на въпроса за презареждане

PM. Clear() ;
Извършване на допълнителни действия() ;
Край на процедурата
По този начин, тъй като програмата няма да спре, когато се изпълни процедурата ShowQuestion, е необходимо внимателно да се обработват всички събития

При решаването на този проблем могат да се появят допълнителни действия, когато възникнат две събития:
1. Ако PM беше празен

2. Ако ЛС не е празен и потребителят е отговорил положително на въпроса, попълнете отново

И съответно, тъй като програмата не спира да чака отговора на потребителя, извикването на тези събития трябва да бъде разпределено в различни части на кода.

Следователно, като правило, всички изпълними методи, които трябва да бъдат изпълнени след проверка на PM за пълнота, се поставят в отделна процедура.

Подобен механизъм се използва за подобни функции за взаимодействие с потребителя (SelectValue, SelectFromList и др.)

Ако срещнете такава грешка, докато завършвате уроците, е много лесно да я поправите.

Върнете се в конфигуратора и изберете елемента от менюто "Конфигурация" -> "Отворете конфигурацията":

В прозореца, който се отваря, щракнете с десния бутон върху елемента „Конфигурация“ и изберете „Свойства“ от менюто, което се отваря: Ще се отвори прозорец със свойства на конфигурацията (вдясно)::

Превъртете до дъното и намерете там елемента „Режим на модалност“:Задайте стойността му на

"използване"

внимание!

Пояснения по-долу - за тези, които се интересуват от това, което направихме.

В нашата конфигурация сме активирали режим на модалност. По подразбиране този режим е деактивиран и това не ни позволява да използваме команди като EnterNumber, EnterString, EnterDate, OpenValue.

Факт е, че тези команди са модални. Извикването им води до появата на прозорец пред потребителя (например за въвеждане на информация), който блокира възможността за работа с програмата до затваряне на прозореца.

И тъй като наличието на такива прозорци е изключително нежелателно при работа с 1C през уеб браузър, при разработването на нови конфигурации режимът на модалност е изключен по подразбиране.

Можем спокойно да го включим, тъй като пишем образователни примери, които не са предназначени за работа в Интернет.

„Използването на модални прозорци в този режим е забранено“ - тази грешка сега започва да притеснява потребителите и програмистите на 1C с пристигането на новия интерфейс на платформата 1C 8.3 - „ “.

Разработчиците на технологичната платформа 1C са в крак с времето, стандартизирайки своето решение към международните стандарти за разработка на софтуер. Всички стандарти по един или друг начин се свеждат до един интерфейс, близък до уеб страниците.

Модалните и изскачащите прозорци се считат за лоша форма и отдавна са престанали да бъдат нормални при разработването на софтуер. Потребителите са свикнали да работят „в един прозорец“.

Особено често виждаме грешка в модалността в следните 1C методи:

  • въпрос;
  • Предупреждение;
  • OpenValue.

С пускането на новия интерфейс „такси“ разработчиците на платформата 1C 8 взеха правилното решение - да се опитат да преквалифицират разработчиците на приложни решения по нов начин. Те включиха функция в новата платформа - „режим на модалност“.

Бърза корекция

Ако нямате време да разберете и трябва бързо да разрешите проблема, предлагаме просто, но не съвсем правилно решение. За да коригирате бързо грешката, просто променете режима на модалност в свойствата на конфигурацията.

За да направите това, влезте в системата в режим, отворете конфигурацията:

В отворена конфигурация извикайте контекстното меню, като щракнете с десния бутон върху корена на конфигурацията и изберете „Свойства“:

Вземете безплатно 267 видео урока за 1C:

Ще се отворят свойствата на конфигурацията, където в долния колонтитул има свойството, което ни интересува - „Режим на използване на модалност“, изберете режим „Използване“:

След това запазете и приложете промените, като натиснете клавиша "F7".

Правилно решение на проблема

Правилният начин за решаване на този проблем е да се промени конфигурацията или външната обработка, за да отговарят на новите изисквания.

Предупреждението, въпросът, диалоговите прозорци и други модали трябва да бъдат пренаписани по нов начин.

Вградените оператори, които извикаха модални прозорци, трябва да бъдат заменени с дублиращи се функции.

Например:

  • Предупреждение - ShowWarning;
  • Въпрос - ShowQuestion (подробности - );
  • — Показване на входни числа.

В същото време се появи специализиран обект - Описание на известието.

Пример за замяна:

Низ = ""; Въведете низ (низ,„Въведете стойност на низ“

) Notify("Вие въведохте " + String) ;

Трябва да се замени с: Низ = ""; DescriptionAlerts = Нови описания Alerts( Въведете низ (низ,) ;

"TestLineInput"

, Този формуляр);

ShowLineInput(DescriptionAlerts, String,

В същото време добавете подобна процедура на клиента, която ще работи, когато стойността е въведена от потребителя:

&На процедурата на клиента TestInputString(ReceivedValue, PassedParameters) Export Notify("Вие въведохте " + String) ;

Край на процедурата

Формулярите, които са разработени в рамките на конфигурацията, се отварят по същия начин. Достатъчно е да замените метода “OpenFormModal” с “OpenForm”, като посочите описание на предупреждението и новата процедура, необходима за него.

За да блокирате достъпа до извиканата форма чрез отваряне на формуляр, просто посочете стойността „Блокиране на прозореца на собственика“ в свойството „Режим на отваряне на прозорец“ на формуляра:

Внедрено във версия 8.3.3.641.

Друг проблем е, че мобилните браузъри изобщо не поддържат модални прозорци. И за да може 1C:Enterprise да работи в тях, в уеб клиента беше внедрен специален механизъм. Това е доста сложен механизъм и, за съжаление, не покрива всички необходими ситуации. В резултат на това конфигурациите на iPad например са трудни за поддръжка.

В такава ситуация възможността за работа с интерфейса на 1C:Enterprise без използване на модални прозорци елиминира всички изброени по-горе проблеми.

В същото време няма изоставяне на функционалността, която преди това беше предоставена от модалните прозорци. Но тази функционалност се изпълнява от други технологии, които не пречат на работата на 1C:Enterprise в браузърите.

В новия режим на работа на интерфейса прозорецът, който преди това би бил модален, се изчертава в родителския прозорец и по същия начин блокира останалата част от интерфейса на уеб клиента:

В резултат на това:

  • не се отварят нови прозорци на браузъра, което подобрява производителността и стабилността на уеб клиента;
  • в много случаи допълнителните настройки на браузъра стават ненужни, тъй като 1C:Enterprise вече не използва изскачащи прозорци;
  • всяка конфигурация, използваща уеб клиента, може да работи на iPad и други мобилни устройства.

Естествено, чудеса не се случват и нов режим на работа не може да бъде активиран „с махване на магическа пръчка“. Необходима е промяна в логиката за работа с нови, блокиращи прозорци. Но добрата новина е, че тези промени не са трудни и е възможно да се наблюдават всички „подозрителни“ места в програмата. Платформата прилага специален механизъм, който ви позволява да проверите на етапа на разработка дали цялата конфигурация използва нови механизми и ще работи без модални прозорци.

Необходимостта от промяна на логиката на работа с такива прозорци се дължи на факта, че новият режим на работа на интерфейса осигурява модалност само за потребителя. Въпреки това, за разработчика, изпълнението на програмния код не спира, когато се покаже прозорецът за блокиране.

Това означава, че алгоритъмът, който преди беше едно цяло, сега ще трябва да бъде разделен на две части. Единият, който завършва с отварянето на блокиращ прозорец, и вторият, който ще се изпълни, когато потребителят затвори този прозорец. За да знае системата къде да продължи да изпълнява програмния код, на блокиращия прозорец се дава името на процедурата, която трябва да се изпълни, когато потребителят затвори този прозорец.

Същността на тези промени е най-лесно да се види с пример. Стара процедура, която отвори модален прозорец и обработи получените данни, може да изглежда така:

В нова версия за формата FormTextInput (което ще се отвори в блокиращ прозорец) трябва да зададете свойството Режим на отваряне на прозорец по смисъл BlockAllInterface . Това ще осигури модалност за потребителя:

И програмният код, вместо една процедура, както преди, ще съдържа две процедури:

При първата процедура отворете формата. В този случай в последния параметър му предаваме местоположението на втората процедура, която ще се изпълни, след като потребителят затвори прозореца. В този случай тази процедура се намира в същия модул, но по принцип може да се намира в друг.

Когато потребителят въведе данни и затвори формата, те ще бъдат обработени във втората процедура, която посочихме, в която просто прехвърлихме „стария“ код, който обработва получените данни.

В допълнение към формите, които разработчикът може да отвори в модален режим (по желание), има вградени езикови методи, които винаги, независимо от желанието на разработчика, отварят модални форми за въвеждане или избор на данни. Например методът Въведете стойност() .

Използването на такива методи в безмоден режим е още по-лесно. За всички подобни методи платформата има дублирани методи, като при извикването им трябва да посочите и местоположението на процедурата, която ще се изпълни, след като потребителят затвори прозореца.

Например, по-долу е показано използване на стария метод Въведете стойност() и неговия нов метод за архивиране ShowInputValue() :

Трябва да се каже, че в допълнение към изброените случаи, някои платформени механизми също използват модални прозорци за взаимодействие с потребителя. И това вече не зависи от действията на разработчика.

Следователно всички подобни системни диалогови прозорци на платформата също са прехвърлени в безмоден режим на работа.

Предвижда се постепенно да се премахне използването на модални прозорци в приложните решения. Следователно, за съвместимост с приложни решения, написани по-рано, платформата запазва възможността да работи в старата версия на интерфейса, използвайки модални прозорци.

Въвеждането на новия интерфейс на платформата 1C 8.3 - "такси" - доведе до факта, че потребителите и програмистите бяха изправени пред следната грешка: "Използването на модални прозорци в този режим е забранено."
ориз. 1

Разработчиците на технологичната платформа 1C се стремят да следват световните тенденции, като привеждат софтуера в съответствие с международните стандарти. Последното неизбежно води до единен интерфейс, близък до уеб страниците.

Модалните и изскачащи прозорци, които са признак на лош вкус, отдавна се считат за неприемливи в разработката на софтуер. Необходимостта да се работи „в един прозорец“ е твърдо вкоренена в съзнанието на потребителите.

Разработчиците на платформата 1C се опитаха да включат разработчиците на приложни решения в работата по „нов начин“. С въвеждането на новия интерфейс "такси" те добавиха нова функция към новата платформа - "modality mode".

Бърза корекция

При липса на време, ако трябва бързо да разрешите проблема, можете да прибегнете до доста просто, но не много правилно решение - просто трябва да промените режима на модалност в свойствата на конфигурацията.

За да направите това, влезте в системата в режим на конфигуратор и отворете конфигурацията:

След това, като щракнете с десния бутон върху корена на конфигурацията, отворете контекстното меню и изберете „Свойства“:


ориз. 3

В свойствата на конфигурацията, които се отварят, в разделите намерете „Режим на използване на модалност“, в него изберете „Използване“:


ориз. 4

Запазете и приложете промените си, като натиснете клавиша "F7".