1с использование модальных окон запрещено. Почему возникает ошибка "Использование модальных окон в данном режиме запрещено"? Быстрое исправление проблемы

В платформе 1С версии 8.3 появился новый режим работы программы - без использования модальности. Точнее новых режимов появилось 2: без использования модальности и использовать модальность, но с предупреждением. А старый режим работы обозначен как использовать модальность.

Что это все значит? В ранних версиях платформы мы использовали различные модальные окошки и особо не задумывались об этом. Например, надо вывести предупреждение пользователю или надо задать вопрос или ввести какое-то значение или выбрать файл. Все это модальные окошки.

Что значит модальные? Это значит, что при вызове данного окна оно перекрывает собой все другие окна, то есть выводится на самый верх и блокирует работу с другими окнами до завершения работы с этим окном. Кроме блокировки окон останавливается выполнение кода ровно на том месте, где происходит вызов этого окна и продолжение выполнения кода осуществляется только после закрытия такого окна. С того места, где выполнение остановилось. Проиллюстрирую вызов модального окна на примере вызова формы выбора периода:

&НаКлиенте

СтандартнаяОбработка = Ложь;




Если Диалог.Редактировать() Тогда //Вызов модальной формы. Продолжение выполнения кода произойдет только после закрытия формы.
Элементы.Услуги.ТекущиеДанные.ДатаНачала = Диалог.Период.ДатаНачала;
Элементы.Услуги.ТекущиеДанные.ДатаОкончания = Диалог.Период.ДатаОкончания;
КонецЕсли;

КонецПроцедуры


Как мы видим для обработки вызова модального окна выбора периода достаточно одной процедуры.

Почему модальные окна это плохо? Теперь разберемся, почему фирма 1С решила отказаться от использования модальных окон. Ну прежде всего это следствие того, что платформа 1С может использоваться не только в обычном виде - в виде десктоп приложения, но и может запускаться в браузере и может запускаться в виде мобильного приложения.

С браузерами проблема следующая. Модальность окон в них реализуется с помощью всплывающих отдельных окон браузера. Они практически всеми браузерами поддерживаются, но из-за частого использования таких окон для рекламы, практически все разработчики браузеров с ними борются и по умолчанию отключают возможность использования таких окон. Как следствие чтобы обеспечить возможность работы пользователя 1с в браузере приходится заставлять его разрешать эти окна, посвящать во все тонкости работы 1с и браузеров и вообще перегружать ненужной информацией.

Отдельный нюанс с браузерами для планшетных компьютеров и браузерами для телефонов. В большинстве случаев такие браузеры не поддерживают всплывающие окна. Не совместимы интерфейсы (мониторы и устройства ввода) таких устройств с всплывающими окнами.

Ну и наконец мобильное приложение 1С тоже не совсем сдружилось с модальными окнами.

Отсюда вывод: модальные окна не использовать. А что использовать вместо них? Вместо них нужно использовать те же самые окна, но без режима модальности. В новой платформе 1С так же разработала для каждого окна такой режим. Он реализуется в виде отдельного метода для каждого диалога. Такой режим позволяет вызвать окно, но не останавливать выполнение программного кода. Технически в браузерах это реализуется в виде псевдо окна, появляющегося внутри родительского окна, но перекрывающего его. То что код продолжает выполняться после открытия окна означает, что вы не сможете сразу за кодом вызова окна получать выбранные в нем значения. Они же еще не выбраны. Поэтому получение и обработка этих значений осуществляется в отдельной процедуре, которая вызывается при закрытии такого окна и указывается эта процедура при вызове метода открытия окна. Разберем на примере все того же окна выбора периода.

&НаКлиенте
Процедура УслугиДатаНачалаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Диалог = Новый ДиалогРедактированияСтандартногоПериода();
СтандартныйПериод = Новый СтандартныйПериод();

ДатаНачала = Элементы.Услуги.ТекущиеДанные.ДатаНачала;
ДатаОкончания = Элементы.Услуги.ТекущиеДанные.ДатаОкончания;

СтандартныйПериод.ДатаНачала = ДатаНачала;
СтандартныйПериод.ДатаОкончания = ДатаОкончания;
Диалог.Период = СтандартныйПериод;

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаВыбораПериода",ЭтаФорма);

Диалог.Показать(ОписаниеОповещения)

КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбораПериода(Период,Параметры) Экспорт

Если Период <> Неопределено Тогда

Элементы.Услуги.ТекущиеДанные.ДатаНачала = Период.ДатаНачала;
Элементы.Услуги.ТекущиеДанные.ДатаОкончания = Период.ДатаОкончания;

КонецЕсли;

КонецПроцедуры


Как мы видим вместо Редактировать() вызывается Показать(). И обработка события выбора уже в другой процедуре.

Итак, как обходится без модальности мы разобрались. Теперь разберемся для чего нужен режим использования модальности с предупреждением. По сути это такой переходный режим. Когда вы еще не успели переделать всю свою конфигурацию на режим без использования модальности, но уже стремитесь к этому. И при каждом вызове модального окна программа будет выдавать вам предупреждение, что в данном режиме нежелательно вызывать модальные окна.

Ну что ж отказываемся от модальности и осваиваем новые технологии для 1С работы в браузерах и мобильных компьютерах.

Диалоговые окна, к которым мы вполне привыкли при работе со всевозможными системами и, в частности, в 1С, могут появляться при выполнении разнообразных действий, требуют от пользователя ввода каких-либо данных, например, определенного значения, выбора файла, ответа на вопрос, или просто выдают предупреждение. Они также называются модальными.

Без ответа на запрос такого окна продолжать работу в программе невозможно. Окно блокирует интерфейс, перекрывает работу других окон, и при этом исполнение кодов программы тоже застопорится на том месте, где произошел вызов диалога – программа ждет завершения действия с ним.

Диалоги, обычно, не вызывают проблем в режиме запуска тонкого и толстого клиента, но проблемы могут возникнуть при работе с веб-клиентом. Это связано с тем, что такие же системные элементы в Интернете используются как рекламные носители, и зачастую в настройках браузера пользователи показ их отключают. Соответственно, их работа блокируется и в программе, работающей через веб-браузер. Поэтому работая с 1С через веб-клиент или на мобильной платформе, надо не забывать выполнять дополнительную настройку браузера и помнить, что мобильный браузер вообще не поддерживает всплывающие сообщения.

Как устранить ошибку в 1С: «Использование модальных окон в данном режиме запрещено»

Такая ошибка начала появляться после перехода 1С на новый интерфейс платформы 1С 8.3 – «Такси». Это связано с тем, что в ней разработчиками была включена работа с окнами, но без режима модальности.

Рис.1

Откроем информационную базу в режиме «Конфигуратор» и посмотрим свойства нашей конфигурации, нажав правой кнопкой мышки и выбрав команду «Свойства». Прокрутив линейку ниже, мы видим раздел «Совместимость», где находится интересующий нас параметр режима и перечислены варианты – «Использовать/Использовать с предупреждением/Не использовать».



Рис.2

После этого необходимо сохранить и обновить изменения в конфигурации. Ошибка, о которой мы говорим, появляется, когда стоит отметка о том, чтобы не использовать режим модальности. Такая возможность появилась, начиная с платформы 8.3.3.721, вышедшей в сентябре 2013 года. То есть, пользователям, работающим на более старых версиях платформы, нет необходимости в отказе от модальности. В других версиях, чтобы окно с ошибкой не появлялось, можно установить просто – «Использовать».

В нашем примере установлена возможность предупреждения. Конечно, в будущем разработчики доработаю конфигурацию для использования других функций в обход модальных окон. Но на сегодняшний день режим из нашего примера как раз и используется разработчиком при переходе, когда не вся конфигурация еще переделана на безмодальный режим. Поэтому программа также будет выдавать сообщения о запрете окон с модальными характеристиками.



Рис.3

Приложения, которые используются через веб-клиент, на iPad, в облаке, например, на «1cfresh.com», не используют этот режим. Во всех новых конфигурациях используется безмодальный режим работы интерфейса.

Отказ от модальности

Разработчики программы 1С, поддерживая общемировые тенденции, стараются приблизить интерфейс программ к веб-образцам и привести его к единому стандарту, давая тем самым возможность пользователям работать в одном окне с привычном «внешником».

Поэтому (и чтобы снять проблемы, описанные выше) было принято решение о ликвидации всплывающих диалогов без ограничения функциональности решений. При этом сообщения в новом режиме работы программы появляются в пределах родительского окна, а не как раньше – в модальном. Хотя оно по-прежнему блокирует весь интерфейс.

То есть нововведение избавляет нас от необходимости допнастройки браузера, стабилизирует веб-клиент и повышает его производительность. Также, поскольку теперь нет необходимости открывать всплывающие окна, любую конфигурацию с такими изменениями можно использовать на любом устройстве.

В свойствах конфигурации на платформе 1С:Предприятие 8.3 есть Режим использования модальности. Если значение этого поля "Не использовать", то при попытке открыть модальное окно платформа выдаст сообщение "Использование модальных окон в данном режиме запрещено". При этом выполнение программного кода прекращается.

В данной статья показан механизм изменения программного кода, на примере вопроса пользователю, при отключенном модальном режиме.

Периодически, при разработке программного продукта, возникает потребность спросить пользователя о выполняемых дейтсвиях. К примеру, при автоматическом заполнении табличных частей. Когда перед перезаполнением ТЧ необходимо спросить пользователя о необходимости это сделать. И в зависимости от его ответа ТЧ будет очищена и перезаполнена, или нет.

Часть кода с вопросом может выглядеть примерно так:

Если ТЧ. Количество() < > 0 Тогда Ответ = Вопрос(" // В этой строке произойдет вывод модального окна с вопросом и выполнение кода остановится до ответа пользователя Если Ответ = КодВозвратаДиалога. Нет Тогда Возврат ; КонецЕсли ; // Пользователь согласился продолжить ТЧ. Очистить() ; КонецЕсли ; // Выполнение дальнейших действия // Сюда программа попадет если ТЧ была пустая или пользователь положительно ответил на вопрос о перезаполнении ВыполнениеДальнейшихДействий() ;

При отключенном модальном режиме в строке с вопросом этого кода произойдет ошибка и дальнейшее выполнение прервется. Это произойдет потому, что функция Вопрос использует модальное окно.

В этой ситуации необходимо пользоваться процедура ПоказатьВопрос. При использовании данной процедуры не ожидается завершение ответа пользователя. Но первым параметром данной процедуры является описание оповещения, с помощью которого отслеживается ответ пользователя.

Как изменится раннее написанный код:

// Необходимо заполнить ТЧ данными // Проверка ТЧ на заполненность Если ТЧ. Количество() < > 0 Тогда // ТЧ не пустая, необходимо спросить пользователя о перезаполнении ПоказатьВопрос(Новый ОписаниеОповещения(" ПерезаполнениеТЧЗавершение " , ЭтотОбъект, ДополнительныеПараметры) , " ТЧ будет перезаполнена. Продолжить ? " , РежимДиалогаВопрос. ДаНет) ; // В этой строке произойдет вывод окна с вопросом, но выполнение кода не остановится Иначе // Сюда программа попадет если ТЧ была пустой ВыполнитьДальнейшиеДействия() ; КонецЕсли ; // Сюда программа попадет в любом случае, была ТЧ пустая или нет // (если, конечно, не произошло ошибки в предыдущем коде) . . . // Экспортная процедура в том же модуле // Вызывается после ответа пользователя на вопрос & НаКлиенте Процедура ПерезаполнениеТЧЗавершение(РезультатОтвета, ДополниетельныеПараметры) Экспорт Если РезультатОтвета = КодВозвратаДиалога. Нет Тогда // Пользователь отказался от продолжения Возврат ; КонецЕсли ; // Выполнение дальнейших дейтсвий // Сюда программа попадет если ТЧ была не пустая и пользователь положительно ответил на вопрос о перезаполнении ТЧ. Очистить() ; ВыполнитьДальнейшиеДействия() ; КонецПроцедуры

Таким образом, так как программа не остановится при выполнении процедуры ПоказатьВопрос, необходимо аккуратно обработать все события
При решении данной задачи выполнение дальнейших действий может произойти при двух событиях:
1. Если ТЧ была пустой
2. Если ТЧ была не пустой и положительном ответе пользователя на вопрос перезаполнении

И, соответственно, так как программа не останавливается в ожидании ответа пользователя, то и вызов этих событий приходится разносить в разные части кода.
Поэтому, как правило, все выполняесые методы, которые необходимо выполнить после проверки ТЧ на заполненность, помещают в отдельную процедуру.

Подобный механизм используется при подобных функциях взаимодействия с пользователем (ВыборЗначения, ВыбратьИзСписка и т.п.)

Внедрение нового интерфейса платформы 1С 8.3 — "такси" — привело к тому, что пользователи и программисты столкнулись с ошибкой следующего содержания: "Использование модальных окон в данном режиме запрещено".
Рис. 1

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

Модальные и всплывающие окна, будучи признаком дурного тона, уже давно были признаны недопустимыми при разработке софта. В сознании пользователей твердо укоренилась потребность работы "в одном окне".

Разработчики платформы 1С предприняли попытку приобщить разработчиков прикладных решений к работе "по-новому". С внедрением нового интерфейса "такси", они дополнили новую платформу новой функцией — "режим использование модальности".

Быстрое исправление проблемы

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

С этой целью зайдите в систему в режим конфигуратор, откройте конфигурацию:

После этого нажатием на корень конфигурации правой кнопкой мыши откройте контекстное меню, выберите "Свойства":


Рис. 3

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


Рис. 4

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

Если в процессе выполнения уроков у вас появилась такая ошибка - исправить её очень легко.

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

В открывшемся окне нажмите правой кнопкой на пункте "Конфигурация" и выберите из раскрывшегося меню пункт "Свойства":

Откроется окно со свойствами конфигурации (справа):

Пролистайте его в самый низ и найдите там пункт "Режим использования модальности":

Установите его значение в "Использовать" :

Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле "Режим использования синхронных вызовов...". Его также нужно установить в "Использовать".

Наконец, выберите пункт меню "Конфигурация" -> "Сохранить конфигурацию":

Готово! Теперь ошибки больше не возникнет.

Пояснения ниже - для тех кому интересно, что мы сделали.

Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.

Дело в том, что эти команды относятся к модальным. Их вызов приводит к тому, что перед пользователем появляется окно (например, для ввода информации), которое блокирует возможность работы с программой, пока окно не закроется.

А так как наличие таких окон крайне нежелательно при работе с 1С через веб-браузер, то при разработке новых конфигураций режим модальности по умолчанию выключен.

Мы же можем смело включать его, так как пишем учебные примеры, не рассчитанные на работу в интернете.

Статьи по теме: